在完成了3d柱形圖的繪製以後,需要增加一個功能:根據柱形圖的不同高度,使用不同的顏色,因此想到了使用色帶的方法。但是網上看了很多文檔,沒有現成的“高度--顏色”映射方案,於是打算自己做一個簡單的“高度” 轉 “顏色“的方案。
參考網址:https://blog.csdn.net/liuchengzimozigreat/article/details/90477501
1 編程基礎
導入必要的庫和創建圖。
import matplotlib.pyplot as plt
import matplotlib as mpl
fig = plt.figure()
2 創建色帶
# 色帶,用於爲柱形圖根據高度取色
cmap = mpl.cm.jet
ax3 = fig.add_axes([0.01, 0.3, 0.02, 0.5]) # 四個參數分別是左、下、寬、長
norm = mpl.colors.Normalize(vmin=0, vmax=100)
cb3 = mpl.colorbar.ColorbarBase(ax3, cmap=cmap,
norm=norm,
spacing='proportional',
orientation='vertical')
3 創建3d座標
# ax = Axes3D(fig)
ax = fig.add_subplot(111, projection='3d')
4 根據高度獲取顏色:ColorbarBase.to_rgba()
for zb in zbs:
high = [1] * len(xs)
cs = [cb3.to_rgba(0)] * len(xs)
for data in zb:
high[data[0]] = (4095 - data[1]) / 4095 * 100
cs[data[0]] = cb3.to_rgba(high[data[0]])
ax.bar(xs, high, zs=t, zdir='y', color=cs, alpha=0.5)
注意:在matplotlib的3.2版本以後,ColorbarBase.to_rgba()被移除了,所以要注意版本。我使用的版本是matplotlib 3.0.2版本。
完整的代碼:
def draw_putu(dat_file):
pds = read_pd(dat_file)
zhoubo = 0
zbs = []
zb = list()
for pd in pds:
if pd[0] == 0:
zbs.append(zb)
zb = list()
zhoubo += 1
else:
# 解析一個周波
zb.append(pd)
fig = plt.figure()
# 色帶,用於爲柱形圖根據高度取色
cmap = mpl.cm.jet
ax3 = fig.add_axes([0.01, 0.3, 0.02, 0.5]) # 四個參數分別是左、下、寬、長
norm = mpl.colors.Normalize(vmin=0, vmax=100)
cb3 = mpl.colorbar.ColorbarBase(ax3, cmap=cmap,
norm=norm,
spacing='proportional',
orientation='vertical')
# ax = Axes3D(fig)
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel(u'放電角度')
ax.set_ylabel('T')
ax.set_zlabel('Q%')
xs = [i for i in range(360)]
t = 0
for zb in zbs:
high = [1] * len(xs)
cs = [cb3.to_rgba(0)] * len(xs)
for data in zb:
high[data[0]] = (4095 - data[1]) / 4095 * 100
cs[data[0]] = cb3.to_rgba(high[data[0]])
ax.bar(xs, high, zs=t, zdir='y', color=cs, alpha=0.5)
t += 1
# plt.show()
name = dat_file.split('.')[0]
plt.savefig(name+'.png')
效果圖: