python - 根据数据点的数量在同一个坐标轴上绘制 swarmplot 或 boxplot

标签 python matplotlib seaborn boxplot

我有一个包含多列的数据框,其中每列有 5 到 2535 个条目(其余为 NAN)。当列有超过 9 个数字条目时,我想绘制一个箱线图,否则绘制一个群图。我用我疯狂的绘画技巧创造了一个例子。 enter image description here

问题是我只能将两者绘制为叠加层,如 this example .我尝试使用 position 关键字,但这只适用于箱线图,不适用于群图。那么,如何才能做到这一点?

可以像这样生成示例数据集:

np.random.seed(1)
df = pd.DataFrame(np.nan, index=range(100), columns=range(11))
for i, column in enumerate(df.columns):
    if i % 2 == 0:
        fill_till = np.random.randint(1,11)
        df.loc[:fill_till-1,column] = np.random.random(fill_till)
    else:
        fill_till = np.random.randint(11,101)
        df.loc[:fill_till-1,column] = np.random.random(fill_till)

最佳答案

您可以创建数据框的两份副本,一份用于箱形图,一份用于群图。然后,在每个副本中,将您不想以这种方式绘制的列中的值设置为nan

col_mask = df.count() > 9
swarm_data = df.copy()
swarm_data.loc[:, col_mask] = np.nan
box_data = df.copy()
box_data.loc[:, ~col_mask] = np.nan

然后将每个复制的数据帧传递给适当的 seaborn 函数。

sns.swarmplot(data=swarm_data)
sns.boxplot(data=box_data)
plt.show()

创建群图时,seaborn 不会为填充有 nan 的列绘制任何内容,但会在它们所在的位置留出空间。箱形图会发生相反的情况,从而保留您的列顺序。

上面代码生成的图表是这样的:

enter image description here

这种方法也适用于带有非数字标签的列:

enter image description here

关于python - 根据数据点的数量在同一个坐标轴上绘制 swarmplot 或 boxplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51056844/

相关文章:

python - PySide QGLBuffer 分配输入数据

python - 无法运行 Pybrain 教程

python - 在 python/matplotlib 中返回复合图形对象

python - 将日期代码添加到 matplotlib/python 图表

python - 如何在Python中用点覆盖水平条形图?

python - 更改 Seaborn 热图颜色条的高度

python - 如何在 pandas 中添加一个日期列,在给定开始日期时间戳的情况下每行增加一小时?

python - 构建演示版本.exe

python - 使用 seaborn/matplotlib boxplot 时的刻度频率

python - bin 大小 seaborn 联合图