美文网首页
matplotlib 简单上手

matplotlib 简单上手

作者: _张旭 | 来源:发表于2018-07-01 17:12 被阅读0次

    本文总结自途索的慕课网课程,增加了些自己的理解。

    matplotlib 是一个优秀的数据可视化库,可以很方便的使用Python生成方便我们分析的数据图表,一起来看看吧。

    导入必要的包

    import matplotlib.pyplot as plt
    import numpy as np
    

    如果是在jupyter中操作,可以使用%matplotlib inline这个魔术方法,它会将matplotlib绘制的图表显示在记事本中,方便直观的浏览。

    同时我们还导入了numpy,它是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

    准备绘图数据

    下面我们用它来生成一些绘图需要的数据:

    x = np.linspace(-np.pi, np.pi, 256)
    c, s = np.cos(x), np.sin(x)
    

    linspace方法指定均匀的生成256个从-pi到pi之间的点,返回一个np.array形式的数组。

    见名知意,np.cos(x)np.sin(x)是对x做了余弦和正弦的计算,并同样返回数组。

    开始画图

    有了数据我们开始画图:

    plt.figure(1)  # 当作是新建一个画布
    
    # 在画布上画两个图形
    plt.plot(x, c)  # x是横轴,c是纵轴
    plt.plot(x, s)
    
    plt.show()  # 显示图像
    
    图1

    丰富我们的图形

    当然,让面只是一个最简单的例子,实际操作时我们需要更多的标注信息,来时我们绘制的图形更易读。

    线形、颜色和标题

    在我们原来的代码上做些许修改:

    plt.figure(1)
    plt.plot(x, s, color='red', linestyle='-', label='sin')  # label 后面绘制图例用
    plt.plot(x, c, 'b--', label='cos')  # b* 同时表示颜色和线型
    
    plt.title('sin&cos') # 添加title信息
    
    plt.show()
    
    图2

    移动坐标轴

    看起来好多了, 可是坐标轴在两侧有点别扭,我们把它挪到中间:

    # 获取轴编辑器
    ax = plt.gca()
    # 将图像的上边框和右边框隐藏
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    # 将图像的下边框和左边框设置到数据域的0位置
    ax.spines['left'].set_position(('data', 0))
    ax.spines['bottom'].set_position(('data', 0))
    
    plt.show()
    
    图3

    修改坐标值,添加图例

    看起来不错,不过横轴看不出来我们的绘制点和pi有啥关系,我们需要修改下单位信息,同时把图例加上。

    # 指定五个点,使用laText,编辑公式并显示
    plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
               [r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
    plt.legend(loc='upper left')  # 根据label显示的图例相对于画面的位置
    plt.grid()  # 显示网格线
    
    plt.show()
    
    图4

    至此我们画了一个比较可观的图形了,下面是完整代码:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(-np.pi, np.pi, 256)
    c, s = np.cos(x), np.sin(x)
    
    plt.figure(1)
    plt.plot(x, s, color='red', linestyle='-', label='sin')  # label 后面绘制图例用
    plt.plot(x, c, 'b--', label='cos')  # b* 同时表示颜色和线型
    
    plt.title('sin&cos') # 添加title信息
    
    # 获取轴编辑器
    ax = plt.gca()
    
    # 将图像的上边框和右边框隐藏
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    
    # 将图像的下边框和左边框设置到数据域的0位置
    ax.spines['left'].set_position(('data', 0))
    ax.spines['bottom'].set_position(('data', 0))
    
    # 指定五个点,使用laText,编辑公式并显示
    plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
               [r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
    plt.legend(loc='upper left')
    plt.grid()
    
    plt.show()
    

    散点图的绘制

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure()
    
    fig.add_subplot(3,3,1)  # 将图像分割成三行三列,画在第一个区域中
    
    n = 128
    X = np.random.normal(0,1,n)  # 生成随机高斯分布,0是均值,1是标准差,生成128个
    Y = np.random.normal(0,1,n)
    
    T = np.arctan2(Y, X)  # 上色用
    
    plt.scatter(X, Y, s=10, c=T)  # s表示点的大小, c是颜色
    
    # 限制轴的范围
    plt.axis([-2,2,-2,2])  # [xmin, xmax, ymin, ymax]
    
    plt.xticks([])  # 取消显示轴上的数值
    plt.yticks([])
    
    plt.title('scatter')
    
    plt.xlabel('x')
    plt.ylabel('y')
    
    plt.show()
    
    图5

    柱状图的绘制

    # 柱状图
    fig.add_subplot(332) # 等价于 (3,3,2)
    
    n = 10
    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='red')
    plt.bar(X, -Y2, facecolor='blue')
    
    plt.xticks([])  # 取消显示轴上的数值
    plt.yticks([])
    
    # 添加注释
    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, '%.2f' % -y, ha='center', va='top')
    
    plt.show()
    
    图6

    绘制饼图

    # 饼图
    fig.add_subplot(333)
    
    n = 10
    
    Z = np.ones(n)
    Z[-1] = 2
    
    plt.pie(Z, colors=['%.2f' % (i/float(n)) for i in range(n)], 
            labels=['%.2f' % (i/float(n)) for i in range(n)])
    
    plt.gca().set_aspect('equal')
    
    plt.xticks([])  # 取消显示轴上的数值
    plt.yticks([])
    
    plt.title('pie')
    
    plt.show()
    
    图7

    绘制极坐标图

    # 极坐标
    fig.add_subplot(334, polar=True)  # 画图用的是plot, 所以指定polar
    
    n = 20
    
    theta = np.arange(0, 2*np.pi, 2*np.pi/n)
    radii = 10*np.random.rand(n)
    
    plt.plot(theta, radii) 
    
    plt.title('polar')
    
    plt.show()
    
    图8

    热图

    # 热图
    fig.add_subplot(335)
    
    from matplotlib import cm  # 上色用
    cmap = cm.Blues
    
    data = np.random.rand(3,3)
    plt.imshow(data, cmap=cmap)
    
    plt.title('heatmap')
    
    plt.show()
    
    图9

    3D图

    from mpl_toolkits.mplot3d import Axes3D  # 引入三维坐标系
    fig.add_subplot(336, projection='3d')  # 设置三维画布
    
    X = [0,3]
    Y = [0,3]
    Z = [0,3]
    
    plt.plot(X,Y,Z)
    
    plt.title('3d')
    
    plt.show()
    
    图10

    热力图

    # 热力图
    fig.add_subplot(313)
    
    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.contourf(X, Y, f(X,  Y), cmap=plt.cm.hot)
    
    plt.show()
    
    图11

    结语

    好啦,至此我们用matplotlib绘制了大多数的图形样式,并且使用了绘制子图的方式,将其绘制在同一个画布中,相信你已经可以根据自己的需求绘制相应的图形了。

    最后如果我们想要保存绘制好的图形可以这样操作:

    plt.savefig('./fig.png')
    

    在项目目录下就会的到保存的图片啦。

    相关文章

      网友评论

          本文标题:matplotlib 简单上手

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