Как мне прикрепить цвета к определенным значениям на графике панды? - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я использую цветовую карту для раскраски сложенного барплота из кадра данных pandas. Проблема в том, что я хочу сделать несколько участков. (см. рисунки)

data 1

data 2

В данный момент цветовая карта использует наименьшее и наибольшее значение каждого набора данных для определения цветов. Я хотел бы изменить это следующим образом:

  • один и тот же цвет всегда должен представлять одно и то же значение (даже если минимальное значение отличается)
  • в идеале я хочу указать их только один раз, а не каждый раз, когда создаю новый сюжет

Есть ли способ взять цвета из цветовой карты и прикрепить их к определенным значениям?

Несколько предыдущих вопросов касались очень похожей темы, например, здесь: Цвет по значениям столбцов в Matplotlib Ни один из вопросов, которые я нашел, однако не касался барплотов.

Вот мой код:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'DN': [20, 25, 32, 40, 50],
                   'Fall 1': [200, 300, 450, 200, 80],
                   'Fall 2': [250, 250, 450, 210, 70],
                   'Fall 3': [300, 200, 350, 310, 70]})

gesamtlaenge = 200 + 300 + 450 + 200 + 80

df = df.set_index('DN')
df = df.transpose()

# Skalierung auf Maximum:
df = df.divide(gesamtlaenge, axis=0)
df = df.multiply(100, axis=0)

f, b = plt.subplots(figsize=(9, 6))

ax = df.plot(ax=f.gca(),
                  title='titel',
                  kind='barh', stacked=True,
                  colormap='summer_r',
                  edgecolor='black',
                  fontsize=14)

ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=14)
ax.set_xlabel('Anteil in %', fontsize=14)
ax.set_title('title', fontsize=14)

f.tight_layout()
f.subplots_adjust(right=0.8)  

plt.show()

Второй кадр данных, который я использовал:

df = pd.DataFrame({'DN': [25, 32, 40, 50],
                   'Fall 1': [300, 450, 200, 80],
                   'Fall 2': [250, 500, 210, 70],
                   'Fall 3': [200, 350, 310, 170]})
...