Matplotlib 01 - Basic Concept

277 阅读5分钟

数据可视化工具matplotlib

  1. 什么是matplotlib
  2. matplotlib架构
  3. matplotlib画图演示
  4. matplotlib散点图、直方图、柱状图
  5. 总结

一、什么是matplotlib

  • 专用于开发绘制 2D 图表(也包括 3D)
  • 使用起来比较简单
  • 以渐进、交互方式实现数据可视化
  • 安装方式:Anaconda、pip

二、matplotlib架构

matplotlib整体架构是由以下三层组成的,各层之间单向通信,即每层只与下一层通信。

  1. Scripting 脚本
  2. Artist 美工
  3. Backend 后端

当然也可以将上面三层看作两层,上面两层是前端(提供API接口供用户调用,将服务请求传回后端),最底下一层是后端。

1. backend 层

matplotlib API位于该层,这些 API 用于在底层实现图像元素的一个个类

  • FigureCanvas对象实现了绘图区域这一概念
  • Renderer 对象在 FigureCanvas 上面绘图

2. Artist 层

图像中所有能看到的元素都属于 Artist 对象,其包括:标题、轴标签、刻度等组成图形的所有元素,这些都是Artist对象的实例

  • Figure : 可理解为画板
  • Axes : 坐标系,每个Axes对象只属于一个Figure对象,由两个Axis(坐标轴)组成。还包含曲线
  • Axis : 坐标轴,用于定义数值范围

Matplotlib Artist层.PNG

3. Scripting 层

主要用于数据分析和可视化

  • pyplot
    1. 操作或者改动Figure对象,例如创建Figure对象
    2. 大部分工作是出路样本文件的图像和坐标的形成

三、Matplotlib基本要点

1. 折线图

  1. 准备数据
  2. 导入对应的包
  3. Matplotlib.pyplot模块中的plot()绘制折线图、show()用于显示该图
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
%matplotlib inline 

# 准备数据
x = ['monday','tuesday','wednesday','thursday','friday','saturaday','sunday']
y = [300, 500, 100, 600, 800, 1000, 1200]
plt.plot(x, y) # x, y 是对应的x,y轴
# plt.show() #加上show不会展示对象的地址
[<matplotlib.lines.Line2D at 0x28997dda4f0>]




output_10_1.png

plt.plot(x, y, 'r--') # 颜色改变,--相当于显示虚线
plt.show()

output_11_0.png

plt.plot(x, y, 'r.') # 所以第三个参数的含义就是颜色、曲线类型
plt.show()

output_12_0.png

plt.plot(x, y, 'g-.') # 所以第三个参数的含义就是颜色、曲线类型
plt.show()

output_13_0.png

plt.plot(x, y, 'bo') # 比.大一点
plt.show()

output_14_0.png

plt.plot(x, y, 'b-o') # -o使用直线连起来
plt.show()

output_15_0.png

小结

  • 颜色:b、g、r、o、k(黑色)
  • 样式:.、 -. 、 o 、 -o 、--、o--、o-.

2. 更多元素

  • figsize=(宽,高)设置图片大小

    plt.figure(figsize=(20,8))

  • savefig :保存到本地, (注释掉plt.show())

    plt.savefig('./1.png)

  • xlabel, ylabel, title x轴, y轴的描述以及图表标题

    plt.xlabel(), plt.ylabel(), plt.title()

  • xticks, yticks调整x或者y轴的刻度

    plt.xticks(),plt.yticks()

  • Iw,线条的样式(比如颜色,透明度等)

    plt.plot(Iw=20)

  • 标记出特殊的点(比如告诉别人最高点和最低点在哪里)

    plt.text(x1, y1, str, verticalalignment, horizontalalignment)

① figsize=(宽,高)设置图片大小

**plt.figure(figsize=(20,8))**
plt.figure(figsize  = (20, 8))
plt.plot(x, y, 'ko-.')
plt.show()

output_19_0.png

②savefig :保存到本地, (注释掉plt.show())

**plt.savefig('./1.png)**

注意,使用show函数后,在对图像进行保存的话会失败

plt.plot(x, y, 'ko-.')
plt.show()
plt.savefig('1.png') # 1.png为空白文件

output_22_0.png

<Figure size 432x288 with 0 Axes>
plt.plot(x, y, 'ko-.')
plt.savefig('1.png')
plt.show()

output_23_0.png

③xlabel, ylabel, title x轴, y轴的描述以及图表标题

**plt.xlabel(), plt.ylabel(), plt.title()**
plt.xlabel('Testxlabel') # 对 x 轴数据进行说明
plt.ylabel('Testylabel',color = 'blue') # 对 y 轴数据进行说明,color 传入颜色
plt.title('Testtitle',fontsize = 22) # 对 图表标题 进行说明,传入关键字参数 fontsize 各异自定义字体大小

plt.plot(x, y)
plt.show()

output_25_0.png

④xticks, yticks调整x或者y轴的刻度

**plt.xticks(),plt.yticks()**
x_rescale = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
y_rescale = [20, 40, 60, 80, 100, 120, 140]
plt.plot(x, y, 'ro-') # 应该先渲染再替换
plt.xticks(x, x_rescale)# 起到了替换作用,替换前后的列表长度一定要一致
plt.yticks(y, y_rescale) 
plt.show()

output_27_0.png

⑤Iw,线条的样式(比如颜色,透明度等)

**plt.plot(Iw=20)**
plt.plot(x, y, lw = 20)
plt.show()

output_29_0.png

⑥标记出特殊的点(比如告诉别人最高点和最低点在哪里)

**plt.text(x1, y1, str, verticalalignment, horizontalalignment)**
后面两个参数只有两个可能的取值:top/bottomright/left
对应的效果就是以对应点为基准设置文本框的对齐方式
plt.plot(x, y) # 同样也是先渲染
plt.text(x[2],y[2],'TestMark',verticalalignment = 'top') # 这里只能传入字母
plt.show()

output_31_0.png

⑦中文字符的解决办法

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 放在导包下面

plt.plot(x, y)
plt.xlabel('x 轴')
plt.ylabel('y 轴')
plt.show()

output_33_0.png

⑧添加图例

用于指示各图线的标识,必须和label连用

plt.plot(x, y, label = '日收入') # label 用于给 legend 读取并显示
plt.legend(loc = 1) # 可以传入 loc 参数 来定义 legend 的 位置
plt.show()

output_35_0.png

⑨添加子画布

  • fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20, 8). dpi=80)
  • 指定有两个axes,共用20, 8的fig,返回fg对象和ax对象;其中fig对象就相当于一块白纸,返回的元组才是具体的坐标轴、曲线等
ax1_x = [1, 2, 3, 4, 5, 6, 7]
ax1_y = [7, 6, 5, 4, 3, 2, 1]
ax2_x = [ 2, 3, 4, 5, 6, 7, 8]
ax2_y = [ 6, 5, 4, 3, 2, 1, 0]

_,(ax1, ax2) = plt.subplots(nrows = 1, ncols = 2, figsize = (20, 8), dpi = 100)
ax1.plot(ax1_x, ax1_y, lw = 22)
ax2.plot(ax2_x, ax2_y)
plt.show()

output_37_0.png

3. 总结

  1. 给制了折线图plt.plot()
  2. 设置了图片的大小plt.figure( figsize=None )
  3. 实现了图片的保存plt.savofig()
  4. 设置了xy轴上的刻度和字符串plt.xticks()
  5. 设置了xy轴的标题plt.xlabel()
  6. 设置了字体font.manager.fontProporties,matplotib.rc
  7. 增加子画布, 分开显示图像plt.subplots()
  8. 为不同的图形添加图例plt.legend()
plt.bar(x, y)
plt.show()

output_39_0.png