前言
这是一个多边形组件热图程序,跟上一节的六边形组件类似,用于计算出整个通道内的数据的最大、最小值,主要用到的知识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)```