科研绘图

目录

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 默认按顺序使用颜色循环中的颜色,这种方法可以确保拟合线使用与相对应数据点相同的颜色。