2015-07-26 2 views
8

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

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?

+0

ЗАКАНЧИВАТЬ 'FacetGrid.set_titles' метод. – mwaskom

+1

Да, попробовал, но ничего не делает. Любые мысли о создании вертикальных линий в разных точках на каждом? –

+2

Не уверен, что означает «ничего не делает». Если вы пробовали вещи и не работали, вы должны добавить этот вопрос тоже. Кроме того, гораздо проще помочь, когда ваш вопрос содержит автономный пример, который кто-то может скопировать и вставить для создания. Возможно, вы можете использовать один из примеров наборов данных морского дна, которые используются в учебнике. – mwaskom

ответ

12

Немного о 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). 

Таким образом, самый простой способ, чтобы иметь «осмысленный текст», чтобы использовать значимые данные в вашем dataframe. Возьмем такой пример со случайными данными:

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. Есть multiple examples, как это сделать в учебнике.В этом случае, это довольно легко:

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

+0

Отличный ответ. IMO проблема с кодированием данных с метками, которые вы будете использовать для визуализации, заключается в том, что она не позволяет применять преобразования в данных позже (без повторного кодирования). Например, если бы я хотел центрировать и масштабировать, мне пришлось бы преобразовать эти метки обратно в [0, 1]. Надеемся, что в будущем будет лучше поддерживать маркировку фигур и аннотацию. Было бы здорово иметь что-то элегантное и мощное, как ggplot2 для Python. –

+4

* Комментарий от [Coby Viner] (http://stackoverflow.com/users/5339699/): * Если '{col_value}' было '{col_name}' (в 'g.set_titles ('{col_value}') 'фрагмент кода)? Кажется, что никакого шаблона '{col_value}' не существует. –

+0

@erinshellman вы видели библиотеку ggplot yhat? http://ggplot.yhathq.com/docs/facet_grid.html –

Смежные вопросы