0

我想在我的 3D 条形图中基于一些值或梯度从最低到最高值的切割为 z 即数值变量提供不同的渐变颜色。我想设置条件说如果 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)

在此处输入图像描述

4

1 回答 1

2

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

这是一个使用平滑范围为条形着色的示例,绿色表示最高,红色表示最低。将颜色图更改为cmap = plt.cm.get_cmap('RdYlGn', 2)会将所有高于平均值的条形着色为绿色,其余条形着色为红色。要将拆分条件精确设置为 50,您可以将 norm 更改为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()

左边是一个带有一系列颜色的示例,右边是一个只有 2 种颜色的示例:

示例图

于 2020-02-21T12:24:56.360 回答