春江暮客

春江暮客的个人学习分享网站

python绘制好看的棒棒糖图

2024-05-31 技术
python绘制好看的棒棒糖图

如果你觉得柱状图太重、散点图又不够直观,棒棒糖图通常是一个更轻、更清晰的折中方案。尤其在科研图、分类比较图或者样本数量不算太多的场景里,它很容易做出既清楚又美观的效果。

这篇文章直接解决 3 个实际问题:

  1. 棒棒糖图适合拿来展示什么数据
  2. 如何用 matplotlib 画出一个基础但好看的版本
  3. 输出后应该检查哪些细节,避免图虽然画出来了但可读性差

棒棒糖图介绍

在棒棒糖图中,每个数据点通过一个“棒棒糖”来表示,包含一条线(棒)和线末端的一个圆点(糖果)。线的长度表示数值的大小,而圆点则突出了具体的数据点。这种格式特别适合比较有限数量的类别或时间点,使其成为生物学、医学和环境科学等领域数据可视化的优秀选择。

棒棒糖图的主要优点在于其能够清晰地传达信息而不使观众感到困惑。通过将注意力集中在单个数据点上,棒棒糖图减少了视觉杂乱,使观众更容易区分不同类别之间的差异。这在向包括研究人员、从业者和政策制定者在内的广泛受众展示复杂数据集时尤为有用。

此外,棒棒糖图可以通过颜色编码、注释和其他图形元素进行自定义,以增强可解释性。例如,不同颜色可以代表各种实验条件,而注释可以为特定数据点提供上下文。这些特性使棒棒糖图成为突出关键发现和趋势的多功能工具。

Python代码绘图

首先我们假设有这么的一组数据, 细胞类型’ILC2’, ‘B cell’, ‘Neutrophil’, ‘Macrophage’, ‘NK NKT’, ‘T cell’, ‘Dendritic cell’, ‘Mast cell’, ‘Monocyte’,绘图时通过线段加上散点图的形式叠加得到,上代码

import matplotlib.pyplot as plt

# 设置数据
cell_types = ['ILC2', 'B cell', 'Neutrophil', 'Macrophage', 'NK NKT', 'T cell', 'Dendritic cell', 'Mast cell', 'Monocyte']
shared_tissues = [7, 6, 4, 4, 3, 2, 1, 1, 0]
colors = ['red', 'lightblue', 'yellow', 'orange', 'blue', 'green', 'brown', 'pink', 'grey']

# 开始绘图
fig, ax = plt.subplots()

# 绘制水平线
for i, (ct, st) in enumerate(zip(cell_types, shared_tissues)):
    ax.hlines(y=ct, xmin=0, xmax=st, color=colors[i], linewidth=2, label=ct)

# 散点
scatter = ax.scatter(shared_tissues, cell_types, s=100, c=colors, edgecolors='black')

# 添加数值
for i, txt in enumerate(shared_tissues):
    ax.annotate(txt, (shared_tissues[i], cell_types[i]), xytext=(5, -5), textcoords='offset points')

ax.set_xlabel('Cells ')
ax.set_ylabel('')
ax.grid(True, which='both', color='gray', linestyle='--', linewidth=0.5)
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.tight_layout(rect=[0, 0, 0.85, 1])
plt.savefig('lolipython.webp', bbox_inches='tight')

结果 python棒棒糖图

代码里最值得调整的几个点

如果你想把这张图用于正式展示,通常优先改这几项:

  1. fig, ax = plt.subplots() 中增加 figsize,避免类别多时标签太挤
  2. 调整 s=100 控制圆点大小,避免点过大遮住数值
  3. 根据分类数量重新设计 colors,尽量避免过亮或对比不足的颜色
  4. 如果图例信息重复过多,可以去掉 label=ct 或改成分组图例

对于分类很多的数据,水平棒棒糖图通常比竖向更好读,这也是这段示例代码采用 hlines 的原因。

如何检查图是否足够清晰

绘图完成后,建议至少看这几件事:

  1. 类别标签是否完整显示,没有被截断
  2. 数值标注是否和圆点重叠
  3. 图例是否真的有必要,还是只会增加视觉负担
  4. 导出的图片在论文、PPT 或网页中缩小后是否依然清楚

如果准备投到论文或报告里,建议同时导出一个高分辨率版本,例如:

plt.savefig('lolipython.png', dpi=300, bbox_inches='tight')

常见问题

1. 标签太多,图看起来很乱

最常见的处理方式是:

  1. 改成水平布局
  2. 按数值排序后再绘图
  3. 只保留最关键的前几类

2. 颜色太花,图不够专业

科研图不一定颜色越多越好。更稳妥的做法是:

  • 用同色系深浅变化
  • 只给重点类别单独高亮
  • 保持背景和网格线尽量克制

3. 保存出来的图片边缘被裁切

通常是布局太紧。

修复:

  • 保留 bbox_inches='tight'
  • 适当增加 tight_layout 的边距
  • 图例放到图外时,给右侧留出空间

延伸阅读

总结

总体而言,棒棒糖图是一种强大且灵活的可视化技术,能够有效地传达科学数据,促进更好的理解,并支持研究及其他领域的知情决策。 本文通过使用matplotlib库,通过线条加上散点的方式叠加生成了棒棒糖图,实现了美观的科研图。另外,新版的Chatgpt真的太强了,可以直接上传代码让其修改代码,简直不要太方便。

友情链接

其它