以下内容参考宁海涛老师的书《科研论文配图绘制指南——基于python》以及matplotlib官方文档、seaborn官方文档。
matplotlib
这些元素分别是用哪个接口控制的呢?
Artists
matplotlib共三层API,FigureCanvas 和 Renderer 层负责处理底层细节,用户花95%的时间都是在Artists层。
Artists对象 有两种,基础对象和容器对象。 基础类元素包括常见的点(point)、 线(line)、文本(text)、网格(grid)、标题(title)、图例(legend)等;容器类元素则是指 一种或多种基础类元素的合集,主要包括图形、坐标图形、轴和刻度 。
figure
创建figure并在上面作图:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1) # two rows, one column, first plot
add_subplot 在图表中添加axes。
Axes
Axes 是绘图区域, 也称为子图 。大部分对象都会进入其中,Axes 有许多特殊的辅助方法(plot()、text()、hist()、imshow()),可以创建最常见的图形原型(分别为 Line2D、Text、Rectangle、AxesImage)。
使用辅助方法创建元素:
接上例:
import numpy as np
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax.plot(t, s, color='blue', lw=2)
这样就在ax子图上添加了line元素。这个元素保存在ax.lines
列表中。
移除元素的方法:
如果想要移除一条line:
line = ax.lines[0]
line.remove()
控制xy轴的方法:
每个Axes实例包含一个 XAxis 和一个 YAxis 实例,用于处理刻度、刻度标签和轴标签的布局和绘制。
设置轴标签
xtext = ax.set_xlabel('my xdata') # returns a Text instance
ytext = ax.set_ylabel('my ydata')
Axes类的其他方法可以查阅https://matplotlib.org/stable/api/axes_api.html
区别Axes和Axis
Axes是一个子图的一整套坐标轴,包括x轴,y轴,(z轴)。
Axis是一个子图的一个轴,是x轴,y轴,(z轴)
seaborn
Seaborn 基于 Matplotlib,Matplotlib 中大多数绘图函数的参数都可在 Seaborn 绘图函数中使用 。因此seaborn绘制的图也需要导入matplotlib并使用plt.show()来显示。
初始化
设置主题并导入DataFrame格式的数据集。我们在使用seaborn时用pd.read_csv()导入数据就可以了。
import seaborn as sns
sns.set_theme()
tips = sns.load_dataset('tips')
print(type(tips)) # <class 'pandas.core.frame.DataFrame'>
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
.. ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
[244 rows x 7 columns]
Seaborn 在创建之初就将可绘制的图进行了分类 , 者可根据数据类型选择绘制相应的图, 从而实现高效绘图。
关系型图
使用举例:
relplot() 用点线可视化变量之间的统计关系。它默认是scatterplot()。当数据不是数值型数据时,会有其他画点图的方法。
sns.relplot(data=tips, x="total_bill", y="tip")
现在数据是两维的。用hue加一个维度,让点的颜色变得有意义:
sns.relplot(data=tips, x="total_bill", y="tip", hue="smoker")
为了进一步强调smoker这个维度的区别,可以用style参数强调。加上style参数的意思是在style参数指定的维度上使用强调手段,但是具体用什么手段强调不是我们要关心的问题(这是seaborn的好处,让我们专注于数据而不去纠结用三角还是圆形还是叉叉)
sns.relplot(data=tips, x="total_bill", y="tip", hue='smoker', style='smoker')
谨慎使用style参数,人眼对形状不如对颜色敏感。
如果hue接收连续型变量,就会使用一个连续调色板:
sns.relplot(data=tips, x="total_bill", y="tip", hue='tip')
当然也可以跟一个palette参数定制调色板:
sns.relplot(
data=tips,
x="total_bill", y="tip",
hue="size", palette="ch:r=-.5,l=.75"
)
size参数调整散点大小:
sns.relplot(data=tips, x="total_bill", y="tip", size="size")
size参数会根据参数范围自适应的调整点大小,而不按照参数的绝对值。
也可以定制大小:
sns.relplot(
data=tips, x="total_bill", y="tip",
size="size", sizes=(15, 200)
)
以上是relplot的散点模式。会发现所有主要参数都是使用列名。
数据分布型图
分类数据型
回归模型分析型
绘制子图
FacetGrid()
PairGrid()
ProPlot
proplot通过fig = figure()函数来创建一个画布,通过axs = fig.subplots()来创建子图。接下来讲解figure函数用来控制子图的两个参数:
figure(span, share)
轴共享share
可以给sharex sharey share 传入以下几种共享方式:
● False 或 0:禁用轴共享。
● labels"、"labs “或 1:共享轴标签,但不共享其他内容。标签将显示在最左侧和最下方的子图上。
● limits”、"lims "或 2:与 1 相同,但也共享轴限制、轴刻度、主刻度线和次刻度线位置及格式。
● True 或 3(默认): 与 2 相同,但也共享轴刻度线标签。刻度标签将显示在最左侧和最下方的子图上。
● 全部 "或 4:与 3 相同,但轴限制、轴刻度和轴刻度即使在不在同一行或列的子图间也会共享。
跨度span,spanx, spany
● span=True: 当多个子图的标签相同时,使用一个轴标签
● span=False: 当多个子图的标签相同时,不使用一个轴标签
子图编号fig.format(abcloc), axes.format(abcloc)
format函数用于 绘制不同的子图序号样式和位置 。
abcloc参数用于指定位置。
SciencePlots
SciencePlots可以方便地绘制符合期刊要求的配图。
安装
pip install SciencePlots
安装MikTex和 Ghostscript ,并将它们添加到环境变量中,具体为 “…\miktex\bin\x64”和“…\gs__( 版本号 )\bin”。一般情况下,在添加完系统环境变量后,重 启机器,相关配置即可生效 。
使用
导包并设置全局style。
import matplotlib.pyplot as plt
import scienceplots
plt.style.use('science')
也可以设置多style, 例如以下的示例中,'ieee’会覆盖一些science的参数,适用于IEEE期刊。
plt.style.use(['science','ieee'])
所有可用的style:https://github.com/garrettj403/SciencePlots/wiki/Gallery
设置完了主题正常画图就可以了。