应用于每个条形的matplotlib中的3d条形图的colormap

时间:2017-07-03 23:51:15

标签: matplotlib

有人知道如何在matplotlib中轻松实现三维条形图的色彩映射吗?

考虑this示例,如何根据色彩图更改每个条形图?例如,短杆应该主要是蓝色,而较高的杆应该从蓝色到红色......

2 个答案:

答案 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()

注意:结果将取决于您选择的仓数和使用的数据量而有所不同。此代码需要您插入一些数据或生成随机线性数组。结果图如下,具有两个不同的视角:

Side perspective of a 3d bar plot in matplotLib Perspective 2

答案 1 :(得分:2)

所以也许并不完全是你正在寻找的东西(也许是一个很好的起点),但是使用

Getting individual colors from a color map in matplotlib

可以为条形图提供不同的纯色:

apex_application.g_f

enter image description here

就我个人而言,我发现它像罪一样丑陋!但是对于顺序色图 - https://matplotlib.org/examples/color/colormaps_reference.html

,它可能看起来不太糟糕