python - 生成自定义颜色条 : match data with color scheme

标签 python numpy matplotlib

我有一个 3D 条形图,由 3D 离散数据集 (x,y,z) 生成。
使用此代码在 Canvas 上绘制:

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

但是,我无法根据绘制的 dz 值将 colormap 附加到 Canvas 上。
尝试使用:

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

但这正在调用AttributeError:'numpy.ndarray'对象没有属性'autoscale_None'
谢谢。

最佳答案

来自bar3d docs ,应用的颜色应用于每个面,

color can be:

An array of colors of length N bars, to color each bar independently.

我猜因为这只是一个面部颜色,所以不假定它传达信息,并且 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

关于python - 生成自定义颜色条 : match data with color scheme,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757404/

相关文章:

python - [matplotlib] : understanding "set_ydata" method

python - 如何在 Matplotlib 的子图中单独绘制相同的图形?

python - 在 Cython 中创建不等长的 numpy.ndarray 列表

python - 以倒计时间隔跳过Python中的迭代

python - 在值数组上调用 random.normal 会增加噪音吗?

python - 受其他数组限制的 Numpy 随机数组

python - 如何使用 Numpy/OpenCV 屏蔽图像?

python - 类型提示、与前向引用的联合

python - 为什么OpenCV不使用Python的CV2给这个矩形一个颜色

python - 使用 WXAgg 后端处理 matplotlib 动画中的帧大小调整