繁体   English   中英

根据数据点的数量,在同一个ax中绘制swarmplot或boxplot

[英]Plot swarmplot or boxplot in the same ax depending on number of datapoints

我有一个包含多个列的数据框,其中每列有5到2535个条目(其余为NAN)。 当列有超过9个数字条目时,我想绘制一个boxplot,否则就是swarmplot。 我用疯狂的绘画技巧创造了一个例子。 在此输入图像描述

问题是我只能将两者都绘制为叠加层,如本例所示 我尝试使用position关键字,但这仅适用于boxplot,而不适用于swarmplot。 那么,怎么做呢?

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

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)

您可以创建数据框的两个副本,一个用于框图,另一个用于swarm图。 然后,在每个副本中,将您不想以这种方式绘制的列中的值设置为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()

在创建swarm plot时,seaborn将为填充nan的列填充任何内容,但会留下空间。 方框图会发生相反的情况,从而导致您的列顺序被保留。

上面代码生成的图表如下所示:

在此输入图像描述

此方法也适用于具有非数字标签的列:

在此输入图像描述

要详细说明这些评论,这里有一个基本的例子(因为你没有提供玩具数据集 ,很难构建一个反映你的情况的玩具数据集 )。

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

#column order
real_order = ["B", "D", "A", "E", "C"]
#first data set
x1 = ["A", "C", "B"]
y1 = [9,     3,   1]
#second dataset
x2 = ["D", "C", "E", "A"]
y2 = [2,    11,   4,   5]

#prepare the axis
plt.plot(real_order, np.repeat(np.nan, len(real_order)))
#fill in bars 
plt.bar(x1, y1, color = "r", label = "bars")
#fill in markers
plt.plot(x2, y2, "b*", label = "markers")
plt.legend()
plt.show()

输出:

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM