zoukankan      html  css  js  c++  java
  • Matplotlib

    Matplotlib的基本元素:

    1,变量

    2,函数

    3,画布(figure)

    4,坐标轴(axes)

    绘图过程:变量和函数通过改变figure和axes中的元素(如:title,label)一起描述figure和axes

    Matplotlib的图像位于figure对象中

    通过plt.figure()创建

      如果没有指定创建,matplotlib会自动生成默认的画布

      参数figsize用来控制画布的大小,单位为英寸(inch), 1 inch = 2.54 cm

    用plt.show()显示绘图结果

    注意的是,在jupyter notebook中使用matplotlib时,代码块需要放在一个cell中

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.figure() # 创建画布
    Out[19]: <Figure size 640x480 with 0 Axes>
    data = [2,4,6,8,10]  #构造数据
    
    # 可视化数据
    plt.plot(data)  #plot是绘制折线
    Out[21]: [<matplotlib.lines.Line2D at 0xc35eb10>]
    plt.show()

    plt.figure(figsize=(15, 6))  # 控制画布大小
    plt.plot(np.random.randn(100))
    plt.show()

    ①散点图:

    plt.scatter(x, y, s,c,marker)  # s,c,marker有默认值

    * x 横轴的数据

    * y 纵轴的数据

    * s点的大小,标量或数组 →标量:同时所有点的大小(颜色)

    * c点的颜色,标量或数组→数组:为每一个点设置不同的大小(颜色)

    * marker点的样式

    ②柱状图:

    plt.bar(x,xheight,color)

    * x柱子的横坐标

    *height 柱子的高度(数据)

    *color柱子的颜色

    注意:绘制多组柱状图时,需要设置不同的横坐标,防止重叠

    x1 = [1,3,5,7,9]
    data1=[5,2,7,8,2]
    plt.bar(x1,data,color='r')
    x2 = np.array(x1)+1  # 设置不同的横坐标防止覆盖
    plt.bar(x2, np.array(data1)+2, color='g')
    plt.show()

    要求在同一个画布上绘制A同学和B同学的成绩,设置画布的大小为10*5,柱子的宽度为0.5,绘制图例,A同学的柱子颜色用红色表示,B同学柱子的颜色用蓝色表示,x轴标签是year,y轴标签为score。
    
    
    
    plt.figure(figsize=(10,5))
    
    
    
    year=["2016","2017","2018","2019"]
    
    
    
    x_A=[1,3,5,7]
    
    
    
    score_A = [40,50,59,60]
    
    
    
    w =0.5
    
    
    
    plt.bar(x_A,score_A,(1)=w,label="A")
    
    
    
     
    
    
    
    x_B=np.array(x_A)+w
    
    
    
    score_B = [50,70,80,90]
    
    
    
    plt.bar(x_B,(2),width=w,(3)="B")
    
    
    
    plt.xlabel("year")
    
    
    
    plt.(4)("score")
    
    
    
    plt.legend()
    
    
    
    plt.xticks(x_B-0.25,year)
    
    
    
    plt.show()
    填空(1): 正确答案 width
    填空(2): 正确答案 score_B
    填空(3): 正确答案 label
    填空(4): 正确答案 ylabel
    View Code

    ③直方图:

    形式类似于柱状图

    * 通过将数据组合在一起来显示分布比如:显示各年龄段的数据个数plt.hist(x, bins, rwidth)

    * x 数据rwidth柱子宽度比例,默认为1

    * bins 分组的个数或分组边界,如4[20, 30, 40, 50, 60]

    *** 除了最后一组,其余组的右边界是开放的[20, 30), [30, 40), [40, 50), [50, 60]

     

    import matplotlib.pyplot as plt
    ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45]
    bins = 5  # 分为5组
    plt.hist(ages, bins)
    plt.show()

     

    import matplotlib.pyplot as plt
    ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45]
    bins = [15,25,35,45,55]
    plt.hist(ages, bins, histtype='bar', rwidth=0.5)
    plt.show()

     柱子变窄了

     ④子图:

     子图是什么意思呢,就是在一张图中绘制多个图

    看一个例子:

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    fig, subplot_arr = plt.subplots(2,2,figsize=(8,8))
    subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
    subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
    subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
    subplot_arr[1,1].imshow(np.random.randn(5,5))
    
    plt.show()

    成图如下:

    那如果共享x轴

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharex=True)  # 共享x轴
    subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
    subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
    subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
    subplot_arr[1,1].imshow(np.random.randn(5,5))
    
    plt.show()

    共享y轴:

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharey=True)  # 共享y轴
    subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
    subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
    subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
    subplot_arr[1,1].imshow(np.random.randn(5,5))
    
    plt.show()

    看个练习:

    使用subplots生成4子图,第一个子图ax[0,0]对x数据进行可视化,第二个子图ax[0,1]对np.sin(x)的数据进行显示,第三个子图ax[1][0]对np.cos(x)数据进行显示,第四个子图ax[1][1]对x的平方进行显示,并且,子图公用x轴。
    
    
    
    fig,ax =  plt.subplots((1),2,sharex=(2))
    
    
    
    x = [0,90,180,270,360,450]
    
    
    
    data=[np.array(x),np.sin(x),np.cos(x),np.array(x)**2]
    
    
    
    for i in range(2):
    
    
    
        for j in range(2):
    
    
    
            if i==0:
    
    
    
                ax[i][j].plot(x,data[i+j])
    
    
    
            else:
    
    
    
                ax[i][j].plot(x,data[i+j+1])
    
    
    
    plt.show()
    
    
    填空(1): 正确答案 2, 你的答案 2。
    填空(2): 正确答案 True, 你的答案 True。
    回答正确。
    
     收藏  展开解析
    2
    50.0分
    在一个画布上绘制两个子图,其中第一个子图的title设置为title0,第二个子图的title设置为title1,并且设置子图共用一个y轴。
    
    
    
    x = np.random.randint(1,10,size=8)
    
    
    
    y = np.sin(x)
    
    
    
    fig, ax = plt.(1)(nrows=1,ncols=2,(2)=True)
    
    
    
    plot_method = []
    
    
    
    i=0
    
    
    
    for col in ax:
    
    
    
        col.plot(x, y)
    
    
    
        col.set_title('title'+str((3)))
    
    
    
        col.set_xlabel('x-axis')
    
    
    
        i+=1
    
    
    
    plt.show()
    
    
    
    》》》》
    
    
    
    填空(1): 正确答案 subplots。
    填空(2): 正确答案 sharey
    填空(3): 正确答案 i

    matplotlib颜色,标记和线型

    先看个示例:

    fig, subplot_arr = plt.subplots(2,2,figsize=(8,8))
    data = np.random.randn(20)
    subplot_arr[0,0].plot(data,'r.--')
    subplot_arr[0,1].plot(data,'gv:')
    subplot_arr[1,0].plot(data,'b<-')
    subplot_arr[1,1].plot(data,'ys-.')
    
    plt.show()

    他的灵活性在于fmt参数值得顺序可以颠倒,甚者缺失部分

    matplotlib的坐标刻度标签,图例,标题

     在xtick上需要传入的是两个列表,第一个用来标识真实值,第二个指的是标签

     

    但是需要注意的是,在Linux上面是不管用的,需要指定其他字体

    data1 = np.random.randn(1000).cumsum()
    data2 = np.random.randn(1000).cumsum()
    data3 = np.random.randn(1000).cumsum()
    # 基本显示
    plt.figure()
    plt.plot(data1)
    plt.plot(data2)
    plt.plot(data3)
    plt.show()

    使用plt

    data1 = np.random.randn(1000).cumsum()
    data2 = np.random.randn(1000).cumsum()
    data3 = np.random.randn(1000).cumsum()
    # 基本显示
    # plt.figure()
    # plt.plot(data1)
    # plt.plot(data2)
    # plt.plot(data3)
    # plt.show()
    # 使用plt配置
    plt.figure()
    plt.xlim([0,500])#设置刻度宽度
    plt.xticks([0,100,200], ['x', 'xx', 'xxx'])#设置自定义的刻度
    #设置坐标轴标签
    plt.xlabel('Number')
    plt.ylabel('Random')
    #设置标题
    plt.title('Example')
    #图例
    plt.plot(data1)
    plt.plot(data2, label='line2')
    plt.plot(data3, label='line3')
    
    plt.legend(loc='best')
    plt.show()

     使用ax

    fig, ax = plt.subplots(1)
    ax.plot(data1, label='line1')
    ax.plot(data2, label='line2')
    ax.plot(data3, label='line3')
    #设置刻度
    ax.set_xlim([0,800])
    #设置显示的刻度
    ax.set_xticks([0,100, 200, 300, 400,500])
    #设置坐标轴标签
    ax.set_xticklabels(['x1', 'x2', 'x3', 'x4', 'x5'])
    #设置坐标轴标签
    ax.set_xlabel('Number')
    ax.set_ylabel('Random')
    #设置标题
    ax.set_title('Examples2')
    plt.show()

  • 相关阅读:
    在Electron中最快速预加载脚本
    Babel是什么?
    node、npm、chrome、v8、sandbox是什么?
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    NN[神经网络]中embedding的dense和sparse是什么意思?
    记一次失败的docker排障经历
    paddlepaddle关于使用dropout小案例
    paddlepaddle如何预加载embedding向量
    最近在部署推荐系统环境时,遇到一个很奇葩都问题
    fluid.io.load_inference_model 载入多个模型的时候会报错 -- [paddlepaddle]
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/10673326.html
Copyright © 2011-2022 走看看