在python的matplotlib上的3d柱形圖上使用色帶

  在完成了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')

效果圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章