Python: барплот с цветовой шкалой - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать гистограмму с цветной полосой, высота каждой полосы - одна переменная (y), и каждая полоса должна иметь цвет в зависимости от другой переменной (c).

Что мне нужно, так это (простой пример):

data_x = [0,1,2,3]
data_hight = [60,60,80,100]
data_color = [1000,500,1000,900]


data_color = [x / max(data_color) for x in data_color]
fig, ax = plt.subplots(figsize=(15, 4))

my_cmap = plt.cm.get_cmap('GnBu')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)

CS = plt.contourf([data_x, data_color],cmap=my_cmap)

cbar = plt.colorbar(CS, cmap=my_cmap)
cbar.set_label('Color', rotation=270,labelpad=25)

plt.xticks(data_x)    
plt.ylabel("Y")

plt.show()

Основная проблема в том, что цвета гистограммы в порядке, но цветовая шкала находится в другом масштабе. кроме того, я вижу синюю линию при y = 0, ее там быть не должно.

Любая помощь будет своевременной. Спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Вы создаете contourf график внутри своего гистограммы. Это не имеет смысла.

Вместо этого вам нужно будет создать сопоставляемое изображение без какого-либо визуального представления для предоставления цветовой панели. Это будет ScalarMappable.

import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable

data_x = [0,1,2,3]
data_hight = [60,60,80,100]
data_color = [1000.,500.,1000.,900.]


data_color = [x / max(data_color) for x in data_color]
fig, ax = plt.subplots(figsize=(15, 4))

my_cmap = plt.cm.get_cmap('GnBu')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)

sm = ScalarMappable(cmap=my_cmap, norm=plt.Normalize(0,max(data_color)))
sm.set_array([])

cbar = plt.colorbar(sm)
cbar.set_label('Color', rotation=270,labelpad=25)

plt.xticks(data_x)    
plt.ylabel("Y")

plt.show()

enter image description here

...