Настройка аннотации с помощью FacetGrid Seaborn

Я пытаюсь настроить некоторые фигуры с помощью модуля Seaborn в Python, но мне не удалось создать пользовательские метки или аннотации. У меня есть код, который генерирует следующий рисунок:

plot = sns.FacetGrid(data = data, col = 'bot', margin_titles = True).set_titles('Human', 'Bot')
bins = np.linspace(0, 2000, 15)
plot = plot.map(plt.hist, 'friends_count', color = 'black', lw = 0, bins = bins)
plot.set_axis_labels('Number Following', 'Count')
sns.despine(left = True, bottom = True)

enter image description here

Я хотел бы сделать две вещи: 1. замените метки факторов по умолчанию, например "bot = 0.0", значимым текстом и 2. нарисуйте вертикальные линии со средним числом, следующим для каждой категории.

вот автономный пример:

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

fake = pd.DataFrame({'val': [1, 2, 2, 3, 3, 2, 1, 1, 2, 3], 'group': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]})
plot = sns.FacetGrid(data = fake, col = 'group', margin_titles = True).set_titles('zero', 'one')
plot = plot.map(plt.hist, 'val', color = 'black', lw = 0)
sns.despine(left = True, bottom = True)

кто-нибудь знает, как настроить FacetGrids?

1 ответов


о set_titles.

во-первых, заголовки по умолчанию рисуются в FacetGrid.map метод, поэтому, если вы хотите изменить названия, вы должны позвонить set_titles после заговор, иначе они будут перезаписаны.

во-вторых, если вы посмотрите на docstring для метода, он не просто принимает произвольный список заголовков. Он предоставляет способ изменить способ отображения заголовка с использованием имени переменной столбца и значение:

template : string
    Template for all titles with the formatting keys {col_var} and
    {col_name} (if using a `col` faceting variable) and/or {row_var}
    and {row_name} (if using a `row` faceting variable).

таким образом, самый простой способ иметь "значимый текст" - использовать значимые данные в вашем фрейме данных. Возьмите этот пример со случайными данными:

df = pd.DataFrame({'val': np.random.randn(100),
                   'group': np.repeat([0, 1], 50)})

если вы хотите, чтобы "группа" была zero и one, вы должны просто изменить этот столбец, или сделать новую:

df["group"] = df["group"].map({0: "zero", 1; "one"})

тогда скажите, что вы не хотите иметь имя переменной в названии, правильный способ использования FacetGrid.set_titles будет будь

g = sns.FacetGrid(data=df, col='group')
g.map(plt.hist, 'val', color='black', lw=0)
g.set_titles('{col_name}')

some bar graphs

если вы не хотите изменять данные, которые вы строите, то вам придется установить атрибуты на осях matplotlib напрямую, что-то вроде:

for ax, title in zip(g.axes.flat, ['zero', 'one']):
    ax.set_title(title)

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

чтобы построить среднее значение, вам нужно создать небольшую функцию, которая может быть передана в FacetGrid.map. Есть несколько примеров о том, как это сделать в учебнике. В этом случае это довольно просто:

def vertical_mean_line(x, **kwargs):
    plt.axvline(x.mean(), **kwargs)

затем нужно повторно участка:

g = sns.FacetGrid(data=df, col='group')
g.map(plt.hist, 'val', color='black', lw=0)
g.map(vertical_mean_line, 'val')
g.set_titles('{col_name}')

some more bar graphs