python - 根据数据点的数量在同一轴上绘制 swarmplot 或箱线图
问题描述
我有一个包含几列的数据框,其中每列有 5 到 2535 个条目(其余为 NAN)。当列有超过 9 个数字条目时,我想绘制一个箱线图,否则绘制一个 swarmplot。我用我疯狂的绘画技巧来创建一个例子。
问题是我只能将两者都绘制为叠加层,如本例所示。我尝试使用 position 关键字,但这仅适用于箱线图,不适用于 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)
解决方案
您可以创建数据框的两份副本,一份用于箱线图,一份用于群图。然后,在每个副本中,将您不想以这种方式绘制的列中的值设置为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
,但会在它们所在的位置留出空间。箱线图会发生相反的情况,从而保留您的列顺序。
上述代码生成的图表如下所示:
这种方法也适用于具有非数字标签的列:
推荐阅读
- android - 在 android studio 4.0 上没有检测到可调试的进程
- json - 如何在 JSON 文件中使用变量作为前缀
- assembly - 在 RISCV 内存中加载 32 位立即数
- python - Python 的 json.dump() 不会导致开始 '[' 括号和结束 ']' 括号
- scheme - 如何在 Guile 中更改引用值的内容
- python - 用于读取特定 .csv 语法的 RegEx 表达式
- c# - IE 打开新选项卡 about:blank 而不是网页
- angular - 如何将父标题更改为Angular中子标题的值?
- python - 如何在opencv SelectROI函数中更改边界框的颜色
- python - 用于智能数据生成的 Python 库