Как закрасить переменную на основе максимального и минимального значений или при некотором обрезанном значении для гистограммы 3d в python - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу задать другой цвет градиента для z, т.е. переменную Numeri c в моей трехмерной гистограмме на основе некоторого среза значения или градиента от минимального до максимального значения. Я хочу поставить условие, скажем, если dz>> = 50, то зеленая полоса, а красная - ба. Прикрепленный код, пожалуйста, поделитесь, если есть какое-либо решение для этого.

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)

enter image description here

1 Ответ

2 голосов
/ 21 февраля 2020

Параметр color= для bar3d может быть списком цветов с одной записью на полосу. Такой список может быть построен с использованием карты цветов.

Вот пример, который окрашивает полосы с использованием плавного диапазона от зеленого для самого высокого и красного для самого низкого. Если изменить цветовую карту на cmap = plt.cm.get_cmap('RdYlGn', 2), все столбцы будут окрашены в зеленый цвет выше среднего, а остальные - в красный. Чтобы установить условие разделения точно на 50, вы можете изменить норму на norm = mcolors.Normalize(0, 100).

Если требуется всего несколько разных цветов, проще всего забыть о cmap и норме и просто использовать:

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 цветами:

example plot

...