2015-06-10 4 views
1

У меня есть трехмерная гистограмма, созданная из 3D-дискретного набора данных (x,y,z).
Используется этот код для построения на холсте:генерация пользовательских colorbar: соответствие данных с цветовой схемой

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

Но я не в состоянии прикрепить colormap на холсте, на основании которого строится dz значение.
Пробовал с помощью:

#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 стержней, чтобы цвет каждого бара независимо друг от друга.

Я предполагаю, что это просто лицо, оно не предполагается передавать информацию, и bar3d ничего не возвращает. Такие вещи, как контур, возвращают ScalarMappable, которые могут использоваться для указания цветовой панели. Похоже, что ваш cmap (который, как я полагаю, является cm.ScalarMappable?), Не содержит нормы и автомасштаба, требуемых для colorbar.

Как работа вокруг вас может сделать Colorbar самостоятельно между определенными пределами, как в этом 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 указать диапазон, который согласуется с вашими данными.

EDIT: добавлен минимальный рабочий пример, в котором вы указываете цветовой код, используйте его для получения штрих-цветов и добавьте этот цветной снизу.

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 'bar значения" внизу. –

Смежные вопросы