科研绘图
目录
一些原则
- 分为表示概念的示意图、表示结果的数据图表
- 数据图表
- 优先使用位置表示数量,其次是长度、面积
- 尽量不用饼图(除非必须表示占比)
- 颜色不是第一选择(灰色极易误导,建议使用 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 控制绘图风格
使用不同期刊的模板