Я использую Seaborn
для построения линейных графиков с полосой, обозначающей стандартные отклонения. Что-то вроде второго / третьего сюжета в документе ниже:
https://seaborn.pydata.org/generated/seaborn.lineplot.html?highlight=lineplot#seaborn.lineplot
Мне интересно, можно ли установить цвет края для полосы ошибок отдельно? Я могу изменить стиль группы через err_kws
. Но, если я пропускаю "edgecolor" через err_kws
, кажется, что ничего не происходит. Есть ли способ позволить мне контролировать края?
Спасибо!
Похоже, что изменить этот цвет в текущей реализации seaborn невозможно. Это потому, что они явно передают цвет основной строки полосе ошибок как ax.fillbetweenx (... color = original_color). Поигравшись в прошлом, я обнаружил, что этот аргумент цвета, похоже, заменяет другие аргументы цвета, такие как цвет лица и цвет края, поэтому не имеет значения, что вы вставили в err_kws. Однако вы можете исправить это, отредактировав строку 810 в site-packages / seaborn / relational.py из:
ax.fill_between(x, low, high, color=line_color, **err_kws)
к
ax.fill_between(x, low, high, **err_kws)
и явно передавая цвета через err_kws.
Как отмечает Дьякубоски, в lineplot
seaborn цвет линии и полоса погрешности объединены внутри. Я предлагаю изменить свойства художников после создания сюжета. Это более чистая альтернатива, чем прямое редактирование исходного кода библиотеки (проблемы с обслуживанием и т. д.).
Для данных примера, показанных в sns.lineplot docs, мы можем обновить свойства полосы ошибок следующим образом:
import seaborn as sns
fmri = sns.load_dataset("fmri")
ax = sns.lineplot(x = "timepoint", y = "signal", data=fmri)
# by inspection we see that the PolyCollection is the first artist
for child in ax.get_children():
print(type(child))
# and so we can update its properties
ax.get_children()[0].set_color('k')
ax.get_children()[0].set_hatch('//')
Может быть более надежным выбрать по свойству художника, чем выбирать первого художника (особенно, если вы уже что-то визуализировали на тех же осях), например по этим линиям:
from matplotlib.collections import PolyCollection
for child in ax.findobj(PolyCollection):
child.set_color('k')
child.set_hatch('//')