matplotlib 画图神器

作者: 臻甄 | 来源:发表于2019-02-13 16:04 被阅读105次

    Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

    加上mpl_toolkits.mplot3d的3D绘图功能,感觉跟Matlab的绘图功能有的比了,更重要的是可以直接用python绘图,非常适合给机器学习的代码用作可视化工具。

    强烈推荐莫烦大神的视频教程《matplotlib

    安装方法:pip install matplotlib

    几个常用的绘图方法

    • 直线/曲线图:plot
    • 柱状图:bar
    • 点状图:scatter
    • 等高线图:contourf contour
    • 3D曲面:plot_surface (需要配合mpl_toolkits库)
    • 多个子图:subplot

    下面我列举了不同图形的代码和图片效果,主要摘抄莫烦大神的教程,不过我加上了额外的一些详细注释。上手就能运行。

    直线/曲线图

    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.show()
    
    # -------------- 带参数的图像展示 --------------
    plt.figure(num=3, figsize=(8,5),) # num:编号(图像文件标题为Figure_num), figsize:大小
    
    # 直接绘图
    # plt.plot(x, y2)
    # plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
    
    # 带图例的图像展示,显示哪根线是哪根线
    l1, = plt.plot(x, y1, label='linear line') # l1以逗号结尾,因为plt返回的是一个列表
    l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
    # plt.legend(loc='lower right') # 把图例放在不同的位置组合  upper lower center right left
    plt.legend(handles=[l1, l2], labels=['l1', 'l2'],  loc='best') # 可以重命名label, 并自动选择最佳位置放图例
     # 'best' : 0,          
     # 'upper right'  : 1,
     # 'upper left'   : 2,
     # 'lower left'   : 3,
     # 'lower right'  : 4,
     # 'right'        : 5,
     # 'center left'  : 6,
     # 'center right' : 7,
     # 'lower center' : 8,
     # 'upper center' : 9,
     # 'center'       : 10,
    
    # 坐标轴设置
    plt.xlabel('X axis') # x坐标轴
    plt.ylabel('Y axis') # y坐标轴
    
    plt.xlim((-1, 2)) # x刻度范围
    plt.ylim((-2, 3)) # y刻度范围
    
    plt.xticks(np.linspace(-1, 2, 5)) # 重定义x轴刻度
    plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) # 重定义y轴刻度
    
    axy = plt.gca() # 获取当前坐标轴信息
    axy.spines['right'].set_color('none') # 设置右边框为空
    axy.spines['top'].set_color('none') # 设置顶边框为空
    axy.xaxis.set_ticks_position('bottom') # 设置x轴坐标刻度数字的位置为bottom(还有top\both\default\none)
    axy.spines['bottom'].set_position(('data', 0)) # 把bottom边框移到y=0的位置 (位置属性:outward\axes\data)
    axy.yaxis.set_ticks_position('left') # 设置y轴坐标刻度数字为left
    axy.spines['left'].set_position(('data', 0)) # 把left边框移动到x=0的位置
    
    # 画点和垂直线,并对点进行标注
    x0 = 0.5
    y0 = 2*x0 + 1
    plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5) # 画出一条垂直于x轴的虚线.
    plt.scatter([x0, ], [y0, ], s=50, color='b') # 画点
    plt.annotate(r'$2x+1=%s$' % y0,     # 标注的文字
                 xy=(x0, y0),           # 标注的数据点
                 xycoords='data',       # 基于数据的值来选位置
                 xytext=(+20, -30),     # 标注的位置(相对坐标位置)
                 textcoords='offset points',   # xy偏差值
                 fontsize=12,           # 字体大小
                 arrowprops=dict(arrowstyle='->', connectionstyle="arc3, rad=.3")) # 连线类型设置为箭头,有弧度, rad为弧度值
    
    # 添加注释
    plt.text(0.5, -1.8, r'$Text:\ \mu\ \sigma_i\ \alpha_t.\ written\ by\ likejiao.$')
    
    # 最后展示图片
    plt.show()
    
    plot

    柱状图

    import matplotlib.pyplot as plt
    import numpy as np 
    
    n = 12 # 生成n个数据
    X = np.arange(n) # X为0到n-1的整数
    Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n) # Y1和Y2都是随机分布的数据
    Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    
    plt.bar(X, +Y1) # 画在坐标轴上方
    plt.bar(X, -Y2) # 画在坐标轴下方
    
    # 设置横纵坐标的边界,去掉横坐标的线
    plt.xlim(-.5, n)
    plt.xticks(())
    plt.ylim(-1.25, 1.25)
    plt.yticks(())
    
    # 加颜色优化图像,facecolor设置主体颜色,edgecolor设置边框颜色
    plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    
    # 加数值优化图像
    for x, y in zip(X, Y1):
        # ha: horizontal alignment 横向对齐
        # va: vertical alignment 纵向对齐
        plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')
    
    for x, y in zip(X, Y2):
        # ha: horizontal alignment
        # va: vertical alignment
        plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')
    
    # 最后展示图片
    plt.show()
    
    bar

    点状图

    import matplotlib.pyplot as plt
    import numpy as np 
    
    n = 1024 # 数据集的大小,下面两行生产1024个呈正态分布的二维数据组(平均数是0,方差是1)
    X = np.random.normal(0, 1, n) # 每一个点的X值
    Y = np.random.normal(0, 1, n) # 每一个点的Y值
    T = np.arctan2(Y, X) # 计算每一个点的颜色
    
    plt.scatter(X, Y, s=75, c=T, alpha=.5) # s:size, c:color, alpha透明度为50%
    
    plt.xlim(-1.5, 1.5)
    plt.xticks(()) # 隐藏x坐标轴
    plt.ylim(-1.5, 1.5)
    plt.yticks(()) # 隐藏y坐标轴
    
    # 最后展示图片
    plt.show()
    
    scatter

    等高线图

    import matplotlib.pyplot as plt
    import numpy as np
    
    def f(x,y):
        # the height function 生成高度值
        return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2) 
    
    # 生成n个数值
    n = 256
    x = np.linspace(-3, 3, n)
    y = np.linspace(-3, 3, n)
    X,Y = np.meshgrid(x, y) # 在二维平面上把每一个x和y一一对应编织成栅格
    
    # plt.contourf 填充颜色
    # X, Y and value for (X,Y) point 
    plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot) # alpha:透明度, cmap:可以生成对应的暖色组, 其中8代表等高线的密集程度
    
    # contour等高线绘制
    C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidths=.5) # colors:颜色, linewidth:线宽, 其中8代表等高线的密集程度
    
    # 等高线中加入文字标注
    plt.clabel(C, inline=True, fontsize=10) # inline:是否把文字画在线里
    plt.xticks(()) # 隐藏x坐标轴
    plt.yticks(()) # 隐藏y坐标轴
    
    # 最后展示图片
    plt.show()
    
    contour

    3D曲面

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import numpy as np
    
    # 先定义一个图像窗口,在窗口上添加3D坐标轴
    fig = plt.figure()
    ax = Axes3D(fig)
    
    # 给X, Y赋值
    X = np.arange(-4, 4, 0.25)
    Y = np.arange(-4, 4, 0.25)
    X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
    R = np.sqrt(X ** 2 + Y ** 2)
    # 计算高度值
    Z = np.sin(R)
    # Z = (1 - X / 2 + X**5 + Y**3) * np.exp(-X**2 -Y**2) # drawcontours.py里的等高线函数
    
    # 三维曲面,并将一个 colormap rainbow 填充颜色,之后将三维图像投影到 XY 平面上做一个等高线图。
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # rstride:row的跨度, cstride:column的跨度
    
    # 添加XY平面的等高线
    ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow')) # zdir:沿着z轴方向投影, offset相对于z=0的偏移距离
    
    # 设置z轴的坐标范围,显得好看一点
    ax.set_zlim(-2,2)
    
    # 最后展示图片
    plt.show()
    
    3D

    多个子图

    import matplotlib.pyplot as plt
    
    plt.figure()
    
    # 创建小图
    plt.subplot(2,2,1)
    plt.plot([0,1],[0,1]) # 在第1个位置创建一个小图.
    
    plt.subplot(2,2,2)
    plt.plot([0,1],[0,2]) # 在第2个位置创建一个小图.
    
    plt.subplot(223) #plt.subplot(2,2,3)可以简写
    plt.plot([0,1],[0,3])
    
    plt.subplot(224)
    plt.plot([0,1],[0,4])
    
    
    # 最后展示图片
    plt.show()  # 展示
    
    subplot

    相关文章

      网友评论

        本文标题:matplotlib 画图神器

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