Как я могу отрегулировать размер усов в Seaborn? - PullRequest
3 голосов
/ 25 апреля 2019

Я бы хотел сделать линии усов шире в следующем блокпосте.

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

data = pd.DataFrame({'Data': np.random.random(100), 'Type':['Category']*100})

fig, ax = plt.subplots()

# Plot boxplot setting the whiskers to the 5th and 95th percentiles
sns.boxplot(x='Type', y='Data', data=data, color = 'gray', whis = [5,95])

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

enter image description here

Я знаю, как настроить цвет усов и ширину линии, но я не смог придумать, как увеличить длину усов. Самое близкое, что я пришел, пытается использовать line.set_xdata([q/60-0.5, q/60+0.5]), но я получаю ошибку

ValueError: shape mismatch: objects cannot be broadcast to a single shape    

В идеале, я хотел бы, чтобы линии процентиля усов были такой же ширины, как и поле. Как я могу это сделать?

1 Ответ

3 голосов
/ 25 апреля 2019

Как вы заметили, для каждого блока построено 6 линий (отсюда и ваша p*6 индексация).

Линия с индексом p*6+4 имеет ширину прямоугольника (это средняя линия внутри прямоугольника). Таким образом, мы можем использовать это, чтобы установить ширину других линий.

Строки, которые вы хотите изменить, имеют индекс p*6+2 и p*6+3.

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

data = pd.DataFrame({'Data': np.random.random(100), 'Type':['Category']*100})

fig, ax = plt.subplots()

# Plot boxplot setting the whiskers to the 5th and 95th percentiles
sns.boxplot(x='Type', y='Data', data=data, color = 'gray', whis = [5,95])

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

    ax.lines[p*6+2].set_xdata(ax.lines[p*6+4].get_xdata())
    ax.lines[p*6+3].set_xdata(ax.lines[p*6+4].get_xdata())

enter image description here

Это также работает с примером с несколькими полями:

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

sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="day", y="total_bill", data=tips)

# Adjust boxplot and whisker line properties
for p, artist in enumerate(ax.artists):
    artist.set_edgecolor('blue')
    for q in range(p*6, p*6+6):
        line = ax.lines[q]
        line.set_color('pink')

    ax.lines[p*6+2].set_xdata(ax.lines[p*6+4].get_xdata())
    ax.lines[p*6+3].set_xdata(ax.lines[p*6+4].get_xdata())

enter image description here

...