matplotlib作图模板

matplotlib作图模板

为了方便数模作对比图、子图展示等功能,封装了一个visualize函数用来直接调用。函数原型如下:

visualize(true_val, xylabel=None,counter_parts=None, title=None, subplot=False, ax=None, saveas=None)
  • 函数的作用是给定图的axes对象来生成一个图,可以是一个完整单图,也可以是子图。
  • 支持只可视化一组数据(true_val),也可以通过counter_parts参数在一个图上可视化多组数据。
  • 在不是子图的情况下可以通过设置saveas参数导出图片。
  • 因为采取了面向对象调用格式,可以在外部和textannotate等实例方法配合实现更复杂的功能。
  • 目前visualize函数内部只有ax.plot一种调用格式,进一步的拓展可以考虑使用修饰器或偏函数来支持scatterbar等多种形式的可视化。
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)

可视化结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值