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

前言

这是一个六边形组件热图程序,大概花了我将近一个多月的时间才完成的,主要用到的知识有matplotlib、Numpy、Pandas,也就是python中的科学计算、数据分析以及可视化绘图库。

六边形组件热图
下面是这个程序运行效果图:
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)