首页 > 解决方案 > 在python中创建一个打包的气泡/散点图(基于大小的抖动以避免重叠)

问题描述

我遇到了许多与散点图/群图非常相似的图(页尾) ,这些图会抖动 y 轴以避免重叠的点/气泡。

如何根据给定的一组 x 和 z 值(点大小)获取 y 值(理想情况下在数组中)?

我找到了 pythoncirclify库,但它并不是我想要的。

我正在尝试创建的示例

在此处输入图像描述

编辑:对于这个项目,我需要能够输出x, y and z值,以便可以在用户选择的工具中绘制它们。因此,我对生成 y 坐标而不是实际绘图的解决方案更感兴趣。

标签: pythonmatplotlib

解决方案


回答:
您在文本中描述的内容被称为 a swarm plot(or beeswarm plot),并且有这些的 python 实现(尤其是seaborn),但也有,例如,在R中。也就是说,这些图允许调整每个数据点的 y 位置,因此它们不会重叠,而是紧密排列。

Seaborn 群情节

在此处输入图像描述

讨论:
但是你展示的图不是标准的群体图(几乎总是有奇怪的“手臂”),而是似乎由某种类型的物理引擎驱动,它允许沿着 x 和 y 运动,这会产生您在图中看到的紧凑结构(例如,像蜘蛛网上的水滴)。

也就是说,在上图中,通过想象仅沿垂直轴移动点以便更好地打包,您可以看到,在大多数情况下,您实际上无法做到这一点。(老实说,也许显示的数据可以打包得更好一些,但不是很明显——例如,左边的第一条手臂无法改进,如果它们中的任何一个可以,它只能通过向内移动一两个点)。相反,要获得像你展示的那样的情节,你需要一些运动x,就像某种类型的物理引擎给出的那样,它希望保持 x 接近其原始值,但也允许一些变化。但这是一个需要在数据级别而不是编程级别来决定的权衡。

例如,这是一个绘图库 RAWGraphs,它会生成一个紧凑的蜂群图,就像问题中的政治图一样:

在此处输入图像描述

但至关重要的是,他们给出了警告:
“重要的是要记住,Beeswarm 图使用力来避免视觉模型的单个元素之间的碰撞。虽然这有助于查看可视化中的所有圆圈,但它也会创建一些案例其中圆圈没有放置在它们应该在 X 轴的线性刻度上的确切位置。”

或者,类似地,在此 D3 包的注释中:“其他实现使用力布局,但力布局模拟自然会尝试通过沿两个轴推动数据点来达到平衡,这可能会破坏数据的排序。” 这是一个基于 D3 力布局的精彩演示,其中滑块调整将点拉到正确值的相对力。

因此,该图是群体图和小提琴图(显示分布包络的平滑平均值)之间的折衷,但是这两个图都给出了数据的真实表示,并且在这些图中,这些紧密排列的图表示代价是对单个数据点的 x 位置的错误表示。它们的优势似乎是您可以着色并单击各个点(如果您愿意,可以在其中提供实际的 x 数据,尽管在链接图中没有这样做)。

Seaborn小提琴剧情

在此处输入图像描述

就个人而言,我真的很犹豫以某种未知的方式歪曲数据(这是物理引擎计算的结果,但对读者来说并不明显)。也许一个更好的折衷方案是一把充满非圆形补丁的小提琴,或者类似Raincloud 情节的东西。


推荐阅读