如何根据 python 中的 3d 条形图的最高和最低值或某个截止值为变量着色

How to colour a variable on basis of highest and lowest or at some cut off value for 3d Bar graph in python

我想为 z 提供不同的渐变颜色,即我的 3D 条形图中的数字变量基于从最低到最高的一些值或渐变 value.I 想要设置条件说如果 dz > =50 然后是绿色条,否则是红色 ba。附上代码,如果有解决办法请分享。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection = "3d")

ax.set_xlabel("Cumulative HH's")
ax.set_ylabel("Index") 
ax.set_zlabel("# Observations")

xpos = [1,2,3,4,5,6,7,8,9,10,11,12]#
ypos = [2,4,6,8,10,12,14,16,18,20,22,24]#
zpos = np.zeros(12)

dx = np.ones(12)
dy = np.ones(12)
dz = [100,3,47,35,8,59,24,19,89,60,11,25]
colors=['pink']
ax.bar3d(xpos,ypos,zpos,dx,dy,dz,color=colors)

bar3dcolor= 参数可以是一个颜色列表,每个栏有一个条目。可以使用颜色图构建这样的列表。

这是一个使用平滑范围为条形图着色的示例,绿色表示最高,红色表示最低。将颜色图更改为 cmap = plt.cm.get_cmap('RdYlGn', 2) 会将所有高于平均值的条带着色为绿色,其余条带为红色。要将拆分条件准确设置为 50,可以将范数更改为 norm = mcolors.Normalize(0, 100)

如果只需要几种不同的颜色,最简单的就是忘记 cmap 和 norm,直接使用:

colors = ['limegreen' if u > 50 else 'crimson' for u in dz]

这是一个完整的例子:

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

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

ax.set_xlabel("Cumulative HH's")
ax.set_ylabel("Index")
ax.set_zlabel("# Observations")

xpos = np.arange(1, 13)
ypos = np.arange(2, 26, 2)
zpos = np.zeros(12)

dx = np.ones(12)
dy = np.ones(12)
dz = [100, 3, 47, 35, 8, 59, 24, 19, 89, 60, 11, 25]
cmap = plt.cm.get_cmap('RdYlGn')
norm = mcolors.Normalize(min(dz), max(dz))
colors = [cmap(norm(u)) for u in dz]
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=colors)

plt.show()

左边是一系列颜色的例子,右边是只有两种颜色的例子: