Существующий ответ показывает хороший способ организации столбцов с помощью 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()