欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习(3)- Matplotlib

程序员文章站 2022-03-20 13:09:56
...

Matplotlib

一. Matplotlib之HelloWorld

  1. 什么是Matplotlib
    专门绘制2D图表的软件

  2. 为什么要学习Matplotlib
    做数据可视化, Matplotlib是一个比较方便的工具

  3. 实现一个简单的Matplotlib画图

  4. 导入: import matplotlib.pyplot as plt

    1. 准备数据
    2. 创建画布
    3. 绘图
    4. 展示
  5. Matplotlib三层结构

    1. 容器层

      画板 -> 画布 -> 坐标系

    2. 辅助层

      1. 刻度, 坐标轴的标题, 标题, 网格, 图例
    3. 图像层

      1. 折线, 柱状图, 散点图, 饼状图, 直方图 …

二. 折线图(plot)与基础绘图功能

1. 折线图绘制与保存图片

  1. 绘图三步:
    1. 创建画布
    2. 绘图
    3. 展示
  2. 保存图片
  • API: plt.savefig(path)
  • 注意: 必须在show()前调用
  • 原因: show()把画布清空了.

2. 完善原始折线图1(辅助显示层)

  • 2.1 添加自定义x,y刻度

    • 添加x轴刻度

      • api: plt.xticks(x, 刻度文本列表)
    • 添加y轴刻度

      • api: plt.yticks(y, 刻度文本列表)
    • 注意:

      1. 第一个参数必须是一个标量的列表
      2. 刻度文本列表必须和标量的列表一一对应
      import random
      # 准备数据
      
      x = range(60)
      y_gz = [random.randint(25,35)  for i in x]
      
      # 创建画布
      
      plt.figure(figsize=(20, 8), dpi=80)
      
      # 绘图
      
      plt.plot(x, y_gz)
      
      # 添加刻度
      
      # 准备刻度的数据
      
      x_ticks = ['11点{}分'.format(i) for i in x]
      y_ticks = range(40)
      
      # 设置刻度
      
      plt.xticks(x[::5], x_ticks[::5], fontsize=20)
      plt.yticks(y_ticks[::5], fontsize=20)
      
      # 展示
      
      plt.show()
      
  • 2.2 中文显示问题解决[了解]

    1. 下载黑体
    
    2. 拷贝字体文件
    
        # ~/.virtualenvs/ai/local/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf
        # 字体文件
        # 打印matplotlib配置文件的位置
        import matplotlib
        print(matplotlib.matplotlib_fname())
    
    1. 编辑配置文件

        #cd  ~/.virtualenvs/ai/local/lib/python3.5/site-packages/matplotlib/mpl-data 
        #vim matplotlibrc 
      
        # 添加下面内容到配置文件中
        font.family         : sans-serif
        font.sans-serif         : SimHei
        axes.unicode_minus  : False
      
    2. 删除缓存文件

        rm -r ~/.cache/matplotlib/*
      
    3. 重新运行 jupyter notebook

  • 2.3 添加网格显示

    • API: plt.grid(linestyle, alpha, color)
    • 参数:
      • linestyle; 线的样式, - 实线, --虚线
    • alpha: 透明度
      • color: 颜色 r,g,b
  • 2.4 添加描述信息

    • 添加x轴描述: plt.xlabel(‘名称’, fontsize)
    • 添加y轴描述: plt.ylabel(‘名称’, fontsize)
    • 添加标题: plt.title(‘标题’, fontsize)

3. 完善原始折线图2(图像层)

  • 3.1 多次plot

    • 如何绘制多折线图?
      • 调用多次 plt.plot()
    • plt.plot(x,y,linestyle,color,label)
    • linestyle; 线的样式, - 实线, – 虚线
    • color: r,g,b,y,c,m,k(黑色)
    • label: 给线打标签(起名字)
  • 3.2 图例

    • plt.legend(loc=‘best’, fontsize=20)
    • 注意: 线要有label.
    1. 多个坐标系显示-plt.subplots(面向对象的画图方法)
    • API: plt.subplots(nrows=1, ncols=1, figsize=(20, 10), dpi=80)
    • 参数:
      • nrows: 有几行坐标系
      • ncols: 有几列坐标系
      • figsize: 画布大小
      • dpi: 清晰度
    • 返回:
      • 画布, 坐标系的元组(列表)
  • 坐标系功能与plt相同, 有些方法不同

    • set_xticks()
    • set_yticks()
    • set_xticklabels()
    • set_title()
    • set_xlabel()
    • set_ylabel()
# 准备数据
x = range(60)
y_gz = [random.randint(25,35)  for i in x]
y_bj = [random.randint(10,20)  for i in x]

# 获取两个坐标系
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)

# 绘制折线图
axes[0].plot(x, y_gz, linestyle='--', color='r', label='广州')
axes[1].plot(x, y_bj, color='b', label='北京')

# 添加图例
axes[0].legend()
axes[1].legend()

# 设置刻度
xticks = ['11点{}分'.format(i) for i in x]
yticks = range(40)
axes[0].set_xticks(x[::10])
axes[0].set_xticklabels(xticks[::10])
axes[0].set_yticks(yticks[::5])

axes[1].set_xticks(x[::10])
axes[1].set_xticklabels(xticks[::10])
axes[1].set_yticks(yticks[::5])

# 设置坐标轴描述(名称)
axes[0].set_xlabel('时间')
axes[0].set_ylabel('文档')
axes[0].set_title('广州11点到12点的温度变化情况')

axes[1].set_xlabel('时间')
axes[1].set_ylabel('文档')
axes[1].set_title('北京11点到12点的温度变化情况')

plt.show()

三. 折线图的应用场景

  1. 绘制数据随时间变化的情况
  2. 绘制函数图形.
import numpy as np
# 准备数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)

# 创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 绘图
plt.plot(x, y)

# 展示
plt.show()

四. 常见图像绘制

  1. API与含义:

    • 折线图: 用于描述数据的变化情况
      • API: plt.plot(x, y)
    • 散点图: 1. 查看两个变量的相关性 2. 查看数据的分布情况
      • API: plt.scatter(x, y)
    • 柱状图: 对比,时间序列.
      • API: plt.bar(x, height, width, color)
    • 直方图: 用于统计一组连续数据的分布情况
      • API: plt.hist(x, bins)
    • 饼状图: 统计每一部分的占比情况
      • API: plt.pie(x, labels, autopct, colors)
  2. 案例

    • 散点图绘制

         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]
      
     # 创建画布
     plt.figure(figsize=(20,8), dpi=80)
     # 绘制散点图
     plt.scatter(x, y)

     # 展示
     plt.show()

- 柱状图

  ```python
     # 准备数据
     movie_names =  ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
     height = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
  
     # 创建画布
     plt.figure(figsize=(20, 8), dpi=80)
  
     # 绘制柱状图
     x = range(len(movie_names))
     plt.bar(x, height, width=0.5, color=['r','g','b','c','m','k','y'])
  
     # 设置x轴刻度
     plt.xticks(x, movie_names)
  
     # 展示
     plt.show()
  • 饼状图

       # 准备数据
       x = [10, 20, 30, 40, 60]
    
       # 创建画布
       plt.figure(figsize=(4, 4), dpi=100)
    
       # 绘制饼状图
       plt.pie(x, labels=list('abcde'), autopct='%.2f%%', colors=['r','g','y','c','m'])
    
       # 展示
       plt.show()