python人工智能之:多边形矩阵热图程序实战篇(二)

前言

这是一个多边形组件热图程序,跟上一节的六边形组件类似,用于计算出整个通道内的数据的最大、最小值,主要用到的知识matplotlib、Numpy、Pandas,也就是python中的科学计算、数据分析以及可视化绘图库。

多边形组件热图
下面是这个程序运行效果图:
在这里插入图片描述
在这里插入图片描述
源代码如下:

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon,Circle
from matplotlib.collections import PatchCollection
import pandas as pd
import numpy as np
from numpy import *

def drawLIUBIANXING3( AsseNum, Pow, Dis):
    
    #数组类型转换
    AsseNum = AsseNum.astype(int)
    Dis     = Dis.astype(int)
    #数组长度
    leny=len(Dis[:,0])
    lenx=len(Dis[0,:])
    num =len(Pow)
    
    #计算Pow数组最大、最小值
    maxi=max(Pow)
    minu=min(Pow)

    
    
    rang=maxi-minu
    
    print("目前物理量最大值为:",maxi)
    redline=maxi
    if np.isnan(redline):
        redline=maxi-rang*0.25
        
    print("目前物理量最小值为:",minu)  
    blueline=minu   #input('请输入蓝线值:')
    if np.isnan(blueline):
        blueline=minu+rang*0.25
    
    limit=minu  #input('请设定数据显示下限:')
    if np.isnan(limit):
        limit=redline
    #变量赋值  
    greenline=(redline+blueline)/2
    yellowline=(redline+greenline)/2
    cyanline=(greenline+blueline)/2

    xstep=0.198/2
    ystep=0.198/2*1.732
    
    
    patches = []
    colorm  = []
    #创建画布
    fig,ax = plt.subplots(figsize=(10,9))
    #绘图
    for i in range(leny):  
        for j in range(lenx): 
            #数组下标减1
            AsseNum[i,j] -= 1
            if Dis[i,j]==4:
                x0=(j-(lenx+1)/2)*xstep
                y0=(i-(leny+1)/2)*ystep
                x=[x0-xstep,x0,x0+xstep,x0+xstep,x0,x0-xstep]
                y=[y0+xstep/1.732,y0+ystep/1.5,y0+xstep/1.732,y0-xstep/1.732,y0-ystep/1.5,y0-xstep/1.732]        
                #patch(x,y,[0.8,0.8,0.8])
                dot = np.transpose(np.vstack((x,y)))              
                patches.append( Polygon(dot,True))
                colorm.append(([0.8,0.8,0.8]))
                #填入数据,设置属性
                plt.text(x0,y0,'C',fontsize=8,horizontalalignment='center')     
                
            elif Dis[i,j]==5:
                x0=(j-(lenx+1)/2)*xstep
                y0=(i-(leny+1)/2)*ystep
                x=[x0-xstep,x0,x0+xstep,x0+xstep,x0,x0-xstep]
                y=[y0+xstep/1.732,y0+ystep/1.5,y0+xstep/1.732,y0-xstep/1.732,y0-ystep/1.5,y0-xstep/1.732] 
                dot = np.transpose(np.vstack((x,y)))              
                patches.append( Polygon(dot,True))
                colorm.append(([1,1,1]))
                #填入数据,设置属性
                plt.text(x0,y0,'S',fontsize=8,horizontalalignment='center',color='red') 
                
            elif AsseNum[i,j]>=0 and Pow[AsseNum[i,j]]>=0:
                x0=(j-(lenx+1)/2)*xstep
                y0=(i-(leny+1)/2)*ystep
                x=[x0-xstep,x0,x0+xstep,x0+xstep,x0,x0-xstep]
                y=[y0+xstep/1.732,y0+ystep/1.5,y0+xstep/1.732,y0-xstep/1.732,y0-ystep/1.5,y0-xstep/1.732]
                dot = np.transpose(np.vstack((x,y)))  
                patches.append( Polygon(dot,True))
                
                if Pow[AsseNum[i,j]]>=redline:
                    colorm.append(([1,0,0]))
                elif Pow[AsseNum[i,j]]>=yellowline and Pow[AsseNum[i,j]]<=redline:
                    #patch(x,y,[1,(redline-Pow(AsseNum[i,j],1))/(redline-yellowline),0])
                    colorm.append(([1,(redline-Pow[AsseNum[i,j]])/(redline-yellowline),0]))
                elif Pow[AsseNum[i,j]]>=greenline and Pow[AsseNum[i,j]]<=yellowline:
                    #patch(x,y,[(Pow(AsseNum[i,j],1)-greenline)/(yellowline-greenline),1,0])
                    colorm.append(([(Pow[AsseNum[i,j]]-greenline)/(yellowline-greenline),1,0]))
                elif Pow[AsseNum[i,j]]>=cyanline and Pow[AsseNum[i,j]]<=greenline:
                    #patch(x,y,[0,1,(greenline-Pow(AsseNum[i,j],1))/(greenline-cyanline)])
                    colorm.append(([0,1,(greenline-Pow[AsseNum[i,j]])/(greenline-cyanline)]))
                elif Pow[AsseNum[i,j]]>=blueline and Pow[AsseNum[i,j]]<=cyanline:
                    #patch(x,y,[0,(Pow(AsseNum[i,j],1)-blueline)/(cyanline-blueline),1])
                    colorm.append(([0,(Pow[AsseNum[i,j]]-blueline)/(cyanline-blueline),1]))
                elif Pow[AsseNum[i,j]]<=blueline:
                    #patch(x,y,[0,0,1])
                    colorm.append(([0,0,1]))
                if Pow[AsseNum[i,j]]>=limit:
                    #填入数据,设置属性
                    plt.text(x0,y0,str(Pow[AsseNum[i,j]]),fontsize=7,horizontalalignment='center') 
    #设置颜色,渲染到画布        
    collection   =  PatchCollection(patches,alpha=1)
    collection.set_facecolor(colorm)
    collection.set_edgecolor('black')
    ax.add_collection(collection)
    plt.autoscale(enable=True, axis='y')
    plt.autoscale(enable=True, axis='x')
    #显示图形
    plt.savefig('glp.png',dpi=300)
    plt.show()
            
    return

if __name__ == "__main__":
    #数据导入
    AsseNum  = np.loadtxt('assenum.txt')
    Pow  = np.loadtxt('Pow.txt')
    Dis  = np.loadtxt('Dis.txt')
    drawLIUBIANXING3( AsseNum, Pow, Dis)```

发布了38 篇原创文章 · 获赞 10 · 访问量 7207

猜你喜欢

转载自blog.csdn.net/chenxuezhong0413/article/details/83624270