seaborn + matplotlib 画图(四): 自定义子

作者: WuYankang | 来源:发表于2021-09-10 13:54 被阅读0次

    虽然matplotlib的subplot函数可以方便的绘制子图,但是无法对子图大小进行自定义,而axes()函数可以通过设置轴域的范围来自定义子图的大小。
    下面为一个示例:

    1. 导入所需包

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    

    2. 生成随机数据

    3个df分别作为3个子图的数据,y的范围都在(0,10)

    df1 = pd.DataFrame({'x':np.zeros(10),
                        'y':np.random.random(10)*10})
    x2 = np.random.randint(0,10,15)
    y2 = x2+np.random.random(15)
    df2 = pd.DataFrame({'x':x2,
                        'y':y2})
    x = np.random.random(30)
    x3 = x*50+50
    y3 = (x*6-3)**2+0.5
    df3 = pd.DataFrame({'x':x3,
                        'y':y3})
    

    3. 绘图

    ylim = (0,10)  # y轴刻度范围
    ax = plt.axes([0,0,0.1,1], ylim=ylim)    # 四个元素的列表表示[left, bottom, width, height]
    plt.plot(df1['x'], df1['y'], '.', color='khaki', markersize=13)
    plt.xticks([0], ['One\npoint'])    # 设置x刻度及其label, tips: \n换行
    
    ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
    plt.plot(df2['x'], df2['y'], '.', color='orangered', markersize=13)
    plt.yticks([])    # 不显示y轴刻度
    
    ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
    plt.plot(df3['x'], df3['y'], '.', color='mediumseagreen', markersize=13)
    plt.yticks([])    # 不显示y轴刻度
    
    # 添加自定义图注
    import matplotlib.patches as mpatches
    pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
    p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
    plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
              loc='lower center',bbox_to_anchor=(-0.1,1))    # bbox_to_anchor是df3图中的相对位置
    
    plt.show()
    
    自定义子图

    通过对轴域的设置可以很灵活的设置子图的大小和位置。

    4. 添加拟合线

    添加拟合线有两种方式,第一种通过numpy拟合手动添加拟合线,第二种通过seaborn直接绘制带拟合线的图。

    第一种:

    ylim = (0,10)
    ax = plt.axes([0,0,0.1,1], ylim=ylim)
    plt.plot(df1['x'], df1['y'], '.', color='khaki', markersize=13)
    plt.xticks([0], ['One\npoint'])
    
    ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
    plt.plot(df2['x'], df2['y'], '.', color='orangered', markersize=13)
    plt.yticks([])
    # 添加拟合线
    para = np.polyfit(df2['x'],df2['y'],1)    # 线性拟合
    f = np.poly1d(para)    # 生成函数
    lx = [df2['x'].min(),df2['x'].max()]
    plt.plot(lx, f(lx), 'm-', linewidth=1, alpha=0.8)    # 绘制拟合线
    
    ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
    plt.plot(df3['x'], df3['y'], '.', color='mediumseagreen', markersize=13)
    plt.yticks([])
    # 添加拟合线
    para = np.polyfit(df3['x'],df3['y'],2)    # 二次函数拟合
    f = np.poly1d(para)    # 生成函数
    lx = np.linspace(df3['x'].min(), df3['x'].max(), 50)
    plt.plot(lx, f(lx), 'm-', linewidth=1, alpha=0.8)    # 绘制拟合的二次曲线
    
    import matplotlib.patches as mpatches
    pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
    p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
    plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
              loc='lower center',bbox_to_anchor=(-0.1,1))
    
    plt.show()
    
    拟合线

    第二种:

    ylim = (0,10)
    ax = plt.axes([0,0,0.1,1], ylim=ylim)
    sns.regplot(x='x', y='y', data=df1, order=0, color='khaki')    # 使用seaborn直接绘制
    plt.xticks([0], ['One\npoint'])
    plt.xlabel('')
    plt.ylabel('')
    
    ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
    sns.regplot(x='x', y='y', data=df2, order=1, color='orangered')
    plt.yticks([])
    plt.xlabel('')
    plt.ylabel('')
    
    ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
    sns.regplot(x='x', y='y', data=df3, order=2, color='mediumseagreen')
    plt.yticks([])
    plt.xlabel('')
    plt.ylabel('')
    
    import matplotlib.patches as mpatches
    pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
    p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
    plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
              loc='lower center',bbox_to_anchor=(-0.1,1))
    
    plt.show()
    
    拟合线2

    seaborn绘制拟合曲线更加方便和美观,并且能能同时展示置信区间。

    相关文章

      网友评论

        本文标题:seaborn + matplotlib 画图(四): 自定义子

        本文链接:https://www.haomeiwen.com/subject/rebgwltx.html