python - 在python中创建一个打包的气泡/散点图(基于大小的抖动以避免重叠)
问题描述
我遇到了许多与散点图/群图非常相似的图(页尾) ,这些图会抖动 y 轴以避免重叠的点/气泡。
如何根据给定的一组 x 和 z 值(点大小)获取 y 值(理想情况下在数组中)?
我找到了 pythoncirclify
库,但它并不是我想要的。
编辑:对于这个项目,我需要能够输出x, y and z
值,以便可以在用户选择的工具中绘制它们。因此,我对生成 y 坐标而不是实际绘图的解决方案更感兴趣。
解决方案
回答:
您在文本中描述的内容被称为 a swarm plot
(or beeswarm plot
),并且有这些的 python 实现(尤其是seaborn),但也有,例如,在R中。也就是说,这些图允许调整每个数据点的 y 位置,因此它们不会重叠,而是紧密排列。
讨论:
但是你展示的图不是标准的群体图(几乎总是有奇怪的“手臂”),而是似乎由某种类型的物理引擎驱动,它允许沿着 x 和 y 运动,这会产生您在图中看到的紧凑结构(例如,像蜘蛛网上的水滴)。
也就是说,在上图中,通过想象仅沿垂直轴移动点以便更好地打包,您可以看到,在大多数情况下,您实际上无法做到这一点。(老实说,也许显示的数据可以打包得更好一些,但不是很明显——例如,左边的第一条手臂无法改进,如果它们中的任何一个可以,它只能通过向内移动一两个点)。相反,要获得像你展示的那样的情节,你需要一些运动x
,就像某种类型的物理引擎给出的那样,它希望保持 x 接近其原始值,但也允许一些变化。但这是一个需要在数据级别而不是编程级别来决定的权衡。
例如,这是一个绘图库 RAWGraphs,它会生成一个紧凑的蜂群图,就像问题中的政治图一样:
但至关重要的是,他们给出了警告:
“重要的是要记住,Beeswarm 图使用力来避免视觉模型的单个元素之间的碰撞。虽然这有助于查看可视化中的所有圆圈,但它也会创建一些案例其中圆圈没有放置在它们应该在 X 轴的线性刻度上的确切位置。”
或者,类似地,在此 D3 包的注释中:“其他实现使用力布局,但力布局模拟自然会尝试通过沿两个轴推动数据点来达到平衡,这可能会破坏数据的排序。” 这是一个基于 D3 力布局的精彩演示,其中滑块调整将点拉到正确值的相对力。
因此,该图是群体图和小提琴图(显示分布包络的平滑平均值)之间的折衷,但是这两个图都给出了数据的真实表示,并且在这些图中,这些紧密排列的图表示代价是对单个数据点的 x 位置的错误表示。它们的优势似乎是您可以着色并单击各个点(如果您愿意,可以在其中提供实际的 x 数据,尽管在链接图中没有这样做)。
就个人而言,我真的很犹豫以某种未知的方式歪曲数据(这是物理引擎计算的结果,但对读者来说并不明显)。也许一个更好的折衷方案是一把充满非圆形补丁的小提琴,或者类似Raincloud 情节的东西。
推荐阅读
- javascript - 如何发送带有嵌入式附件的电子邮件 - 图像(laravel imap)
- python - Dockerfile,如何将文件修改为Docker内部的pip包
- javascript - 我是否需要分解声明以使用 d3.js 中的侦听器更新图表?
- python-3.x - 继承类中的方法
- nginx - 使用 nginx 生成文件内容
- python - 如何在 Conda 上添加显式 pip 依赖项
- reactjs - 如何为我的 react 项目创建一个全局 CSS 文件以应用于所有组件?
- authentication - Blazor WebAssembly 用于在标头中自动发送 Google 身份验证信息(即 id 令牌和访问令牌),但现在不
- azure - 如何在 Azure 数据工厂中编写筛选条件
- hadoop - 尽管使用 EJ001 运行 oozie-setup.sh sharelib,但 Oozie 工作流示例失败