【问题标题】:How to plot categorical data with seaborn setting the plot-style for each data column?如何使用 seaborn 为每个数据列设置绘图样式来绘制分类数据?
【发布时间】:2020-06-03 12:06:53
【问题描述】:

背景

假设我有以下数据集:

import pandas as pd
import numpy as np

data = ([["Cheese", x] for x in np.random.normal(0.8, 0.03, 10)] + 
        [["Meat", x] for x in np.random.normal(0.4, 0.05, 14)] + 
        [["Bread", 0.8], ["Bread", 0.65]])

df = pd.DataFrame(data, columns=["Food", "Score"])


import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
sns.set_context("paper")
sns.catplot(x="Score", y="Food", kind="box", data=df)

产生以下图(或类似图,取决于生成的随机数):

我要使用实际数据绘制箱线图的原因是,单个点与我想要显示的类别数量相结合,使图表在视觉上过于嘈杂,并且这些框可以很好地概述数据的总体情况分发,这就是我所追求的。但是,问题在于“面包”类别等类别。

问题

如您所见,seaborn 为所有三个类别制作了具有中位数、四分位数等的盒子。但是,由于“面包”类别只有两个数据点,因此使用箱线图表示该类别并不是真正合适的表示。我宁愿将仅此类别作为单独的点。

但是在查看 https://seaborn.pydata.org/tutorial/categorical.html 上的示例时,将箱线图和简单点结合起来的唯一建议是为所有类别绘制 both,这不是我所追求的。 p>

简而言之:如何使用 seaborn 绘制分类数据,为每个类别选择适当的表示?

【问题讨论】:

    标签: python matplotlib plot seaborn


    【解决方案1】:

    也许尝试为面包而不是面包创建 df:

    dfb = df[df['Food'].notnull() & (df['Food'] == 'Bread')]
    dfnot_b = df[df['Food'].notnull() & (df['Food'] != 'Bread')]
    

    然后添加另一个轴:

    fig, ax = plt.subplots()
    ax2 = ax.twinx()
    

    尝试不同的情节:

    sns.boxplot(x="Score", y="Food", data=dfnot_b, ax=ax)
    sns.stripplot(x="Score", y="Food", data=dfb, ax=ax2)
    

    【讨论】:

    • 第二个轴的好主意。虽然现在“面包”类别没有任何垂直空间。
    • @NOhs 在sns.boxplot 函数中,您可以设置width=0.2 以腾出一些空间。
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2015-12-31
    • 2018-07-05
    • 2014-05-12
    • 1970-01-01
    • 2019-07-29
    • 2019-02-03
    • 2020-06-22
    相关资源
    最近更新 更多