python人工智能之:六边形矩阵热图程序实战篇(一)
前言
这是一个六边形组件热图程序,大概花了我将近一个多月的时间才完成的,主要用到的知识有matplotlib、Numpy、Pandas,也就是python中的科学计算、数据分析以及可视化绘图库。
六边形组件热图
下面是这个程序运行效果图:
六边形热图实现
废话不说了,直接上代码。。。
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 21 14:32:47 2018
六边形图形绘制
@author: Jayboy_CXZ
"""
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def drawLIUBIANXING( Subcvalue, fueltsval,mr=8 ,d=0.01, p=0.014,h=0.185):
#数组转换
lensc=np.ravel(Subcvalue)
#六边形组件
subcnum = np.zeros((2*mr,4*mr)).astype(int)
fuelnum = np.zeros((2*mr-1,2*mr-1)).astype(int) #矩形矩阵
fuelrxy = np.zeros((2*mr-1,2*mr-1,2))
#fuelrxy = arange((2*mr-1)*(2*mr-1)*2).reshape(2*mr-1,2*mr-1,2).astype(double) #中心坐标
subcornum = np.zeros(6,int) #角通道单独
scnum=6*(1+mr*(-1+mr))
tysc=np.zeros(scnum).astype(int)
cont=mr
m=mr-1
flnumcont=0
fuelnxy = np.zeros((3*mr*(mr-1)+1,2))
for i in range(2*mr-1):
for j in range(cont):
flnumcont += 1
fuelnum[i,j]=flnumcont
fuelrxy[i,j,1]=1.732/2*p*(m-i)
if i+1<mr:
for j in range(cont):
fuelrxy[i,j,0]=(-m/2.0-(i+1)/2.0+(j+1)-0.5)*p
fuelnxy[fuelnum[i,j]-1,0:2]=fuelrxy[i,j,0:2]
cont=cont+1
else:
for j in range(cont):
fuelrxy[i,j,0]=(-1.5*m+(i+1)/2.0+(j+1)-1.5)*p
fuelnxy[fuelnum[i,j]-1,0:2]=fuelrxy[i,j,0:2]
cont=cont-1
print ("燃料棒数为:",flnumcont)
scnumcont=scnum-6
for j in range(6):
scnumcont=scnumcont+1
subcornum[j]=scnumcont
tysc[scnumcont-1]=3
contourcexy=np.zeros((scnum,2,4)) #边角为4,内为3
contourcexy[subcornum[0]-1,0:2,0]=fuelrxy[0,0,0:2]
contourcexy[subcornum[0]-1,0,2]=-h/1.732
contourcexy[subcornum[0]-1,1,2]=h
contourcexy[subcornum[0]-1,0,1]=fuelrxy[0,0,0]
contourcexy[subcornum[0]-1,1,1]=h
deltx=fuelrxy[0,0,0]+h/1.732
contourcexy[subcornum[0]-1,0,3]=-h/1.732-deltx/2
contourcexy[subcornum[0]-1,1,3]=h-deltx/2*1.732
contourcexy[subcornum[2]-1,0:2,3]=fuelrxy[mr-1,0,0:2]
contourcexy[subcornum[2]-1,0,1]=-h*2/1.732
contourcexy[subcornum[2]-1,1,1]=0.0
contourcexy[subcornum[2]-1,0,0]=-h*2/1.732+deltx/2
contourcexy[subcornum[2]-1,0,2]=-h*2/1.732+deltx/2
contourcexy[subcornum[2]-1,1,0]=deltx/2*1.732
contourcexy[subcornum[2]-1,1,2]=-deltx/2*1.732
contourcexy[subcornum[1]-1,0,0:4]=-contourcexy[subcornum[0]-1,0,0:4]
contourcexy[subcornum[1]-1,1,0:4]= contourcexy[subcornum[0]-1,1,0:4]
contourcexy[subcornum[3]-1,0,0:4]=-contourcexy[subcornum[2]-1,0,0:4]
contourcexy[subcornum[3]-1,1,0:4]= contourcexy[subcornum[2]-1,1,0:4]
contourcexy[subcornum[4]-1,0,0:4]= contourcexy[subcornum[0]-1,0,0:4]
contourcexy[subcornum[4]-1,1,0:4]=-contourcexy[subcornum[0]-1,1,0:4]
contourcexy[subcornum[5]-1,0,0:4]=-contourcexy[subcornum[0]-1,0,0:4]
contourcexy[subcornum[5]-1,1,0:4]=-contourcexy[subcornum[0]-1,1,0:4]
#组件盒边上节点
edgepoitleftup=np.zeros((mr,2))
#print(edgepoitleftup)
edgepoitleftup[(mr-1),0:2]=contourcexy[subcornum[2]-1,0:2,0]
for i in range((mr-1))[::-1]:
edgepoitleftup[i,0:2]=edgepoitleftup[i+1,0:2]+[p/2,p/2*1.732]
cont=2*mr+1
scnumcont=0
for i in range(1,mr): #先不遍上下两个边通道层
scnumcont=scnumcont+1
subcnum[i,0]=scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,0,0:2]
contourcexy[scnumcont-1,0:2,3]=fuelrxy[i-0,0,0:2]
contourcexy[scnumcont-1,0:2,1]=edgepoitleftup[i-1,0:2]
contourcexy[scnumcont-1,0:2,2]=edgepoitleftup[i-0,0:2]
for j in range(1,cont-1):
scnumcont=scnumcont+1
subcnum[i,j]=scnumcont
tysc[scnumcont-1]=1
if (j+1)%2==1:
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,int((j+1+1)/2-2),0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i-1,int((j+1+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,2]=fuelrxy[i-0,int((j+1+1)/2-1),0:2]
else:
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,int((j+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i ,int((j+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,2]=fuelrxy[i ,int((j+1)/2 ),0:2]
scnumcont=scnumcont+1
subcnum[i,cont-1]=scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,mr+i-2,0:2]
contourcexy[scnumcont-1,0:2,3]=fuelrxy[i-0,mr+i-1,0:2]
contourcexy[scnumcont-1,0,1:3]=-edgepoitleftup[i-1:i+1,0]
contourcexy[scnumcont-1,1,1:3]= edgepoitleftup[i-1:i+1,1]
cont=cont+2
for i in range(mr,2*mr-1):
cont=cont-2
ir=2*mr-(i+1)+1-1
scnumcont=scnumcont+1
subcnum[i,0] =scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,0,0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i-0,0,0:2]
contourcexy[scnumcont-1,0,2:4]= edgepoitleftup[ir-1:ir+1,0]
contourcexy[scnumcont-1,1,2:4]=-edgepoitleftup[ir-1:ir+1,1]
for j in range(1,cont-1):
scnumcont=scnumcont+1
subcnum[i,j]=scnumcont
tysc[scnumcont-1]=1
if (j+1)%2==1:
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,int((j+1+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i ,int((j+1+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,2]=fuelrxy[i ,int((j+1+1)/2-2),0:2]
else:
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,int((j+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i ,int((j+1)/2-1),0:2]
contourcexy[scnumcont-1,0:2,2]=fuelrxy[i-1,int((j+1)/2+0),0:2]
scnumcont=scnumcont+1
subcnum[i,cont-1]=scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[i-1,mr+ir-1,0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[i ,mr+ir-2,0:2]
contourcexy[scnumcont-1,0,2:4]=-edgepoitleftup[ir-1:ir+1,0]
contourcexy[scnumcont-1,1,2:4]=-edgepoitleftup[ir-1:ir+1,1]
for j in range(mr-1):
scnumcont=scnumcont+1
subcnum[1,j]=scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[0,j ,0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[0,j+1,0:2]
contourcexy[scnumcont-1,0:2,3]=array([fuelrxy[0,j ,0],fuelrxy[0,j ,1]])+array([0,deltx*1.732])
contourcexy[scnumcont-1,0:2,2]=array([fuelrxy[0,j+1,0],fuelrxy[0,j+1,1]])+array([0,deltx*1.732])
scnumcont=scnumcont+1
subcnum[2*mr-1,j]=scnumcont
tysc[scnumcont-1]=2
contourcexy[scnumcont-1,0:2,0]=fuelrxy[2*mr-2,j ,0:2]
contourcexy[scnumcont-1,0:2,1]=fuelrxy[2*mr-2,j+1,0:2]
contourcexy[scnumcont-1,0:2,3]=array([fuelrxy[2*mr-2,j ,0],fuelrxy[2*mr-2,j ,1]])+array([0,-deltx*1.732])
contourcexy[scnumcont-1,0:2,2]=array([fuelrxy[2*mr-2,j+1,0],fuelrxy[2*mr-2,j+1,1]])+array([0,-deltx*1.732])
scnumcont=scnumcont+6
print('子通道数为:',str(scnumcont))
maxi=np.max(Subcvalue)
minu=np.min(Subcvalue)
rang=maxi-minu
print('目前物理量最大值为:')
print(maxi)
redline=maxi
if np.isnan(redline):
redline=maxi-rang*0.25
print('目前物理量最小值为:')
print(minu)
blueline=minu
if np.isnan(blueline):
blueline=minu+rang*0.25
#变量赋值
greenline =(redline+blueline)/2
yellowline=(redline+greenline)/2
cyanline =(greenline+blueline)/2
patches = []
colorm = []
#创建画布
fig,ax = plt.subplots(figsize=(10,9))
for i in range(scnumcont):
if(tysc[i]==2 or tysc[i]==3):
x=contourcexy[i,0,0:4]
y=contourcexy[i,1,0:4]
else:
x=contourcexy[i,0,0:3]
y=contourcexy[i,1,0:3]
dot = np.transpose(np.vstack((x,y)))
patches.append( Polygon(dot,True))
#patches.append( Polygon(dot,True ))
#算法部分
if(Subcvalue[i]>=redline):
#colorm.append(np.array([1,0,0]) )
colorm.append(([1,0,0]))
elif ((Subcvalue[i]>=yellowline) and( Subcvalue[i]<=redline)):
#colorm.append(np.array([1,(redline-Subcvalue[i])/(redline-yellowline),0]) )
colorm.append(([1,(redline-Subcvalue[i])/(redline-yellowline),0]))
elif ((Subcvalue[i]>=greenline) and (Subcvalue[i]<=yellowline)):
#colorm.append(np.array([(Subcvalue[i]-greenline)/(yellowline-greenline),1,0]) )
colorm.append(([(Subcvalue[i]-greenline)/(yellowline-greenline),1,0]))
elif ((Subcvalue[i]>=cyanline) and (Subcvalue[i]<=greenline)):
#colorm.append(np.array([0,1,(greenline-Subcvalue[i])/(greenline-cyanline)]) )
colorm.append(([0,1,(greenline-Subcvalue[i])/(greenline-cyanline)]))
elif ((Subcvalue[i]>=blueline) and (Subcvalue[i]<=cyanline)):
#colorm.append(np.array([0,(Subcvalue[i]-blueline)/(cyanline-blueline),1]) )
colorm.append(([0,(Subcvalue[i]-blueline)/(cyanline-blueline),1]))
elif (Subcvalue[i]<=blueline):
#colorm.append(np.array([0,0,1]) )
colorm.append(([0,0,1]))
#填入数据,设置属性
plt.text(np.mean(x)-2.5e-3,np.mean(y),str(int(Subcvalue[i])),fontsize=6,color='black')
for i in range(flnumcont):
circle = Circle((fuelnxy[i,0],fuelnxy[i,1]),d/2)
patches.append( circle )
colorm.append(([0.75,0.4,0.4]))
plt.text(fuelnxy[i,0]-d/2,fuelnxy[i,1],str(fueltsval[i]),fontsize=5 )
#设置颜色,渲染到画布
collection = PatchCollection(patches,alpha=1)
#collection.set_facecolor(np.array([0,1,0]))
collection.set_facecolor(colorm)
collection.set_edgecolor('black')
ax.add_collection(collection)
#fig.colorbar(collection,ax=ax)
plt.autoscale(enable=True, axis='y')
plt.autoscale(enable=True, axis='x')
#显示图形
plt.savefig('glp.png',dpi=300)
plt.show()
return
if __name__ == "__main__":
#数据导入
Subcvalue = np.loadtxt('subcT.txt')
fueltsval = np.loadtxt('fuelts.txt')
drawLIUBIANXING( Subcvalue, fueltsval,mr=8 ,d=0.01, p=0.014,h=0.185)