zoukankan      html  css  js  c++  java
  • Matplotlib绘图学习

    画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度

    import matplotlib.pyplot as plt
    import random
    
    # 画出温度变化图
    
    # 0.准备x, y坐标的数据
    x = range(60)
    y_shanghai = [random.uniform(15, 18) for i in x]
    
    # 1.创建画布
    plt.figure(figsize=(20, 8), dpi=80)
    
    # 2.绘制折线图
    plt.plot(x, y_shanghai)
    # 增加以下两行代码
    
    # 构造x轴刻度标签
    x_ticks_label = ["11点{}分".format(i) for i in x]
    # 构造y轴刻度
    y_ticks = range(40)   #0--35
    
    # 修改x,y轴坐标的刻度显示 ,每5个为间隔
    plt.xticks(x[::5], x_ticks_label[::5])   #字符串转换
    plt.yticks(y_ticks[::5])
    
    # 3.显示图像
    plt.show()

    添加网格显示

    为了更加清楚地观察图形对应的值

    plt.grid(True, linestyle='--', alpha=0.5)

    添加描述信息

    添加x轴、y轴描述信息及标题

    通过fontsize参数可以修改图像中字体的大小

    plt.xlabel("时间")
    plt.ylabel("温度")
    plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)

    图像保存

    # 保存图片到指定路径
    plt.savefig("test.png")
    
    • 注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。

    完整代码:

    import matplotlib.pyplot as plt
    import random
    from pylab import mpl
    
    # 设置显示中文字体
    mpl.rcParams["font.sans-serif"] = ["SimHei"]
    # 设置正常显示符号
    mpl.rcParams["axes.unicode_minus"] = False
    
    # 0.准备数据
    x = range(60)
    y_shanghai = [random.uniform(15, 18) for i in x]
    
    # 1.创建画布
    plt.figure(figsize=(20, 8), dpi=100)
    
    # 2.绘制图像
    plt.plot(x, y_shanghai)
    
    # 2.1 添加x,y轴刻度
    # 构造x,y轴刻度标签
    x_ticks_label = ["11点{}分".format(i) for i in x]
    y_ticks = range(40)
    
    # 刻度显示
    plt.xticks(x[::5], x_ticks_label[::5])
    plt.yticks(y_ticks[::5])
    
    # 2.2 添加网格显示
    plt.grid(True, linestyle="--", alpha=0.5)
    
    # 2.3 添加描述信息
    plt.xlabel("时间")
    plt.ylabel("温度")
    plt.title("中午11点--12点某城市温度变化图", fontsize=20)
    
    # 2.4 图像保存
    plt.savefig("./test.png")
    
    # 3.图像显示
    plt.show()

    在一个坐标系中绘制多个图像

    多次plot

    需求:再添加一个城市的温度变化

    收集到北京当天温度变化情况,温度在1度到3度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条

    import matplotlib.pyplot as plt
    import random
    # 0.准备数据
    x = range(60)
    y_shanghai = [random.uniform(15, 18) for i in x]
    y_beijing = [random.uniform(1, 3) for i in x]
    
    # 1.创建画布
    plt.figure(figsize=(20, 8), dpi=100)
    
    # 2.绘制图像
    plt.plot(x, y_shanghai, label="上海")
    plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
    
    # 2.1 添加x,y轴刻度
    # 设置x,y轴刻度
    x_ticks_label = ["11点{}分".format(i) for i in x]
    y_ticks = range(40)
    
    # 修改x,y轴坐标刻度显示
    # plt.xticks(x_ticks_label[::5]) # 坐标刻度不可以直接通过字符串进行修改
    plt.xticks(x[::5], x_ticks_label[::5])
    plt.yticks(y_ticks[::5])
    
    # 2.2 添加网格显示
    plt.grid(True, linestyle="--", alpha=1)
    
    # 2.3 添加描述信息
    plt.xlabel("时间")
    plt.ylabel("温度")
    plt.title("中午11点-12点某城市温度变化图", fontsize=20)
    
    # 2.4 图像保存
    #plt.savefig("./test.png")
    
    # 2.5 显示图例
    plt.legend(loc=0)
    
    # 3.图像显示
    plt.show()

     

     

    多个坐标系显示— plt.subplots(面向对象的画图方法)

    如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中

    可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数

    • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图

      Parameters:    
      
      nrows, ncols : 设置有几行几列坐标系
          int, optional, default: 1, Number of rows/columns of the subplot grid.
      
      Returns:    
      fig : 图对象
      axes : 返回相应数量的坐标系
      
      设置标题等方法不同:
          set_xticks
          set_yticks
          set_xlabel
          set_ylabel
    • 注意:plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法
    • import matplotlib.pyplot as plt
      import random
      # 0.准备数据
      x = range(60)
      y_shanghai = [random.uniform(15, 18) for i in x]
      y_beijing = [random.uniform(1, 3) for i in x]
      
      # 1.创建画布
      # plt.figure(figsize=(20, 8), dpi=100)
      fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
      
      # 2.绘制图像
      # plt.plot(x, y_shanghai, label="上海")
      # plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
      axes[0].plot(x, y_shanghai, label="上海")
      axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")
      
      # 2.1 添加x,y轴刻度
      # 设置x,y轴刻度
      x_ticks_label = ["11点{}分".format(i) for i in x]
      y_ticks = range(40)
      
      # 修改x,y轴坐标刻度显示
      # plt.xticks(x_ticks_label[::5]) # 坐标刻度不可以直接通过字符串进行修改
      # plt.xticks(x[::5], x_ticks_label[::5])
      # plt.yticks(y_ticks[::5])
      axes[0].set_xticks(x[::5])
      axes[0].set_yticks(y_ticks[::5])
      axes[0].set_xticklabels(x_ticks_label[::5])
      axes[1].set_xticks(x[::5])
      axes[1].set_yticks(y_ticks[::5])
      axes[1].set_xticklabels(x_ticks_label[::5])
      
      # 2.2 添加网格显示
      # plt.grid(True, linestyle="--", alpha=1)
      axes[0].grid(True, linestyle="--", alpha=1)
      axes[1].grid(True, linestyle="--", alpha=1)
      
      # 2.3 添加描述信息
      # plt.xlabel("时间")
      # plt.ylabel("温度")
      # plt.title("中午11点-12点某城市温度变化图", fontsize=20)
      axes[0].set_xlabel("时间")
      axes[0].set_ylabel("温度")
      axes[0].set_title("中午11点-12点某城市温度变化图", fontsize=20)
      axes[1].set_xlabel("时间")
      axes[1].set_ylabel("温度")
      axes[1].set_title("中午11点-12点某城市温度变化图", fontsize=20)
      
      # 2.4 图像保存
      plt.savefig("./test.png")
      
      # 2.5 显示图例
      # plt.legend(loc=0)
      axes[0].legend(loc=0)
      axes[1].legend(loc=0)
      
      # 3.图像显示
      plt.show()

      折线图的应用场景

      • 呈现公司产品(不同区域)每天活跃用户数

      • 呈现app每天下载数量

      • 呈现产品新功能上线后,用户点击次数随时间的变化

      • 拓展:画各种数学函数图像

        • 注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像

        • import numpy as np
          
          # 0.准备数据
          x = np.linspace(-10, 10, 1000)
          y = np.sin(x)
          
          # 1.创建画布
          plt.figure(figsize=(20, 8), dpi=100)
          
          # 2.绘制函数图像
          plt.plot(x, y)
          
          # 2.1 添加网格显示
          plt.grid()
          
          # 3.显示图像
          plt.show()

          散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

          特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

          api:plt.scatter(x, y)

        • import matplotlib.pyplot as plt
          # 0.准备数据
          x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01,  20.67, 288.64,
                 163.56, 120.06, 207.83, 342.75, 147.9 ,  53.06, 224.72,  29.51,
                  21.61, 483.21, 245.25, 399.25, 343.35]
          y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61,  24.9 , 239.34,
                 140.32, 104.15, 176.84, 288.23, 128.79,  49.64, 191.74,  33.1 ,
                  30.74, 400.02, 205.35, 330.64, 283.45]
          
          # 1.创建画布
          plt.figure(figsize=(20, 8), dpi=50)
          
          # 2.绘制图像
          plt.scatter(x, y)
          
          # 3.图像显示
          plt.show()

          柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。

          特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)

          api:plt.bar(x, width, align='center', **kwargs)

        • Parameters:    
          x : 需要传递的数据
          
          width : 柱状图的宽度
          
          align : 每个柱状图的位置对齐方式
              {‘center’, ‘edge’}, optional, default: ‘center’
          
          **kwargs :
          color:选择柱状图的颜色
        • import matplotlib.pyplot as plt
          # 0.准备数据
          # 电影名字
          movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
          # 横坐标
          x = range(len(movie_name))
          # 票房数据
          y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
          
          # 1.创建画布
          plt.figure(figsize=(20, 8), dpi=80)
          
          # 2.绘制图像
          plt.bar(x, y, color=['b','r','g','y','c','m','y','k','c','g','b'], width=0.7)
          
          # 2.1 修改x轴显示
          plt.xticks(x, movie_name)
          
          # 2.2 添加网格
          plt.grid(linestyle="--", alpha=0.8)
          
          # 2.3 添加标题
          plt.title("电影票房收入对比")
          
          # 3.图像显示
          plt.show()

  • 相关阅读:
    shell
    RANDOM随机数
    docker网络管理
    Oracle-28001密码过期问题及28000账户被锁解决
    Oracle数据泵导入导出(expdb/impdb)
    mysql多实例部署
    sed命令基本使用
    MySQL5.7.x二进制安装
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/a155-/p/14309347.html
Copyright © 2011-2022 走看看