Matplotlib常见用法总结

作者: David_Rao | 来源:发表于2019-11-04 01:03 被阅读0次

    写在前面

    感谢莫烦老师的Matplotlib教程视频,本文是我看了他的视频教程后的知识总结。

    附上莫烦老师在B站上的Matplotlib教程视频
    https://www.bilibili.com/video/av16378354

    另外,因为Matplotlib的用法十分庞杂,这里我只总结了常见用法。且具体API的参数繁多,这里不做细致介绍,但是我都附上了官方文档的API说明,方便大家查看学习。
    另外就是,觉得还不错就给我点赞啊啊啊!

    初步熟悉Matplotlib

    plt.figure()
    创建一个新图
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figure

    plt.plot()
    描点成线
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot

    plt.title()
    为图像设置标题
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.title.html#matplotlib.pyplot.title

    plt.xlim()
    plt.ylim()
    设置x,y坐标刻度范围
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.xlim.html#matplotlib.pyplot.xlim
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.ylim.html#matplotlib.pyplot.ylim

    plt.xlabel()
    plt.ylabel()
    设置x轴,y轴的坐标名称
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html#matplotlib.axes.Axes.set_xlabel
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html#matplotlib.axes.Axes.set_ylabel

    plt.xticks()
    plt.yticks()
    设置x轴,y轴的刻度
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_xticks.html#matplotlib.axes.Axes.set_xticks
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_yticks.html#matplotlib.axes.Axes.set_yticks

    import matplotlib.pyplot as plt
    import numpy as np
    x = np.linspace(-3, 3, 50)
    y1 = 2*x+1
    y2 = x**2
    
    plt.figure()
    plt.plot(x, y2)
    plt.plot(x, y1, color="red", linewidth=1.0, linestyle='--')
    
    # 设置x, y范围
    plt.xlim((-1,2))
    plt.ylim((-2, 3))
    
    # 设置x, y名称
    plt.xlabel('I am x')
    plt.ylabel('I am y')
    
    # 设置x, y刻度
    new_ticks = np.linspace(-1, 2, 5)
    plt.xticks(new_ticks)
    plt.yticks([-2, -1.8, -1, 1.22, 3],
              [r'$really\ bad$', r'$bad\ \alpha$', r'$normal$', r'$good$', r'$really\ good$'])
    
    plt.show()
    

    plt.gca()
    获得当前坐标轴
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.gca.html?highlight=gca#matplotlib.pyplot.gca

    plt.spines
    轴脊线-记录数据区域边界的线
    分别表示上、下、左、右的轴脊线
    plt.spines['top']
    plt.spines['bottom']
    plt.spines['left']
    plt.spines['right']

    plt.spines['top'].set_color()
    设置轴脊线颜色
    https://matplotlib.org/api/spines_api.html?highlight=spines#module-matplotlib.spines

    plt.spines['top'].set_position()
    设置轴脊线位置
    https://matplotlib.org/api/spines_api.html?highlight=spines#matplotlib.spines.Spine.set_position

    plt.axis.XAxis.set_ticks_position()
    plt.axis.YAxis.set_ticks_position()
    设置刻度的摆放位置
    https://matplotlib.org/api/_as_gen/matplotlib.axis.XAxis.set_ticks_position.html?highlight=set_ticks_position#matplotlib.axis.XAxis.set_ticks_position
    https://matplotlib.org/api/_as_gen/matplotlib.axis.YAxis.set_ticks_position.html?highlight=set_ticks_position#matplotlib.axis.YAxis.set_ticks_position

    import matplotlib.pyplot as plt
    import numpy as np
    x = np.linspace(-3, 3, 50)
    y1 = 2*x+1
    y2 = x**2
    
    plt.figure()
    plt.plot(x, y2)
    plt.plot(x, y1, color="red", linewidth=1.0, linestyle='--')
    
    plt.xlim((-1,2))
    plt.ylim((-2, 3))
    
    plt.xlabel('I am x')
    plt.ylabel('I am y')
    
    new_ticks = np.linspace(-1, 2, 5)
    plt.xticks(new_ticks)
    plt.yticks([-2, -1.8, -1, 1.22, 3],
              [r'$really\ bad$', r'$bad\ \alpha$', r'$normal$', r'$good$', r'$really\ good$'])
    
    ax = plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))
    
    plt.show()
    

    plt.legend()
    显示图例
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html#matplotlib.pyplot.legend

    import matplotlib.pyplot as plt
    import numpy as np
    x = np.linspace(-3, 3, 50)
    y1 = 2*x+1
    y2 = x**2
    
    plt.figure()
    l1 = plt.plot(x, y2, label="up")
    l2 = plt.plot(x, y1, color="red", linewidth=1.0, linestyle='--',label='down')
    plt.legend()
    
    # 设置x, y范围
    plt.xlim((-1,2))
    plt.ylim((-2, 3))
    
    # 设置x, y名称
    plt.xlabel('I am x')
    plt.ylabel('I am y')
    
    # 设置x, y单位标
    new_ticks = np.linspace(-1, 2, 5)
    plt.xticks(new_ticks)
    plt.yticks([-2, -1.8, -1, 1.22, 3],
              [r'$really\ bad$', r'$bad\ \alpha$', r'$normal$', r'$good$', r'$really\ good$'])
    
    
    plt.show()
    

    plt.annotate()
    用文本text注释点xy
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.annotate.html#matplotlib.pyplot.annotate

    plt.text()
    向轴添加文本
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.text.html#matplotlib.pyplot.text

    import matplotlib.pyplot as plt
    import numpy as np
    x = np.linspace(-3, 3, 50)
    y = 2*x+1
    plt.figure(num=1, figsize=(8, 5))
    plt.plot(x, y)
    
    ax = plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    
    x0 = 1
    y0 = 2*x0 + 1
    plt.scatter(x0, y0, s=50, color="red")
    plt.plot([x0, x0], [0, y0], 'k--', lw=2.5)
    
    # 文字标注1
    plt.annotate(r"$2x+1=%s$"%y0, xy=(x0,y0),xycoords='data', 
                 xytext=(30, -30),fontsize=16, textcoords='offset points', 
                 arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.2'))
    
    # 文字标注2
    plt.text(-3, 3, r'$This\ is\ some\ text\ \sigma$',fontdict={'size':16, "color": "red"})
    
    plt.show()
    

    前面出现过axis的类,这里谈谈我区别axis类和axes类的看法。axes是axis 的复数,axes包括了横纵坐标轴,故是复数;axis代表横轴或者纵轴,故为单数。

    plt.axes.Axes.set_title()
    为轴设置标题
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_title.html?highlight=set_title#matplotlib.axes.Axes.set_title

    plt.axes.Axes.get_xticklabels()
    plt.axes.Axes.get_yticklabels()
    获得刻度
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.get_xticklabels.html?highlight=get_xticklabels#matplotlib.axes.Axes.get_xticklabels
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.get_yticklabels.html?highlight=get_yticklabels#matplotlib.axes.Axes.get_yticklabels

    plt.text.set_fontsize()
    设置字体大小
    https://matplotlib.org/api/text_api.html?highlight=set_fontsize#matplotlib.text.Text.set_fontsize

    plt.text.set_bbox()
    在自身周围画一个边界框
    https://matplotlib.org/api/text_api.html?highlight=set_bbox#matplotlib.text.Text.set_bbox

    import matplotlib.pyplot as plt
    import numpy as np
    plt.figure(num=1, figsize=(8, 5))
    plt.plot(x, y)
    
    ax = plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    
    for label in ax.get_xticklabels() + ax.get_yticklabels():
        label.set_fontsize(12)
        label.set_bbox(dict(facecolor='yellow', edgecolor='None', alpha=0.5))
    
    plt.show()
    

    散点图

    plt.scatter()
    绘制散点图
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter

    import matplotlib.pyplot as plt
    import numpy as np
    n = 1024
    X = np.random.normal(0, 1, n)
    Y = np.random.normal(0, 1, n)
    T = np.arctan2(Y, X)
    
    plt.figure(num=1)
    plt.scatter(X, Y, s=75, c=T, alpha=0.5)
    plt.xlim((-1.5, 1.5))
    plt.ylim((-1.5, 1.5))
    plt.xticks(())
    plt.yticks(())
    
    plt.figure(num=2)
    plt.scatter(np.arange(5), np.arange(5))
    plt.xticks(())
    plt.yticks(())
    
    plt.show()
    

    柱状图

    plt.bar()
    绘制柱状图
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar

    n = 12
    X = np.arange(n)
    Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    
    plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    
    for x,y in zip(X, Y1):
        plt.text(x, y, '%.2f'%y, ha='center', va='bottom')
        
    for x,y in zip(X, Y2):
        plt.text(x, -y-0.05, '%.2f'%y, ha='center', va='top')
    
    plt.xlim(-0.5, n)
    plt.xticks(())
    plt.ylim(-1.25, 1.25)
    plt.yticks(())
    
    plt.show()
    

    等高线图

    在此之前需要先介绍numpy中的一个api

    np.meshgrid()
    从坐标向量返回坐标矩阵
    https://numpy.org/devdocs/reference/generated/numpy.meshgrid.html?highlight=meshgrid#numpy.meshgrid

    plt.contourf()
    绘制等高线图的颜色域
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.contourf.html#matplotlib.pyplot.contourf

    plt.contour()
    绘制等高线
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.contour.html#matplotlib.pyplot.contour

    plt.clabel()
    标记等高线
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.clabel.html#matplotlib.pyplot.clabel

    plt.cm
    色域映射
    https://matplotlib.org/gallery/color/colormap_reference.html

    import matplotlib.pyplot as plt
    import numpy as np
    def f(x, y):
        return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 - y**2)
    
    n = 256
    x = np.linspace(-3, 3, n)
    y = np.linspace(-3, 3, n)
    X, Y = np.meshgrid(x, y)
    plt.figure(num=1, figsize=(9,7))
    plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)
    
    C = plt.contour(X, Y, f(X, Y), 8,
                   colors='black',
                   linestyles='-',
                   linewidths=0.5)
    plt.clabel(C, inline=True, fontsize=10)
    
    plt.xticks(())
    plt.yticks(())
    plt.show()
    

    绘制图片

    plt.imshow()
    绘制图片
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib.pyplot.imshow

    plt.colorbar()
    将颜色栏添加到绘图中
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.colorbar.html#matplotlib.pyplot.colorbar

    plt.cm
    色域映射
    https://matplotlib.org/gallery/color/colormap_reference.html

    import matplotlib.pyplot as plt
    import numpy as np
    a = np.array([0.31, 0.36, 0.42,
                 0.36, 0.43, 0.52,
                 0.42, 0.52, 0.65]).reshape(3, 3)
    plt.imshow(a, interpolation='nearest', cmap='bone')
    plt.colorbar(shrink=0.9)
    
    plt.xticks(())
    plt.yticks(())
    plt.show()
    

    3D图

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure(num=1, figsize=(15, 10))
    ax = Axes3D(fig)
    X = np.arange(-4, 4, 0.25)
    Y = np.arange(-4, 4, 0.25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X**2 + Y**2)
    Z = np.sin(R)
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, linestyle='-', linewidths=100, cmap=plt.get_cmap('rainbow'))
    ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')
    ax.set_zlim(-2, 2)
    plt.show()
    

    多图显示

    plt.subplot()
    在当前图形上添加一个子图
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot

    import matplotlib.pyplot as plt
    plt.figure(num=2)
    
    plt.subplot(2, 2, 1)
    plt.plot([0,1], [0,1])
    
    plt.subplot(2, 2, 2)
    plt.plot([0,1], [0,2])
    
    plt.subplot(2, 2, 3)
    plt.plot([0,1], [0,3])
    
    plt.subplot(2, 2, 4)
    plt.plot([0,1], [0,4])
    
    plt.show()
    
    import matplotlib.pyplot as plt
    plt.figure(num=3)
    
    # (2, 1, 1)代表两行,只画一列,属于第一个图
    plt.subplot(2, 1, 1)
    plt.plot([0,1], [0,1])
    
    # (2, 3, 4)代表两行,画三列,属于第四个图(因为第一个图的一列相当于占据三个子图,第二行的开头相当于第四个子图)
    plt.subplot(2, 3, 4)
    plt.plot([0,1], [0,2])
    
    plt.subplot(2, 3, 5)
    plt.plot([0,1], [0,3])
    
    plt.subplot(2, 3, 6)
    plt.plot([0,1], [0,4])
    
    plt.show()
    

    plt.subplot2grid()
    在常规网格内的特定位置创建轴
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot2grid.html#matplotlib.pyplot.subplot2grid

    plt.tight_layout()
    自适应构图
    https://matplotlib.org/api/tight_layout_api.html?highlight=tight_layout#module-matplotlib.tight_layout

    import matplotlib.pyplot as plt
    plt.figure(num=4)
    ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3, rowspan=1)
    ax1.plot([1,2],[1,2])
    ax1.set_title('ax1_title')
    
    ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=1)
    ax3 = plt.subplot2grid((3, 3), (1, 2), colspan=1, rowspan=2)
    ax4 = plt.subplot2grid((3, 3), (2, 0), colspan=1, rowspan=1)
    ax5 = plt.subplot2grid((3, 3), (2, 1), colspan=1, rowspan=1)
    
    plt.tight_layout()
    plt.show()
    

    plt.subplots()
    创建一个图和一组子图
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots.html#matplotlib.pyplot.subplots

    import matplotlib.pyplot as plt
    plt.figure(num=6)
    f, ((ax11, ax12), (ax21, ax22)) = plt.subplots(2, 2, sharex=True, sharey=True)
    ax11.scatter([1,2], [1,2])
    
    plt.tight_layout()
    plt.show()
    

    plt.figure.Figure.add_subplot
    添加一个子图
    https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.add_subplot

    plt.xscale
    plt.yscale
    设置x轴、y轴比例
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.xscale.html#matplotlib.pyplot.xscale
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.yscale.html#matplotlib.pyplot.yscale

    plt.grid()
    配置网格线
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.grid.html#matplotlib.pyplot.grid

    plt.subplots_adjust
    调整子图布局
    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots_adjust.html#matplotlib.pyplot.subplots_adjust

    以下代码引用自
    https://blog.csdn.net/claroja/article/details/70898253
    感谢该作者

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.ticker import NullFormatter
    # 固定随机数种子
    np.random.seed(64)
    
    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))
    
    plt.figure(num=1)
    
    # linear
    plt.subplot(221)
    plt.plot(x, y)
    plt.yscale('linear')
    plt.title('linear')
    plt.grid(True)
    
    # log
    plt.subplot(222)
    plt.plot(x, y)
    plt.yscale('log')
    plt.title('log')
    plt.grid(True)
    
    # symmetric log
    plt.subplot(223)
    plt.plot(x, y - y.mean())
    plt.yscale('symlog', linthreshy=0.01)
    plt.title('symlog')
    plt.grid(True)
    
    # logit
    plt.subplot(224)
    plt.plot(x, y)
    plt.yscale('logit')
    plt.title('logit')
    plt.grid(True)
    
    # Format the minor tick labels of the y-axis into empty strings with
    # `NullFormatter`, to avoid cumbering the axis with too many labels.
    plt.gca().yaxis.set_minor_formatter(NullFormatter())
    # Adjust the subplot layout, because the logit one may take more space
    # than usual, due to y-tick labels like "1 - 10^{-3}"
    plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,
    wspace=0.35)
    
    plt.tight_layout()
    plt.show()
    

    图中图

    plt.figure.Figure.add_axes
    在图中添加轴
    https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html?highlight=add_axes#matplotlib.figure.Figure.add_axes

    plt.axes.Axes.set_xlabel()
    plt.axes.Axes.set_ylabel()
    设置x轴,y轴的标签
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html?highlight=set_xlabel#matplotlib.axes.Axes.set_xlabel
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html?highlight=set_ylabel#matplotlib.axes.Axes.set_ylabel

    plt.axes.Axes.set_title()
    为轴设置标题
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_title.html?highlight=set_title#matplotlib.axes.Axes.set_title

    import matplotlib.pyplot as plt
    fig = plt.figure()
    x = [1, 2, 3, 4, 5, 6, 7]
    y = [1, 3, 4, 2, 5, 8, 6]
    
    left, bottom, width, height = 0.1, 0.1, 1, 1
    # 设置距离左,下的百分比距离,和宽、高相对于主图的比例
    ax1 = fig.add_axes([left, bottom, width, height])
    ax1.plot(x, y, 'r')
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_title('outside')
    
    # 方式1
    left, bottom, width, height = 0.2, 0.7, 0.25, 0.25
    ax2 = fig.add_axes([left, bottom, width, height])
    ax2.plot(y, x, 'b')
    ax2.set_xlabel('x')
    ax2.set_ylabel('y')
    ax2.set_title('inside1')
    
    # 方式2
    plt.axes([.8, 0.25, 0.25, 0.25])
    plt.plot(y[::-1], x, 'g')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('inside 2')
    
    plt.show()
    

    次坐标轴

    plt.axes.Axes.twinx()
    创建共享X轴的双轴
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.twinx.html?highlight=twinx#matplotlib.axes.Axes.twinx

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(0, 10, 0.1)
    y1 = 0.05 * x ** 2
    y2 = -1 * y1
    
    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx()
    ax1.plot(x, y1, 'g-')
    ax2.plot(x, y2, 'b--')
    
    ax1.set_xlabel('X data')
    ax1.set_ylabel('Y1', color='g', fontsize=20)
    ax2.set_ylabel('Y2', color='b', fontsize=20)
    
    plt.show()
    

    动画

    matplotlib.animation.FuncAnimation
    通过重复调用func函数来制作动画
    https://matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html#matplotlib.animation.FuncAnimation

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import animation
    
    f, ax = plt.subplots()
    x = np.arange(0, 2*np.pi, 0.01)
    line, = ax.plot(x, np.sin(x))
    
    def animate(i):
        line.set_ydata(np.sin(x+i/8))
        return line,
    
    def init():
        line.set_ydata(np.sin(x))
        return line,
        
    
    ani = animation.FuncAnimation(fig=f, func=animate, frames=100,
                                  init_func=init, interval=20, blit=False)
    plt.show()
    

    参数大致解析:
    fig:传入我们需要绘制的图像
    frames:这里设置为100
    func:这里的func是函数animate(i)
    将0——100(即frames的值)不断地传入animate(i),作为这个函数里的i,超过100后从0开始继续传入,不断循环。函数animate(i)不断地返回更新后的line,绘制在图上。
    init_func:设置初始时图的状态
    interval:每一帧动画间隔20毫秒

    写在最后

    这里是文章的结尾,文章会不定时修改更新。如果大家觉得文章不错,不妨给我点个赞;或者你觉得这篇文章对你身边的人有帮助,不妨分享给TA;如果有什么问题,欢迎在评论提出或者给我发私信。
    最后再次感谢莫烦老师,也谢谢大家对本文的支持。

    相关文章

      网友评论

        本文标题:Matplotlib常见用法总结

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