барборн морского побережья: цвет меняется с х и оттенком - PullRequest
0 голосов
/ 06 октября 2019

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

  • модель включена, краткосрочная
  • модель включена, долгосрочная
  • модель выключена, краткосрочная
  • модель включена, в долгосрочной перспективе

вот пример кода:

df = pd.DataFrame(columns=["model", "time", "value"])
df["model"] = ["on"]*2 + ["off"]*2
df["time"] = ["short", "long"] * 2
df["value"] = [1, 10, 2, 4]

sns.barplot(data=df, x="model", hue="time", y="value")
plt.show()

это выглядит так:

barplot

Есть много других связанных фигур, и они установили цветовые соглашения. Модель вкл / выкл кодируется в цветовой тон. Долгосрочные против краткосрочных закодированы в насыщенности цвета. Итак, давайте предположим, что я дал переменные со значениями цвета. Как я могу назначить каждому отдельному столбцу на графике отдельный цвет?

В документах для seaborn.barplot показывается только color, который задает один цвет для всех элементов и palette, которыйтолько дает разные значения оттенков разных цветов.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Существующий ответ показывает хороший способ организации столбцов с помощью pyplot.

К сожалению, мой код сильно зависит от других функций seaborn, таких как панели ошибок и т. Д. Поэтому я предпочел бы иметь возможностьсохраните функциональность морского барплота и просто укажите мои собственные цвета.

Можно перебирать столбцы морского барплота как патчи matplotlib. Это позволяет установить цвет, штриховку и т. Д .: Можно ли добавить штриховки к каждой отдельной панели в seaborn.barplot?

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

df = pd.DataFrame(columns=["model", "time", "value"])
df["model"] = ["on"]*2 + ["off"]*2
df["time"] = ["short", "long"] * 2
df["value"] = [1, 10, 2, 4]

fig, ax = plt.subplots()
bar = sns.barplot(data=df, x="model", hue="time", y="value", edgecolor="white")


colors = ["red", "green", "blue", "black"]
# Loop over the bars
for i,thisbar in enumerate(bar.patches):
    # Set a different hatch for each bar
    thisbar.set_color(colors[i])
    thisbar.set_edgecolor("white")

Однако, если вы сделаете это, она не будетобновить легенду. Вы можете использовать следующий код для создания пользовательской легенды. Это сложно, потому что мне нужно несколько цветовых патчей для каждой записи легенды. Это, очевидно, довольно сложно сделать: Python Matplotlib Multi-color Legend Entry

# add custom legend
ax.get_legend().remove()
legend_pos = np.array([1, 10])
patch_size = np.array([0.05, 0.3])
patch_offset = np.array([0.06, 0])

r2 = mpatches.Rectangle(legend_pos, *patch_size, fill=True, color='red')
r3 = mpatches.Rectangle(legend_pos + patch_offset, *patch_size, fill=True, color='blue')
ax.add_patch(r2)
ax.add_patch(r3)
ax.annotate('Foo', legend_pos + 3* patch_offset - [0, 0.1], fontsize='x-large')

plt.show()

custom barplot

0 голосов
/ 06 октября 2019

Seaborn дает вам удобство для создания простых графиков, но если вы пытаетесь отказаться от опций, которые он вам предоставляет, обычно проще использовать прямые функции matplotlib:

plt.bar(x='model',height='value',data=df.loc[df.time=='short'], width=-0.4, align='edge', color=['C0','C1'])
plt.bar(x='model',height='value',data=df.loc[df.time=='long'], width=0.4, align='edge', color=['C2','C3'])

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...