本文简单介绍使用python中的seaborn模块绘制精美的科技图表。

我前面写了一堆使用ImageJ和Python的教程,input是成像数据,output通常是一张数据表格。但发表论文时需要绘制科技图表,所以这套数据分析流程还存在 gap。有了提炼后的统计数据表格,大家可以使用自己熟悉的方式去绘制图表,比如 OriginLab 或者 GraphPad 之类的。

Python 代码绘制图表与 OriginLab 等基于用户操作界面的工具相比,具有非常高的灵活性,可以更好地控制图表的创建过程,获得高度自定义的精美图表。还具有良好的可重复性,Python 脚本可以轻松地被再次运行或共享给他人,确保结果的一致性和可重现性。但 python 作图的缺点就是要会编程。假如你已经较好地掌握了 python 编程,那么进一步使用 python 作图就是顺其自然的过程。

为了大家不走弯路,我这里先介绍 seaborn 模块用于绘制一些基础又精美的图表。

seaborn 作图模块高度适配 pandas 模块的 DataFrame 对象,这也是前面我通常会把各种分析结果整理到 DataFrame 的原因(另一个原因是方便保存为电子表格文件发给合作者作图)。事实上除了 seaborn,其它主流的一些作图模块(如 plotly)都很好地支持以 DataFrame 作为输入。因此,我这里可以先介绍下 DataFrame。

从我个人不专业的角度介绍一下:数据表是一类常见的数据结构,具备行列结构。但是跟矩阵不同的是,数据表每一行可以代表不同的对象(或者说某一次测量),而每一列可以代表不同的属性(该次测量的不同观测项)。举个例子:我们对班级的同学进行体检信息统计,某一行就是特定某个同学,某一列就是身高,体重这种属性。

了解数据表的这个特点,一方面在整理数据的时候,我们可以更加规范,另外一方面也能够更加方便地作图。

我们可以分析下seaborn中一个简单示例:


其对应的代码如下:

import seaborn as sns
sns.set_theme(style="ticks", palette="pastel")

# Load the example tips dataset
tips = sns.load_dataset("tips")

# Draw a nested boxplot to show bills by day and time
sns.boxplot(x="day", y="total_bill",
            hue="smoker", palette=["m", "g"],
            data=tips)
sns.despine(offset=10, trim=True)

其中 tips 就是一个 DataFrame,然后在作图(sns.boxplot命令) 时,x="day" 就是直接指定某一列的名称(column name),以此类推,参数 y 和 hue 都是指定数据表中的某一列。hue在这里主要是分组的作用,然后不同的分组可以使用 palette(调色板)来控制颜色,注意调色板颜色数据量要和分组数量一致。sns.despine 命令就是让坐标轴分离。而整个作图的基本样式,这里使用了 sns.set_theme 来调用了内置的一套设置,自动设定线宽,字体和大小等等。

作图基本样式可以自定义,以适配自己的作图风格或者需求。这里我把自己多年使用的一套自定义样式分享出来:

该部分仅登录用户可见

通过 sns.set_context 命令可以精确地设置图表的各种线宽线长和字体字号,保证你后面所有作图的结果都是一致的。然后具体作图时,我习惯于使用 matplotlib 进行更基础的一些控制(因为seaborn其实只是在matplotlib基础上的高级封装)。例如我绘制 bar 图常见的作图代码模板如下:
该部分仅登录用户可见

简单解释一下:

  1. 共有四种样品需要比较面积,每种样品指定一种颜色
  2. 使用 plt.figure 控制整体图表的大小
  3. sns.barplot 绘制bar图,通过参数ci 指定 errorbar 引用SD值,并通过 capsize, errwidth, errcolor 来控制 errorbar的样式
  4. 通过 alpha 控制 bar 图的透明度
  5. 通过 order 控制 bar 的顺序
  6. 通过 plt.ylabel 修改 y坐标轴标签
  7. 通过 plt.xticks 中的 rotation 控制x轴ticks的旋转
  8. plt.tight_layout 自动完成紧凑排版
  9. plt.savefig 中保存为 svg 格式的矢量图,方便放到矢量作图软件(如 Adobe Illustrator )中与其它论文图表整合排版

其实不同的图表类型,还有各种不同控制命令和方法,这些都可以在seaborn 或者 matplotlib 的 gallery 中查看类似的图表的示例来查看。另外也可以咨询ChatGPT之类的AI,它们在生成绘制常规图表的python代码方面还是很给力的。

最后修改:2024 年 09 月 29 日
请大力赞赏以支持本站持续运行!