我遇到过许多图(页末),它们与散点图/群图非常相似,它们会抖动 y 轴以避免重叠的点/气泡。
如何根据给定的一组 x 和 z 值(点大小)获取 y 值(最好是数组)?
我找到了 python
circlify
库,但它并不完全是我想要的。
编辑:对于这个项目,我需要能够输出
x, y and z
值,以便可以在用户选择的工具中绘制它们。因此,我对生成 y 坐标的解决方案更感兴趣,而不是实际的绘图。
答案:
您在文本中描述的内容被称为
swarm plot
(或 beeswarm plot
),并且有这些的 python 实现(特别是参见 seaborn),但也有,例如,在 R 中。也就是说,这些图允许调整每个数据点的 y 位置,这样它们就不会重叠,但在其他方面会紧密排列。
讨论:
但是您显示的图不是标准的群图(几乎总是有看起来怪异的“手臂”),而是似乎由某种类型的物理引擎驱动,该引擎允许沿 x 和 y 运动,从而产生您在图中看到的紧密排列的结构(例如,像蜘蛛网上的水滴)。
也就是说,在上图中,通过想象仅沿垂直轴移动点以使其包装得更好,您可以看到,在大多数情况下,您实际上无法做到这一点。 (老实说,也许显示的数据可以包装得更好一些,但不会太显着——例如,左边的第一条手臂无法改进,如果其中任何一个可以改进,也只能通过向内移动一两个点来实现) )。相反,为了得到像你展示的那样的图,你需要在
x
中进行一些运动,就像某种类型的物理引擎给出的那样,它希望使 x 接近其原始值,但也允许一些变化。但这是需要在数据级别而不是编程级别上决定的权衡。
例如,这里是一个绘图库,RAWGraphs,它会生成一个紧凑的蜂群图,就像问题中的 Politico 图一样:
但至关重要的是,他们发出了警告:
“重要的是要记住,Beeswarm 图使用力来避免视觉模型的单个元素之间的碰撞。虽然这有助于查看可视化中的所有圆圈,但它也会造成一些情况,其中 圆圈未放置在可视化中它们应该位于 X 轴线性刻度上的确切位置。”
这个 D3 包中的注释中:“其他实现使用力布局,但力布局模拟自然会尝试通过沿两个轴推动数据点来达到平衡,这可能会破坏数据点的顺序数据。” 这是一个基于 D3 力布局的精彩演示,其中滑块调整将点拉至正确值的相对力。
因此,该图是群图和小提琴图(显示分布包络线的平滑平均值)之间的折衷方案,但这两个图都真实地表示了数据,并且在这些图中,这些紧密排列的图表示的代价是错误表示各个数据点的 x 位置。它们的优点似乎是您可以对各个点进行着色并单击(如果您愿意,您可以在其中提供实际的 x 数据,尽管这在链接图中没有完成)。
Seaborn 小提琴情节:
就我个人而言,我真的很犹豫是否以某种未知的方式歪曲数据(这是物理引擎计算的结果,但对读者来说并不明显)。也许更好的折衷方案是使用充满非圆形补丁的小提琴,或者类似Raincloud情节。
一个可观察的笔记本来计算具有可变大小圆圈的蜂群图的 y 值。下图给出了结果示例。
如果您需要在脚本中使用 JavaScript 代码,则可以直接复制并粘贴AccurateBeeswarm
类的代码。该算法只是将点逐一放置,尽可能靠近 x=0 线,同时避免重叠。还可以选择添加一点随机性来改善外观。 x 值永远不会改变;这是这种方法相对于力导向算法(例如 RAWGraphs 使用的算法)的一大优势。