我有一个3D条形图,由3D离散数据集(x,y,z
)生成
使用此代码在画布上绘图:
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'
谢谢。
答案 0 :(得分:2)
从bar3d docs,应用的颜色是每张脸
颜色可以是:
长度为N条的颜色数组,用于独立地为每个条形图着色。
我想因为这只是一个facecolor,所以不会传递信息,而bar3d也不会返回任何内容。
像轮廓这样的东西返回ScalarMappable
,可用于指定颜色条。看起来你的cmap(我假设是cm.ScalarMappable
?)并不包含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
的最小值和最大值指定与您的数据一致的范围。
编辑:添加了一个最小的工作示例,您可以在其中指定色彩图,使用它来获取条形图颜色并将此色彩图添加到底部。
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()
这给了,