在python中创建压缩气泡/散点图(基于大小的抖动以避免重叠)

2024-10-02 02:39:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一些plots (end of page)非常类似于散射/群图,它们抖动y轴以避免重叠点/气泡

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

我找到了python circlify库,但它不是我想要的

Example of what I am trying to create

enter image description here

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


Tags: oftoexamplepage情况数组amwhat
2条回答

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

Seaborn swarm plot

enter image description here

讨论:
但你展示的图不是标准的swarm图(几乎总是有奇怪的“手臂”),而是由某种物理引擎驱动的,这种引擎可以沿x和y移动,从而产生你在图中看到的密集结构(例如,像蜘蛛网上的水滴)

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

例如,here's一个绘图库RAWGraphs,它生成一个紧凑的蜂群图,就像问题中的政治图:

enter image description here

但关键的是,他们给出了警告:
“重要的是要记住,蜂群图使用力来避免视觉模型的单个元素之间的碰撞。这有助于在可视化中看到所有的圆,但也会造成一些情况,圆没有放置在X轴线性比例上它们应该位于的确切位置。”

或者,类似地,在本this D3 package中的注释中:“其他实现使用强制布局,但强制布局模拟自然会试图通过沿两个轴推动数据点来达到平衡,这可能会破坏数据的顺序。”和here's a nice demo based on D3 force layout其中滑块调整将点拉至正确值的相对力

因此,该图是swarm图和Vionish图(显示分布包络的平滑平均值)之间的折衷,但这两个图都给出了数据的真实表示,在这些图中,这些密密麻麻的图表示是以单个数据点的x位置错误表示为代价的。它们的优点似乎是,您可以对各个点进行着色和单击(如果需要,您可以在其中提供实际的x数据,尽管链接图中没有这样做)

Seaborn violin plot

enter image description here

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

我创建了an Observable notebook来计算具有可变大小圆的蜂群图的y值。下图给出了一个结果示例

A beeswarm plot generated using the Observable notebook

如果需要在脚本中使用JavaScript代码,那么复制和粘贴AccurateBeeswarm类的代码应该很简单

该算法简单地将点逐个放置,尽可能靠近x=0线,同时避免重叠。还可以选择添加一点随机性来改善外观。x值永远不会改变;这是该方法相对于RAWGraphs使用的力定向算法的一大优势

相关问题 更多 >

    热门问题