【问题标题】:LEGEND in a 3D bar plot as a colormap3D 条形图中的 LEGEND 作为颜色图
【发布时间】:2020-09-22 07:04:24
【问题描述】:

我在 matplotlib 中有一个 3D 条形图,它由总共 40 个条形组成,目前它非常混乱。我使用颜色图将我的数据数组转换为颜色数组。 colors = plt.cm.jet(data.flatten()/float(data.max()))

现在我需要绘制此颜色图的图例。 [关于颜色如何与值相关的颜色等级。]

import os
import glob
import shutil
import pandas as pd
import plotly.express as px
import xlrd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

#%matplotlib nbagg
x=np.array(range(0,4),float)
y=np.array(range(0,10),float)
xpos,ypos = np.meshgrid(x,y)
z=np.random.rand(4,10)
z=np.array([[1434.273,1437.1749,1441.878,1441.155],
           [1392.140,1371.859,1384.381,1309.88],
           [1333.66,1283.08,1220.85,1268.912],
           [1538.289,1327.628,1278.87,1372.7348],
           [1393.3608,1321.353,1276.506,1248.3100],
           [1394.632,1340.46,1286.30,1346.60],
           [1352.29,1324.48,1229.475,1276.067],
           [1345.233,1285.63,1265.30,1335.97],
           [1406.068,1411.614,1320.27,1390.042],
           [1396.901,1430.822,1455.797,1476.244]])

xpos=xpos.flatten()
ypos=ypos.flatten()
zpos=np.zeros_like(xpos)

dx=0.5*np.ones_like(xpos)
dy=dx.copy()
dz=z.flatten()

fig=plt.figure(figsize = (11,8))
ax=fig.add_subplot(111, projection = "3d")
label = ["E"]

ax.set_title("Variation of Average E along 40 Print positions", fontsize = 25)
ax.set_xticks(range(4))
ax.set_xticklabels(["A", "B", "C", "D"])
ax.set_xlabel("Probe Numbers on X plane",labelpad=15)

ax.set_yticklabels([1,2,3,4,5,6,7,8,9,10])
ax.set_yticks(range(10))
ax.set_ylabel("Probe Numbers on Y plane",labelpad=15)

ax.set_zlabel("E", labelpad=15)
colors = plt.cm.jet(z.flatten()/float(z.max()))

ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color= colors)

#plt.imshow(mat, origin="lower", cmap='gray', interpolation='nearest')

#ax.legend([colors],label)
plt.show()

【问题讨论】:

    标签: python matplotlib legend colorbar colormap


    【解决方案1】:

    检查此代码:

    import os
    import glob
    import shutil
    import pandas as pd
    import plotly.express as px
    import xlrd
    import matplotlib.pyplot as plt
    # %matplotlib inline
    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    import numpy as np
    
    #%matplotlib nbagg
    x=np.array(range(0,4),float)
    y=np.array(range(0,10),float)
    xpos,ypos = np.meshgrid(x,y)
    # z=np.random.rand(4,10)
    z=np.array([[1434.273,1437.1749,1441.878,1441.155],
               [1392.140,1371.859,1384.381,1309.88],
               [1333.66,1283.08,1220.85,1268.912],
               [1538.289,1327.628,1278.87,1372.7348],
               [1393.3608,1321.353,1276.506,1248.3100],
               [1394.632,1340.46,1286.30,1346.60],
               [1352.29,1324.48,1229.475,1276.067],
               [1345.233,1285.63,1265.30,1335.97],
               [1406.068,1411.614,1320.27,1390.042],
               [1396.901,1430.822,1455.797,1476.244]])
    
    xpos=xpos.flatten()
    ypos=ypos.flatten()
    zpos=np.zeros_like(xpos)
    
    dx=0.5*np.ones_like(xpos)
    dy=dx.copy()
    dz=z.flatten()
    
    fig=plt.figure(figsize = (11,8))
    ax=fig.add_subplot(111, projection = "3d")
    label = ["E"]
    
    ax.set_title("Variation of Average E along 40 Print positions", fontsize = 25)
    ax.set_xticks(range(4))
    ax.set_xticklabels(["A", "B", "C", "D"])
    ax.set_xlabel("Probe Numbers on X plane",labelpad=15)
    
    ax.set_yticklabels([1,2,3,4,5,6,7,8,9,10])
    ax.set_yticks(range(10))
    ax.set_ylabel("Probe Numbers on Y plane",labelpad=15)
    
    ax.set_zlabel("E", labelpad=15)
    colors = plt.cm.jet((z.flatten() - z.min()) / (z.max() - z.min()))
    
    bar = ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color= colors)
    
    #plt.imshow(mat, origin="lower", cmap='gray', interpolation='nearest')
    
    fig.colorbar(plt.cm.ScalarMappable(cmap = 'jet'), ax = ax)
    plt.show()
    

    为了显示颜色条,我添加了:

    fig.colorbar(plt.cm.ScalarMappable(cmap = 'jet'), ax = ax)
    

    然后,我编辑你的这行代码:

    colors = plt.cm.jet((z.flatten() - z.min()) / (z.max() - z.min()))
    

    这样colors0 变为1(它已正确标准化),因此您可以使用所有颜色条范围。
    结果如下:

    【讨论】:

    • 感谢安德里亚的快速而完美的回答 :)
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 2018-01-07
    • 2021-08-03
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多