Добавить вертикальные линии, чтобы отделить боксы с разделением по условиям, используя seaborn? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь реализовать вертикальные линии на моем поле с морскими волнами, чтобы отделить каждый столбец, но пока я могу только добавить основные линии ax.xaxis.grid(True, which='major'), проходящие через середину. Вот мой код и изображение того, чего я пытаюсь достичь. Спасибо!

# Custom palette
my_pal = {"Year A": "#e42628", "Year B": "#377db6"}

plt.figure(figsize=(16, 10))
sns.axes_style("whitegrid")
ax = sns.boxplot(x='variable', y="value", hue="Condition", showmeans=True, data=df, palette=my_pal, meanprops={"marker":"s","markerfacecolor":"white", "markeredgecolor":"black"})
plt.ylabel("Temperature (\xb0C)")
#ax.axvline(linewidth=2, color='r')
ax.xaxis.grid(True, which='major')

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

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

from matplotlib import pyplot as plt
from matplotlib.ticker import MultipleLocator
import seaborn as sns
import pandas as pd
import numpy as np

N = 200
df = pd.DataFrame({'variable': np.repeat(list('ABCDEFGHIJ'), N // 10),
                   'value': np.random.uniform(10, 25, N),
                   'Condition': np.random.choice(['Year A', 'Year B'], N)})

# Custom palette
my_pal = {"Year A": "#e42628", "Year B": "#377db6"}

plt.figure(figsize=(16, 10))
sns.axes_style("whitegrid")
ax = sns.boxplot(x='variable', y="value", hue="Condition", showmeans=True, data=df, palette=my_pal,
                 meanprops={"marker": "s", "markerfacecolor": "white", "markeredgecolor": "black"})
plt.ylabel("Temperature (°C)")
ax.xaxis.set_minor_locator(MultipleLocator(0.5))
ax.xaxis.grid(True, which='minor', color='black', lw=2)

plt.show()

resulting plot

2 голосов
/ 20 апреля 2020

Ширина боксов по умолчанию составляет 0,5 (или 0,15 x [расстояние между крайними положениями], если оно меньше).

Если ваша ширина равна 0,5, вы можете сделать это:

import seaborn as sns, matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
ax = sns.boxplot(x='day',y='total_bill',hue='sex',data=tips)
[ax.axvline(x+.5,color='k') for x in ax.get_xticks()]
plt.show()

Пример:
enter image description here

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