Настройка аннотации с помощью 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)
Я хотел бы сделать две вещи: 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}')
если вы не хотите изменять данные, которые вы строите, то вам придется установить атрибуты на осях 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}')