引言
Matplotlib 是 Python 中较为常用和知名的可视化绘图工具。它提供了几十种绘图函数。用户可以根据需求定制可视化视觉样式和排版布局。
1、图形元素
2、图层顺序
在同一个坐标图形中绘制不同的数据图层时,Matplotlib 可通过设置每个绘图函数中的 zorder 参数来设定不同的图层。不同的艺术对象在坐标图形中的默认图层顺序如表 2-1-1 所示。
修改绘图函数中 zorder 参数值后绘制的可视化示例,如下图所示。
代码如下(示例):
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as plt
from proplot import rc
rc["font.family"] = "Times New Roman"
rc['tick.labelsize'] = 12
rc["suptitle.size"] = 15
r = np.linspace(0.3, 1, 30)
theta = np.linspace(0, 4*np.pi, 30)
x = r * np.sin(theta)
y = r * np.cos(theta)
# 创建1行2列的子图分布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3.5),facecolor="w",sharey=True)
ax1.plot(x, y, 'C3', lw=4)
ax1.scatter(x, y, s=180,color="#FFCC37",ec="k",label="zorder=2")
ax1.set_title('Lines on top of dots',fontsize=15)
ax1.legend()
ax2.plot(x, y, 'C3', lw=4)
ax2.scatter(x, y, s=180, color="#FFCC37",ec="k",zorder=3,label="zorder=3") # move dots on top of line
ax2.set_title('Dots on top of lines',fontsize=15)
ax2.legend()
plt.tight_layout()
plt.show()
3.轴比例和刻度
3.1轴比例
轴比例规定了数值与给定轴之间的映射方式,即数值在轴上以何种方式进行缩放。Matplotlib 中的默认轴比例方式为线性(linear)方式,其他诸如 log、logit、symlog 和自定义函数比例方式也是常用的轴比例方式。如下图所示,为不同轴比例的可视化对比。
代码示例:
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter, FixedLocator
from proplot import rc
rc["font.family"] = "Times New Roman"
rc['tick.labelsize'] = 12
rc["suptitle.size"] = 15
np.random.seed(19680801)
# make up some data in the interval ]0, 1[
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# plot with various axes scales
fig, axs = plt.subplots(2, 2, figsize=(6, 4.5),
constrained_layout=True)
# linear
ax = axs[0, 0]
ax.plot(x, y, color="#2FBE8F", lw=3)
ax.set_yscale('linear')
ax.set_title('linear')
ax.grid(True)
# log
ax = axs[0, 1]
ax.plot(x, y, color="#2FBE8F", lw=3)
ax.set_yscale('log')
ax.set_title('log')
ax.grid(True)
# symmetric log
ax = axs[1, 1]
ax.plot(x, y - y.mean(), color="#2FBE8F", lw=3)
ax.set_yscale('symlog', linthresh=0.02)
ax.set_title('symlog')
ax.grid(True)
# logit
ax = axs[1, 0]
ax.plot(x, y, color="#2FBE8F", lw=3)
ax.set_yscale('logit')
ax.set_title('logit')
ax.grid(True)
plt.tight_layout()
plt.show()
3.2刻度位置和刻度格式
刻度位置和刻度格式分别规定了每个轴对象上刻度的位置与格式。
4、坐标系
常见的坐标系有直角坐标系、极坐标系和地理坐标系,其中直角坐标系和地理坐标系在科研论文绘图中出现的频率较高。
4.1直角坐标系
直角坐标系又称笛卡儿坐标系,如果在二维直角坐标系中添加一个Z 轴,则该坐标系转变为三维直角坐标系(也称为笛卡儿空间坐标系)
4.2极坐标系
极坐标系是一种在平面内由极点(pole)、极轴(polar axis)和极径组成的坐标系统。极坐标系往往体现数据的周期性,即它可以更好地展示数据的周期性变化,这就要求数据较为完整且有明显的周期性特征。而对于常见的科研论文配图,由于数据本身的问题,因此导致很少使用极坐标系绘制它们(地理空间类图表除外)。
4.3地理坐标系
Matplotlib 地理坐标系中的地理投影方式较少,仅有 Aitoff 投影、Hammer 投影、Lambert投影和 Mollweide 投影 4 种。Matplotlib 不适合绘制地理图表,可使用 Python 的第三方库(如 cartopy、ProPlot 等库)绘制地理图表。
5.多子图绘制
Matplotlib 中提供了多个用来绘制多子图的函数。
1.subplot():对当前画布对象添加单个子图,且每次添加子图都会规定其位置顺序。
代码示例如下:
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as plt
from proplot import rc
rc["font.family"] = "Times New Roman"
rc["axes.labelsize"] = 15
rc['tick.labelsize'] = 13
rc["suptitle.size"] = 15
plt.figure(figsize=(6,3),dpi=100,facecolor="w")
ax1 = plt.subplot(212)
ax1.text(0.5, 0.5, "subplot(212)", alpha=0.75, ha="center", va="center", weight="bold", size=12)
ax2 = plt.subplot(221)
ax2.text(0.5, 0.5, "subplot(221)", alpha=0.75, ha="center", va="center", weight="bold", size=12)
ax3 = plt.subplot(222)
ax3.text(0.5, 0.5, "subplot(222)", alpha=0.75, ha="center", va="center", weight="bold", size=12)
plt.tight_layout()
plt.show()
2.add_subplot():使用方法和 subplot() 函数类似,不同之处是,它先产生 figure 对象,然后在该对象的基础上依次添加子图。
代码示例:
3.subplots():语法格式如下
subplots(nrows, ncols, sharex, sharey)
nrows表示绘制子图的行数;
ncols表示绘制子图的列数,行数与列数的乘积即绘制的总子图数;
sharex 可以用来设定是否共享 X 轴;
sharey 可以用来设定是否共享 Y 轴。
该函数会返回一个坐标数组对象,该对象用于每个子图的单独绘制。
代码示例:
4.axes():为当前画布 (figure) 对象添加坐标图形 (axes) 对象,使其成为当前的坐标图形(axes)对象。
代码示例:
import pandas as pd
import numpy as np
import proplot as pplt
# from colormaps import parula #自定义的颜色系
import matplotlib.pyplot as plt
from proplot import rc
rc["font.family"] = "Times New Roman"
rc["axes.labelsize"] = 15
rc['tick.labelsize'] = 13
rc["suptitle.size"] = 15
# Fixing random state for reproducibility
np.random.seed(19680801)
#plt.figure(figsize=(6,4))
plt.subplot(211)
plt.imshow(np.random.random((100, 100)))
plt.subplot(212)
plt.imshow(np.random.random((100, 100)))
plt.subplots_adjust(bottom=0.1, right=0.8, top=0.9)
cax = plt.axes([0.85, 0.1, 0.075, 0.8]) # rect 参数(一个四元组:left、 bottom、width、height)
plt.colorbar(cax=cax)
plt.show()
5.subplot2grid():实现对不规则多子图的绘制,即在当前画布对象上绘制网格(grid),网格可用于在特定位置绘制布局和大小不同的子图对象。
语法:subplot2grid(shape, location, rowspan/colspan)
shape 规定了的网格的行数和列数;
location 决定了子图在网格内的行号和列号;
rowspan 或 colspan,它们分别规定了每个子图向下跨越的行数和向右跨越的列数。
代码示例:
6.gridspec.GridSpec():数用于指定放置子图的网格的几何形状。
语法:gridspec.GridSpec(nrows, ncols, figure, left, bottom, right, top)
nrows 表示网格中的行数;
ncols 表示网格中的列数;
left、bottom、right和 top 是可选参数,用于将子图的范围定义为图形宽度或高度的一部分。
代码示例:
7.subplot_mosaic():可利用 mosaic 参数设置特定字符串符号(重复次数、顺序等)来进行子图的视觉布局。
语法:subplot_mosaic(mosaic,…)
代码示例:
6.常见的图类型
包括误差图、散点图、柱形图、饼图、直方图和箱线图等。
7.图的保存
Matplotlib 绘制的图对象可以保存为多种格式,如 PNG、JPG、TIFF、PDF 和 SVG 等。
注意!!!:结果保存函数 savefig() 必须出现在 show() 函数之前,可避免保存结果为空白等问题。
设置参数 bbox_inches=‘tight’,去除图表周围的空白部分。
代码示例: