介绍
本文不是一篇详尽的、从简到繁的 Maplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的、基础的操作。本文不对各种数据图(折线图、柱状图等)作介绍。文中配有效果示意图及代码。本文亦可作常用画图函数/参数查询之用。
PS:知乎的编辑器真是弱的可怜,建议去 CSDN 看:
Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图blog.csdn.net
什么样的数据图才是好的?
图之好坏不在繁简,一副好图,应该让读者能清晰明了地理解你想要表达的意思。所以在设计图的时候,此为第一要义。
检查你的数据图
- 是否对色盲友好?(避免过多地使用红绿配色。)
- 如果打印成黑白稿(grayscale)的话,读者是否还能分辨出不同的元素?(避免仅使用颜色来区分元素,使用恰当、对比度高的颜色,以及 Marker、线的样式、粗细等)
- 图片的质量是否足够高?(PDF、EPS 等矢量图、分辨率高的 PNG、JPG
- 标题、标签、刻度、图例是否正确,表达清楚?(最好不要仅使用数学符号来表示轴标签,例如 、 等,使用明确的文字来描述。)
- 使用的字体与正文是否一致?
基础知识
在介绍其他内容之前,我们先回顾一下基础知识,这里借用 Matplotlib 文档的一张图 [1]:
图中共标出了14种概念:
- Figure - 画板
- Title - 标题
- X axis label - X轴标签
- Y axis label - Y轴标签
- Legend - 图例
- Major tick label - 主刻度标签
- Minor tick label - 次刻度标签
- Grid - 网格
- Line (line plot) - 线
- Markers (scatter plot) - 标记
- Major tick - 主刻度
- Minor tick - 次刻度
- Axes - 轴
- Spines - 脊
这些基础概念十分有用,希望大家能记住其作用及对应的英文。如果遇到更复杂的需求,可以直接在官网文档中进行查询。
环境
- Python 3.7.3
- Matplotlib 3.1.3
常用链接
颜色 Colors: - Choosing Colormaps in Matplotlib - List of Named Colors - HTML Color Picker - Color Brewer 2.0 - How to find a color scheme that's also useful when printed in black and white?
线样式: - Linestyle - Line2D
标记样式:
刻度: - Tick Locators - Tick Formatters
图例:Legend Guide
正文
开始画图
import matplotlib.pyplot as plt # 之后的代码默认引入此包
Figure 画板
创建一个简单的画板并展示
fig, ax = plt.subplots()
plt.show() # 之后的代码默认省略此步骤
设定画板的长宽figsize
fig, ax = plt.subplots(figsize=(12, 3))
设定子图
fig , ax = plt.subplots(nrows=3, ncols=5)
nrows
和ncols
参数分别为行数和列数。更复杂的例子请参考官网教程。
访问不同的字图
假设现在有三行五列:
ax[0, 4].plot(x, y, color='limegreen')
ax[2, 2].plot(x, y, color='red')
紧凑布局 Tight Layout
fig, ax = plt.subplots(tight_layout=True)
画板背景色
ax.set_facecolor('lightblue')
图中图 Inset
ax.plot(x, y, color='limegreen', label='Xovee')
inset = plt.axes((.5, .5, .3, .3), facecolor='lightblue')
inset.plot(x, y, color='red')
标签 Label
设定图片的轴标签、标题、字体颜色、字体大小
plt.title()
-
plt.xlabel()
、plt.ylabel()
plt.set_title()
-
ax.set_xlabel()
、ax.set_ylabel()
ax.set_title("Xovee's Figure", fontsize=24, color='red')
ax.set_xlabel('Xovee', fontsize=20, color='lightblue')
ax.set_ylabel('Xovee', fontsize=20, color='coral')
轴 Axes/Axis
设定轴的范围
ax.set_xlim(np.pi, 3*np.pi)
ax.set_ylim(-.5, .5)
设定轴的缩放 Scale
可选项包括: - linear
默认 - log
- symlog
- logit
fig, ax = plt.subplots(ncols=2, figsize=(8, 4), tight_layout=True)
x = np.linspace(0, 100, 1000)
y = [2**x_ for x_ in x]
ax[0].plot(x, y, color='limegreen', label='Xovee')
ax[1].plot(x, y, color='coral')
ax[1].set_yscale('log')
设定轴的上下界、粗细、颜色
ax.plot(x, y, color='limegreen', label='Xovee')
ax.set_yticks([-.5, 0., .5])
ax.set_xticks([2, 4, 6, 8])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_bounds(-.5, .5)
ax.spines['bottom'].set_bounds(2, 8)
ax.spines['bottom'].set_linewidth(2)
ax.spines['bottom'].set_color('red')
隐藏轴
hide_axes = ['left', 'top', 'right', 'bottom']
for axis in hide_axes:
ax.spines[axis].set_visible(False)
读者可以关注一下这个ax.spines
,即轴的脊椎,将其可见度设为False
:
设定右(上)坐标轴
ax.twinx()
,同理可以设置上坐标轴ax.twiny()
。
ax.plot(x, y, color='limegreen', label='Xovee')
axr = ax.twinx()
axr.set_yticks([.5])
axr.set_yticklabels(['Xovee'])
Tick 刻度
设置刻度的长、宽、颜色
# axis 默认是 both, 或者 x 和 y
# which 可以是 major, minor, both
ax.tick_params(axis='both', which='major', color='blue', length=10, width=3)
自定义刻度的位置和标签
-
plt.xticks()
、plt.yticks()
-
ax.set_xticks()
和ax.set_xticklabels()
-
ax.set_yticks()
和ax.set_yticklabels()
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(tight_layout=True)
x = np.linspace(0, 4*np.pi, 100)
y = np.sin(x)
plt.plot(x, y, color='limegreen', label='Xovee')
plt.xticks([0, np.pi, 2*np.pi, 3*np.pi, 12], ['0.0', '$pi$', '$2pi$', '3$pi$', '12'], fontsize=16, rotation=30, color='red')
plt.yticks([-1, 0, 1], fontsize=16, color='blue')
plt.show()
显示(隐藏)主/次刻度
右轴显示minor
次刻度,下轴不显示minor
次刻度。
ax.set_xticks([1e1, 1e2, 1e4], minor=True)
ax.set_yticks([1e-4, 1e-2, 1e0], minor=False)
Legend 图例
设定图例位置和文字大小
loc
的可选参数包括best
, lower
, upper
, center
, left
, right
及其部分组合例如lower left
。
plt.legend(loc='lower center', fontsize=24)
设定图例位置
bbox_to_anchor
参数的四元组,以左下角为参照,设定图例的位置:
plt.legend(loc='lower left', bbox_to_anchor=(0, 1.05, .5, 1.05), fontsize=24)
多行多列图例、图例背景颜色
legend = plt.legend(loc='lower left', ncol=3, fontsize=16)
legend.get_frame().set_facecolor('linen')
网格 Grid
fig, ax = plt.subplots(ncols=3, tight_layout=True)
x = np.linspace(0, 4*np.pi, 100)
y = np.sin(x)
ax[0].plot(x, y, color='limegreen', label='Xovee')
ax[1].plot(x, y, color='red', label='Xovee')
ax[2].plot(x, y, color='blue', label='Xovee')
ax[0].grid(axis='x', linestyle='--')
ax[1].grid(axis='y', linewidth=5)
ax[2].grid(color='purple')
其他命令
减小生成的文件大小
添加rasterized=True
参数。
plt.plot(x, y, rasterized=True)
plt.scatter(x, y, rasterized=True)
...
文字 Text
ax.text(2, 0, 'Xovee Xu is watching you!!!', fontsize=12, weight='bold', color='Coral')
设定字体
from matplotlib import rcParams
rcParams['font.family'] = 'Times New Roman'
使用 TrueType 字体(或避免 Type 3 字体)
第一种方法是更改配置文件,即默认之后所有的画图都使用 TrueType 字体:
- 首先找到并修改`matplotlib`文件
- 如果你不知道该文件的位置,在 python 中输入以下命令 [2]
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
'/home/foo/.config/matplotlib/matplotlibrc'
3. 修改以下两项即可 [3]
pdf.fonttype : 42
ps.fonttype : 42
第二种方法是在单个画图代码中使用如下命令:
import matplotlib
matplotlib.rcParams['pdf.fonttype'] = 42
matplotlib.rcParams['ps.fonttype'] = 42
设定层级 zorder
zorder
高的元素显示在zorder
低低元素之上。
ax[0].scatter([0], [2], s=1e5)
ax[0].scatter([0], [0], s=1e5, c='red')
ax[1].scatter([0], [2], s=1e5, zorder=5)
ax[1].scatter([0], [0], s=1e5, c='red', zorder=3)
透明 alpha
设定alpha
参数,1
为不透明,0
为完全透明。
ax.scatter([0], [2], s=1e5, c='green', alpha=.5)
ax.scatter([0], [0], s=1e5, c='yellow', alpha=.5)
ax.scatter([-1], [1], s=3e4, c='red', zorder=0)
ax.scatter([1], [1], s=3e4, c='blue', alpha=1.)
设置颜色地图:例一 colormap
各种colormap
颜色参考值可以在这里找到。
fig, ax = plt.subplots(tight_layout=True)
x = np.linspace(0, 4*np.pi, 100)
y = np.sin(x)
cmp = plt.cm.get_cmap('rainbow')
for i in range(len(x)-1):
plt.plot([x[i], x[i+1]], [y[i], y[i+1]], linewidth=5, color=cmp(x[i]/max(x)))
设置颜色地图:例二 colormap
ax.scatter(x, y, s=x**2, c=y, cmap='rainbow')
打印出系统中支持的字体名
import matplotlib.font_manager
a = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
for i in a:
print(i)
Reference
- Usage Guide. (Mar 20, 2020). Retrieved from https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
- Customizing Matplotlib with style sheets and rcParams. (Apr 8, 2020). Retrieved from Customizing Matplotlib with style sheets and rcParams
- Jamie Oaks. (Mar 1, 2014). Avoiding Type 3 fonts in matplotlib plots. Retrieved from Avoiding Type 3 fonts in matplotlib plots