matplotlib作图模板
为了方便数模作对比图、子图展示等功能,封装了一个visualize函数用来直接调用。函数原型如下:
visualize(true_val, xylabel=None,counter_parts=None, title=None, subplot=False, ax=None, saveas=None)
- 函数的作用是给定图的axes对象来生成一个图,可以是一个完整单图,也可以是子图。
- 支持只可视化一组数据(true_val),也可以通过counter_parts参数在一个图上可视化多组数据。
- 在不是子图的情况下可以通过设置saveas参数导出图片。
- 因为采取了面向对象调用格式,可以在外部和text、annotate等实例方法配合实现更复杂的功能。
- 目前visualize函数内部只有ax.plot一种调用格式,进一步的拓展可以考虑使用修饰器或偏函数来支持scatter、bar等多种形式的可视化。
def visualize(ax, true_val, xylabel=None,counter_parts=None, title=None, subplot=False, saveas=None):
r"""
Parameters:
----------
@ ax: The axes object to be drawn on (must provide).
@ true_val: The tuple of 'true' value, usually a seris of given values with (or without) time and label.
Format: (([x,] y),**kwargs)
@ xylabel: A tuple of (xlabel, ylabel).
@ counter_parts: A list of tuples: [(([x, y]), **kwargs), ...].
@ title: A string to be used as figure title, (or subtitle when subplot is `True`).
@ subplot: Default `False`. `True` when you want this function only draw a subplot on a whole figure.
@ saveas: A string of filepath or filename for figure to be saved.
Usage:
----------
fig,ax = plt.subplots()
a = ((np.arange(0,10,1),np.arange(0,10,1)),{'label':'test label'})
# 元组只有一个元素时,必须有逗号:
b = (np.arange(0,20,2),)
title = 'test'
visualize(ax,a,xylabel=('X$/m$','Y$/\degree C$'),count_parts=[(b,{'label':'data1 label'})],title=title)
c = {'args':(np.arange(0,10,1),np.arange(0,10,1)),'label':'test label'}
fig,axes = plt.subplots(2,2)
axes[0,0].plot(**c)
visualize(axes[1,1],a,count_parts=[(b,{'label':'data1 label'})],title=title,subplot=True)
"""
assert type(ax) != type(None), 'You must specify a ax for subplot'
assert len(true_val) <= 2, 'invalid syntax: true_val'
if len(true_val) == 2:
args, kwargs = true_val
ax.plot(*args,**kwargs)
# print(f'args:{len(true_val)}')
else:
ax.plot(*true_val)
if type(xylabel) != type(None):
xlabel,ylabel = xylabel
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
assert type(counter_parts) == type([]), 'you must input list of tuples as count_parts'
for i in range(len(counter_parts)):
assert len(counter_parts[i]) <= 3, 'invalid syntax: count_parts'
if len(counter_parts[i]) == 2:
args, kwargs = counter_parts[i]
ax.plot(*args,**kwargs)
else:
ax.plot(*counter_parts[i])
ax.legend()
if type(title) != type(None):
ax.set_title(title)
if not subplot:
if type(saveas) != type(None):
plt.savefig(saveas)
docstring的两个简单实例
示例一:
# 格式设置
plt.rcParams.update({
'savefig.dpi': 600, # 输出图片质量
'mathtext.fontset': 'cm', # 公式字体
'font.sans-serif': 'SimHei', # 普通文本字体
'axes.unicode_minus': False, # 坐标轴负号
'figure.constrained_layout.use': True # 子图间隔
})
fig,ax=plt.subplots()
a = ((np.arange(0,10,1),np.arange(0,10,1)),{'label':'test label'})
b = (np.arange(0,20,2),)
title = 'test'
visualize(ax,a,xylabel=('X$/m$','Y$/\degree C$'),counter_parts=[(b,{'label':'data1 label'})],title=title)
可视化结果:
实例二:
# 格式设置
plt.rcParams.update({
'savefig.dpi': 600, # 输出图片质量
'mathtext.fontset': 'cm', # 公式字体
'font.sans-serif': 'SimHei', # 普通文本字体
'axes.unicode_minus': False, # 坐标轴负号
'figure.constrained_layout.use': True # 子图间隔
})
a = ((np.arange(0,10,1),np.arange(0,10,1)),{'label':'test label'})
b = (np.arange(0,20,2),)
args,kwargs = ((np.arange(0,10,1),np.arange(0,10,1)),{'label':'test label'})
fig,axes = plt.subplots(2,2)
axes[0,0].plot(*args,**kwargs)
visualize(axes[1,1],a,counter_parts=[(b,{'label':'data1 label'})],title=title,subplot=True)
可视化结果如下: