matplotlib 创建压缩气泡图/散点图

qzlgjiam  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(117)

我遇到过一些plots (end of page),它们非常类似于散点图/群图,它们抖动y轴以避免重叠的点/气泡。
如何根据给定的x和z值(点大小)获取y值(理想情况下在数组中)?
我找到了python circlify库,但它不是我要找的。
Example of what I am trying to create
x1c 0d1x的数据
编辑:对于这个项目,我需要能够输出的x, y and z值,使他们可以在用户的选择工具绘制。因此,我更感兴趣的解决方案,而不是产生的y坐标的实际图。

hfyxw5xn

hfyxw5xn1#

答:
您在文本中描述的内容被称为swarm plot(或beeswarm plot),并且有这些的python实现(特别是参见seaborn),但也有,例如,在R中。也就是说,这些图允许调整每个数据点的y位置,以便它们不重叠,但否则会紧密堆积。
Seaborn swarm plot
x1c 0d1x的数据
讨论内容:
但是你展示的图并不是标准的蜂群图(几乎总是有奇怪的“手臂”),而是似乎是由某种物理引擎驱动的,它允许沿着沿着x和y方向运动,这会产生你在图中看到的 Package 良好的结构(例如,像蜘蛛网上的水滴)。
也就是说,在上面的图中,通过想象只沿着垂直轴沿着移动点,这样它就可以更好地打包,你可以看到,在大多数情况下,你真的做不到。(老实说,也许显示的数据可以 Package 得更好一点,但不是戏剧性的-例如,从左边的第一个手臂不能改善,如果他们中的任何一个可以,相反,要得到像你展示的那样的图,你需要在x中进行一些运动,就像某种物理引擎所提供的那样,希望它能使x接近其原始值,但也允许一些变化。但这是一个需要在数据级别而不是编程级别上决定的权衡。
例如,here's是一个绘图库RAWGraphs,它可以生成一个紧凑的蜂群图,就像问题中的Politico图一样:



但关键的是,他们给予警告:
“重要的是要记住,Beeswarm图使用力来避免可视化模型的单个元素之间的碰撞。虽然这有助于查看可视化中的所有圆,但它也会产生一些情况,其中**圆没有放置在X轴线性尺度上的确切位置。”
或者,类似地,在this D3 package的注解中:“其他实现使用力布局,但力布局模拟自然会尝试通过沿沿着两个轴推动数据点来达到平衡,这可能会破坏数据的排序。”和here's a nice demo based on D3 force layout,其中滑块调整将点拉到正确值的相对力。
因此,这个情节是蜂群情节和小提琴情节之间的妥协(其示出了分布包络的平滑平均值),但是这两个图给予数据的诚实表示,并且在这些图中,这些紧凑的情节表示是以x的错误表示为代价的,它们的优点似乎是你可以在单个点上着色和点击(如果你愿意,你可以给予实际的x数据,尽管在链接的图中没有这样做)。
Seaborn violin plot



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

jecbmhm3

jecbmhm32#

我创建了an Observable notebook来计算具有可变大小圆的蜂群图的y值。下图给出了结果的示例。
x1c 0d1x的数据
如果需要在脚本中使用JavaScript代码,那么复制并粘贴AccurateBeeswarm类的代码应该很简单。
该算法简单地一个接一个地放置点,尽可能靠近x=0的线,同时避免重叠。还有一些选项可以添加一点随机性来改善外观。x值永远不会改变;这是这种方法相对于力导向算法(如RAWGraphs使用的算法)的一大优势。

相关问题