有人知道如何在matplotlib中轻松实现三维条形图的色彩映射吗?
考虑this示例,如何根据色彩图更改每个条形图?例如,短杆应该主要是蓝色,而较高的杆应该从蓝色到红色......
答案 0 :(得分:3)
在物理科学中,通常需要一个所谓的LEGO图,这是我认为原始用户想要的。凯文·G的回答很好,并且使我达到了最终结果。这是用于x-y散点数据的更高级的直方图,按高度进行着色:
xAmplitudes = np.random.exponential(10,10000) #your data here
yAmplitudes = np.random.normal(50,10,10000) #your other data here - must be same array length
x = np.array(xAmplitudes) #turn x,y data into numpy arrays
y = np.array(yAmplitudes) #useful for regular matplotlib arrays
fig = plt.figure() #create a canvas, tell matplotlib it's 3d
ax = fig.add_subplot(111, projection='3d')
#make histogram stuff - set bins - I choose 20x20 because I have a lot of data
hist, xedges, yedges = np.histogram2d(x, y, bins=(20,20))
xpos, ypos = np.meshgrid(xedges[:-1]+xedges[1:], yedges[:-1]+yedges[1:])
xpos = xpos.flatten()/2.
ypos = ypos.flatten()/2.
zpos = np.zeros_like (xpos)
dx = xedges [1] - xedges [0]
dy = yedges [1] - yedges [0]
dz = hist.flatten()
cmap = cm.get_cmap('jet') # Get desired colormap - you can change this!
max_height = np.max(dz) # get range of colorbars so we can normalize
min_height = np.min(dz)
# scale each z to [0,1], and get their rgb values
rgba = [cmap((k-min_height)/max_height) for k in dz]
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=rgba, zsort='average')
plt.title("X vs. Y Amplitudes for ____ Data")
plt.xlabel("My X data source")
plt.ylabel("My Y data source")
plt.savefig("Your_title_goes_here")
plt.show()
注意:结果将取决于您选择的仓数和使用的数据量而有所不同。此代码需要您插入一些数据或生成随机线性数组。结果图如下,具有两个不同的视角:
答案 1 :(得分:2)
所以也许并不完全是你正在寻找的东西(也许是一个很好的起点),但是使用
Getting individual colors from a color map in matplotlib
可以为条形图提供不同的纯色:
apex_application.g_f
就我个人而言,我发现它像罪一样丑陋!但是对于顺序色图 - https://matplotlib.org/examples/color/colormaps_reference.html
,它可能看起来不太糟糕