对于二维数组的球坐标色温展示效果,现有教程不尽人意,如何按照数组中数值的大小赋予颜色值,下文通过函数定义方式,一步到位达到绘制目的。
deflxz_plotball(mapdata,alpha=0.6,colormap='plasma'):
#deflxz_plotball(phinum,thetanum,mapdata,alpha=0.6,colormap='plasma'):
%matplotlib widget
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
#from matplotlib import cm
mapdata=np.rot90(mapdata);#行列的物理意义换算到显示维度。
mycolormap = plt.get_cmap(colormap);
mapminvalue=mapdata.min();mapmaxvalue=mapdata.max();
#根据三维数组中的最大和最小值来定义每个数值的相对强度,范围0~1.0
relativevalue=np.zeros((mapdata.shape[0],mapdata.shape[1]));
#色温强度矩阵大小与xyz测试数组大小一致
for i in range(0,relativevalue.shape[0]):
for j in range(0,relativevalue.shape[1]):
relativevalue[i][j]=round(mapdata[i][j]/mapmaxvalue,1);#保留1位小数,意味着10个色度,不过肉眼已经难以区分。
colorsvalues = np.empty(mapdata.shape, dtype=object)
for i in range(0,relativevalue.shape[0]):
for j in range(0,relativevalue.shape[1]):
tempc=mycolormap(relativevalue[i][j]);
#tempc为tuple变量,存储当前数值的颜色值(R,G,B,Alpha)
colorreal=(tempc[0],tempc[1],tempc[2],alpha);
#tuple为不可变数据类型,所以替换自定义alpha值时需要重新定义
colorsvalues[i][j]=colorreal;
#最终每个数值所对应的颜色
fsize = 15
tsize = 18
tdir = 'in'
major = 5.0
minor = 3.0
style = 'default'
plt.style.use(['science','ieee','no-latex'])
plt.style.use(style)
#plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = fsize
plt.rcParams['legend.fontsize'] = tsize
plt.rcParams['xtick.direction'] = tdir
plt.rcParams['ytick.direction'] = tdir
plt.rcParams['xtick.major.size'] = major
plt.rcParams['xtick.minor.size'] = minor
plt.rcParams['ytick.major.size'] = major
plt.rcParams['ytick.minor.size'] = minor
fig = plt.figure(num=1,figsize=(8,6));
#ax = fig.add_subplot(111, projection='3d')
ax = Axes3D(fig);#在窗口上添加3D坐标轴
u= np.linspace(0,2*np.pi, mapdata.shape[0]);
v= np.linspace(0, np.pi, mapdata.shape[1]);
x= np.outer(np.cos(u), np.sin(v));
y= np.outer(np.sin(u), np.sin(v));
z= np.outer(np.ones(np.size(u)), np.cos(v));
#
#C = np.cos(x)
#testc=cm.jet(x);
#testc[2][2][2]=0.2;
#c = np.random.random((32,16, 4))
#
#aa=ax.plot_surface(x, y, z, facecolors = c,edgecolor=None,cmap =plt.get_cmap('Spectral')) # Look how I gave a variable to the facecolors.
#figmap=ax.plot_surface(x, y, z,edgecolor=None,cmap = plt.get_cmap(colormap),rstride=1,cstride=1) # Look how I gave a variable to the facecolors.
figmap=ax.plot_surface(x, y, z, facecolors=colorsvalues,edgecolor=None,cmap = plt.get_cmap(colormap),rstride=1,cstride=1) # Look how I gave a variable to the facecolors.
#ax.plot_surface(x, y, z, facecolors = cm.jet(C), rstride=4, cstride=4)# Look how I gave a variable to the facecolors.
plt.colorbar(figmap,shrink=0.8);#防止bar太高
plt.show();#plt.axis('equal');#plt.axis('scaled');
补充一点外部数据测试:
1. 创建excel表格,录入16*32元素数组。
2.读入数据:
test_mapdata=pd.read_excel('test0816.xlsx',header=None)