科研绘图

目录

一些原则

  • 分为表示概念的示意图、表示结果的数据图表
  • 数据图表
    • 优先使用位置表示数量,其次是长度、面积
    • 尽量不用饼图(除非必须表示占比)
    • 颜色不是第一选择(灰色极易误导,建议使用 viridis)
    • 使用三段式表格
  • 示意图
    • 插图比工程图、照片好
  • 图片格式
    • 位图更保险
      • jpg对色彩支持好,适用于照片
      • png对形状支持好,适用于示意图
      • 期刊一般要求分辨率大于 300 dpi
    • 矢量图跨平台支持差,当仍是学术期刊首选
      • pdf优先
      • svg字体可能出现问题、eps过时

美观性问题

  • 图框、文本、线条之前的布局和颜色的协调
  • 文本
    • 中文使用宋体或黑体
    • 英文使用 Arial 或 Times New Roman
    • 一篇文章中所有图片的字体、字号尽量一致
      • 图片字号不大于正文字号
      • 先文后图
    • 一张图片中所有字体必须一致
      • 用颜色、加粗来强调

技巧性问题

Matplotlib 中的中文显示

一般情况下,matplotlib 无法直接显示中文,需要通过设置字体来实现。 可以使用Clarmy/mplfonts: Fonts manager for matplotlib (github.com)便捷地解决这个问题。

首先,在命令行中进行安装和设置:

# 1. 安装
pip install mplfonts
# 2. 设置
mplfonts init

之后,即可在python代码中使用指定的中文字体:

from mplfonts import use_font

use_font('Noto Serif CJK SC')

# 其他绘图代码	
  • Noto Sans Mono CJK SC:Noto等宽黑体
  • Noto Serif CJK SC:Noto宋体
  • Noto Sans CJK SC:Noto黑体
  • Source Han Serif SC:思源宋体
  • Source Han Mono SC:思源等宽宋体

在 Matplotlib 中匹配数据点和拟合线的颜色

在使用 Matplotlib 绘制数据时,为了图表的清晰度和美观性,常常希望数据点和相应的拟合线使用相同的颜色。 这里介绍一种简洁且高效的方法,利用 Matplotlib 的内置功能,实现颜色的自动匹配而无需硬编码。

示例代码

import random
import numpy as np
import matplotlib.pyplot as plt
import scienceplots

plt.style.use('science')

# 生成数据
x1 = range(10)
y1 = [x + random.randint(1, 2) for x in x1]
y1_fit = np.polyfit(x1, y1, 1)

x2 = range(-2, 8)
y2 = [x + random.randint(1, 5) for x in x2]
y2_fit = np.polyfit(x2, y2, 1)

# 绘制数据点
plt.plot(x1, y1, 'o', label='data 1')
plt.plot(x2, y2, 'o', label='data 2')

# 获取当前图形中所有线的颜色
colors = [line.get_color() for line in plt.gca().lines]

# 使用相同的颜色绘制拟合线
plt.plot(x1, np.polyval(y1_fit, x1), '--', color=colors[0], label='fit 1')
plt.plot(x2, np.polyval(y2_fit, x2), '--', color=colors[1], label='fit 2')

plt.legend()
plt.show()

核心代码解释

在这段代码中,关键部分是如何获取并使用颜色:

# 获取当前图形中所有线的颜色 
colors = [line.get_color() for line in plt.gca().lines]

这一行通过列表推导从当前轴(gca() 返回的对象)的 lines 属性中提取每条线的颜色。 由于 plt.plot 默认按顺序使用颜色循环中的颜色,这种方法可以确保拟合线使用与相对应数据点相同的颜色。

使用 ProPlot 控制多子图

ProPlot对Matplotlib进行了封装

轴标签共享、横跨

使用 SciencePlots 控制绘图风格

使用不同期刊的模板

使用 adjusttext 控制文本重叠

参考:Examples — adjustText documentation