使用Seaborn的FacetGrid自定义注释

Eri*_*man 11 python matplotlib seaborn

我正在尝试使用Python中的Seaborn模块自定义一些数字,但我没有运气创建自定义标签或注释.我有一些代码生成下图:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想做两件事: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)
Run Code Online (Sandbox Code Playgroud)

有谁知道如何自定义FacetGrids?

mwa*_*kom 19

关于一些事情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).
Run Code Online (Sandbox Code Playgroud)

因此,拥有"有意义的文本"的最简单方法是在数据框中使用有意义的数据.以随机数据为例:

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

如果你想"团"是zeroone,你应该只改变该列,或使一个新问题:

df["group"] = df["group"].map({0: "zero", 1; "one"})
Run Code Online (Sandbox Code Playgroud)

然后说你不想在标题中有变量名,正确的使用FacetGrid.set_titles方法是

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

一些条形图

如果您不想更改正在绘制的数据,则必须直接在matplotlib轴上设置属性,例如:

for ax, title in zip(g.axes.flat, ['zero', 'one']):
    ax.set_title(title)
Run Code Online (Sandbox Code Playgroud)

请注意,这不太适合上述方法,因为您必须非常小心确保列表的顺序正确并且不会更改,而从数据框本身获取信息将更加健壮.

要绘制均值,您需要创建一个可以传递给的小函数FacetGrid.map.在本教程中有多个如何执行此操作的示例.在这种情况下,它很容易:

def vertical_mean_line(x, **kwargs):
    plt.axvline(x.mean(), **kwargs)
Run Code Online (Sandbox Code Playgroud)

然后你需要的是重新绘制:

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}')
Run Code Online (Sandbox Code Playgroud)

一些更多的条形图

  • *来自[Coby Viner]的评论(http://stackoverflow.com/users/5339699/):*`{col_value}`应该是`{col_name}`(在`g.set_titles('{col_value}'中) `代码片段)?似乎没有任何`{col_value}`模板代码. (4认同)