Нарисуйте линию в определенном месте / аннотируйте Facetgrid в seaborn

A создали коробчатую диаграмму с Facetgrid в морском стиле следующим образом

# Import the dataset
tips = sns.load_dataset("tips")

# Plot using FacetGrid, separated by smoke
plt.style.use('ggplot')
g = sns.FacetGrid(tips, col="smoker", size=5, aspect=1.5)
g.map(sns.boxplot, "sex", "total_bill", palette='viridis', order=['Male', 'Female'])
plt.show()

Теперь я хочу нарисовать четкие горизонтальные линии на каждом участке. Например, одна горизонтальная линия (с согласованными (0,10)) только на левом графике и другая горизонтальная линия (с координатами (0,30)) только на правом графике.

Как я могу это сделать?


person BCArg    schedule 17.08.2018    source источник


Ответы (5)


Вы можете получить список осей, используемых в FacetGrid, используя FacetGrid.axes, который возвращает используемые оси. Затем вы можете выполнять все обычные операции matplotlib, используя эти оси, например axhline для горизонтальных линий или plt.text для размещения текста на оси:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")

# Plot using Facegrid, separated by smoke
plt.style.use('ggplot')
g = sns.FacetGrid(tips, col="smoker", size=5, aspect=1.5)
g.map(sns.boxplot, "sex", "total_bill", palette='viridis', order=['Male', 'Female'])

ax1, ax2 = g.axes[0]

ax1.axhline(10, ls='--')
ax2.axhline(30, ls='--')

ax1.text(0.5,25, "Some text")
ax2.text(0.5,25, "Some text")

plt.show()

введите описание изображения здесь

person DavidG    schedule 17.08.2018

Кроме того, если у вас есть несколько сеток, которые вы хотите добавить ко всем по одной горизонтальной линии (скажем, с y = 10), вы можете просто «сопоставить» plt.axhline с вашим объектом сетки:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# Plot using Facegrid, separated by smoke
plt.style.use('ggplot')
g = sns.FacetGrid(tips, col="smoker", size=5, aspect=1.5)
g.map(sns.boxplot, "sex", "total_bill", palette='viridis', order=['Male', 'Female'])

g.map(plt.axhline, y=10, ls='--', c='red')
person h_dejavu    schedule 09.10.2019

Есть axhline и hlines. Простой пример:

chart = sns.relplot(x="x", y="y", kind="line", data=df)

chart.axes[0][0].axhline(y = 10, color='black', linewidth=2, alpha=.7)
chart.axes[0][0].hlines( y = 20, color='black', linewidth=2, alpha=.7, 
                         xmin = 30, xmax = 50) 

Похоже, hlines позволяет использовать min-max (документация ) но axhline этого не делает.

person Boris Yakubchik    schedule 27.05.2019

Просто добавьте к верхнему ответу, если хотите сделать то же самое с цифрами в столбцах.

g = sns.FacetGrid(df_long, col="variable", size=5, aspect=1.5,col_wrap=1,sharey=False)
# df_long is a long table with 3 variables
g.map(sns.boxplot, "label", "value", palette='Set2')
g.axes[0].axhline(1, ls='--',c='r')
g.axes[1].axhline(1, ls='--',c='r')
g.axes[2].axhline(0.5, ls='--',c='r')
g.map(plt.xticks, rotation=70) 
plt.show()

результат

person Tustoyevsky    schedule 15.01.2021

  • Начиная с seaborn v0.11.0 рекомендуется использовать функции уровня рисунка, такие как _2 _ вместо seaborn.FacetGrid
  • If a different line location and annotation is required for each axes, then the easiest implementation is to place the locations and text into a dict, and flatten the axes returned when creating the plot.
    • Use enumerate to access each set of values from the dict
    • Это требует знания порядка выходных графиков, поэтому график нужно будет запустить, а затем создать dict и цикл для добавления строк и аннотаций.
  • В качестве альтернативы см. Этот ответ, в котором имена строк и столбцов для каждой оси извлекаются с помощью g.row_names и g.col_names. Имена строк и столбцов можно использовать как keys.
import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.catplot(kind='box', data=tips, col='smoker', row='sex', x='sex', y='total_bill', height=3)

# dict of line positions and annotations
la = {0: [5, 0.4, 0.75, 40, 'text_a'], 1: [10, 0.5, 0.75, 40, 'text_b'],
      2: [25, 0.6, 0.75, 40, 'text_c'], 3: [35, 0.7, 0.75, 40, 'text_d']}

# flatten axes into a 1-d array
axes = g.axes.flatten()

# iterate through the axes
for i, ax in enumerate(axes):
    ax.axhline(la[i][0], ls='--', c='green')
    ax.axvline(la[i][1], ls='--', c='purple')
    ax.text(la[i][2], la[i][3], la[i][4], c='orange')

введите описание изображения здесь

person Trenton McKinney    schedule 13.05.2021