2015-06-10 70 views
1

我有從3D離散數據集(x,y,z)生成的3D條形圖。
使用此代碼在畫布上繪製:生成自定義色條:使用顏色方案匹配數據

bar_chart_3d =fx.bar3d(x, y, z, dx, dy, dz, color=cmap.to_rgba(dz), alpha=0.4,linewidth=0.5) 

但是,我不能夠在此基礎上dz值繪製在畫布上colormap重視。
嘗試使用:

#Adding a color-bar... 
fig.colorbar(cmap.to_rgba(dz), shrink=0.6, aspect=8) 

但這調用AttributeError: 'numpy.ndarray' object has no attribute 'autoscale_None'
謝謝。

回答

2

從bar3d docs,所施加的顏色是每個面,

顏色可以是:

的長度爲N條的顏色的數組,以獨立地顏色的每個欄。

我猜想這只是一個facecolor,它不是假設傳達的信息和bar3d不返回任何東西。 像輪廓返回一個ScalarMappable可以用來指定顏色條。它看起來像你的cmap(我認爲是cm.ScalarMappable?)不包含色條所需的標準和自動縮放。

這樣的工作,你身邊可以得出一定的限度之間的彩條自己在本example

fig.subplots_adjust(bottom=0.25) 
ax1 = fig.add_axes([0.05, 0.10, 0.9, 0.1]) 
norm = mpl.colors.Normalize(vmin=dz.min(), vmax=dz.max()) 
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap=mpl.cm.cool, 
           norm=norm, 
           orientation='horizontal') 

,你的最小值和最大值爲dz指定範圍,這與您的數據是一致的。

編輯:添加一個最小工作示例,您指定一個顏色映射,使用它獲取顏色條並將此顏色映射添加到底部。

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
x, y = np.random.rand(2, 100) * 4 
hist, xedges, yedges = np.histogram2d(x, y, bins=4) 

elements = (len(xedges) - 1) * (len(yedges) - 1) 
xpos, ypos = np.meshgrid(xedges[:-1]+0.25, yedges[:-1]+0.25) 

xpos = xpos.flatten() 
ypos = ypos.flatten() 
zpos = np.zeros(elements) 
dx = 0.5 * np.ones_like(zpos) 
dy = dx.copy() 
dz = hist.flatten() 

#Define colormap and get values for barcolors from it 
cmap = plt.cm.RdYlBu_r 
norm = mpl.colors.Normalize(vmin=dz.min(), vmax=dz.max()) 
barcolors = plt.cm.ScalarMappable(norm, cmap) 

#Plot bar3d 
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=barcolors.to_rgba(dz),alpha=0.4,linewidth=0.5, zsort='average') 

#Add colorbar 
fig.subplots_adjust(bottom=0.25) 
ax1 = fig.add_axes([0.05, 0.10, 0.9, 0.1]) 
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap=cmap, 
            norm=norm, 
            orientation='horizontal') 
plt.show() 

其中給出, enter image description here

+0

我用'色= cmap.to_rgba(DZ)'而繪製'酒吧chart',所以按照你的榜樣,當我試圖把'CMAP = CMAP .to_rgba'代碼也崩潰。任何想法我怎麼能夠''rgba'到'cmap'。 – diffracteD

+1

我已經添加了一個如何做到這一點的最小示例,這個想法是你選擇一個'cmap',從中獲取條形顏色,然後在整個範圍內繪製'colorbar'(符合'dz的範圍底部值)。 –