如何使用matplotlib或seaborn在图旁边显示摘要统计信息?

时间:2019-05-07 19:14:51

标签: pandas matplotlib seaborn

我正在尝试创建一个函数,该函数将遍历数据框中的数字特征列表以在其旁边显示直方图和摘要统计信息。我正在使用plt.figtext()显示统计信息,但出现错误

num_features=[n1,n2,n3]

for i in num_features:
    fig, ax = plt.subplots()
    plt.hist(df[i])
    plt.figtext(1,0.5,df[i].describe() )
    ax.set_title(i)
    plt.show()

当我这样做时,我会收到一条错误/警告消息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

如果使用df[n].mean()而不是describe(),则效果很好

我在做什么错?有没有更好的方法来打印图并在其旁边显示一些统计信息?

3 个答案:

答案 0 :(得分:3)

您可以通过使用describe()to_string()返回的数据帧格式化为字符串来“简化”代码:

df = pd.DataFrame(np.random.normal(size=(2000,)))
fig, ax = plt.subplots()
ax.hist(df[0])
plt.figtext(0.1,0.5, df.describe().to_string())
plt.figtext(0.75,0.5, df.describe().loc[['mean','std']].to_string())

enter image description here

答案 1 :(得分:1)

如上面的解决方案所示,文本格式有点混乱。为了解决这个问题,我添加了一种解决方法,将描述分为两个图,然后将它们对齐。

助手:

def describe_helper(series):
    splits = str(series.describe()).split()
    keys, values = "", ""
    for i in range(0, len(splits), 2):
        keys += "{:8}\n".format(splits[i])
        values += "{:>8}\n".format(splits[i+1])
    return keys, values

现在绘制图形:

demo = np.random.uniform(0,10,100)
plt.hist(demo, bins=10)
plt.figtext(.95, .49, describe_helper(pd.Series(demo))[0], {'multialignment':'left'})
plt.figtext(1.05, .49, describe_helper(pd.Series(demo))[1], {'multialignment':'right'})
plt.show()

如果在保存图像时还想保存无花果,请更改bbox_inches:

plt.savefig('fig.png', bbox_inches='tight')

答案 2 :(得分:0)

根据反馈添加了此选项,现在可以正常使用了。

for i in num_cols:
#calculate number of bins first based on Freedman-Diaconis rule
    n_counts=df[i].value_counts().sum()
    iqr=df[i].quantile(0.75)-df[i].quantile(0.25)
    h = 2 * iqr * (n_counts**(-2/3))
    n_bins=(df[i].max()-df[i].min()).round(0).astype(np.int64)

    fig, ax = plt.subplots()
    plt.hist(df[i],bins=15)
    plt.figtext(1,0.5,s=t[i].describe().to_string())
    plt.show()