栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

matplotlib教程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

matplotlib教程

目录

文章目录
    • 目录
    • 三、matplotlib概述
      • 1. matplotlib基本功能
    • 四、matplotlib基本功能详解
      • 1. 基本绘图
        • 1)绘图核心API
        • 2)设置线条属性( 线型、线宽...)
        • 3)设置坐标轴范围
        • 4)设置坐标刻度
        • 5) 设置坐标文字
        • 6)设置坐标轴
        • 7)图例
        • 8)设置特殊点
        • 9)备注
      • 2. 图形对象(图形窗口)
        • 1)子图
        • 2)刻度定位器
        • 3)刻度网格线
        • 5)填充
        • 6)散点图
        • 7)条形图(柱状图)
        • 8)饼图

三、matplotlib概述

matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形。通常用于数据可视化

数据可视化

数据可视化是指使用图形的方式展现数据的分布规律

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKqvPqsX-1638272061347)(./img/饼图示例.png)]

1. matplotlib基本功能
  1. 基本绘图 (在二维平面坐标系中绘制连续的线)
    1. 设置线型、线宽和颜色
    2. 设置坐标轴范围
    3. 设置坐标刻度
    4. 设置坐标轴
    5. 图例
    6. 特殊点
    7. 备注
  2. 图形对象(图形窗口)
    1. 子图
    2. 刻度定位器
    3. 刻度网格线
    4. 半对数坐标
    5. 散点图
    6. 填充
    7. 条形图
    8. 饼图
    9. 等高线图
    10. 热成像图
    11. 三维曲面
    12. 简单动画

官方文档: https://matplotlib.org/

官方中文文档: https://www.matplotlib.org.cn/

四、matplotlib基本功能详解 1. 基本绘图 1)绘图核心API
  • 绘制水平线API
import matplotlib.pyplot as plt
plt.axhline(y=y轴位置 ...)
plt.hlines([y1, y2, y3, ...],  # Y轴 位置
           [x11, x21, x31, ...],  # X 轴的起始位置
           [x12, x22, x32, ...])  # X 轴的终止位置
  • 绘制垂直竖线API
import matplotlib.pyplot as plt
plt.axvline(x=x轴位置, ...)
plt.vlines([x1, x2, x3, ...],  # X轴 位置
           [y11, y21, y31, ...],  # Y 轴的起始位置
           [y12, y22, y32, ...])  # Y 轴的终止位置
  • 绘制折线API
import matplotlib.pyplot as plt
plt.plot(x坐标点(矢量), y坐标点(矢量), ...)

案例: 绘制简单直线

import numpy as np
import matplotlib.pyplot as plt

# 绘制水平线
plt.axhline(y=6, ls=":", c="blue")  # 添加水平直线
# 绘制垂线
plt.axvline(x=4, ls="-", c="red")   # 添加垂直直线

# 绘制多段垂线
plt.vlines([2, 3, 3.5],   # 垂线的x坐标值
          [10, 20, 30],  # 每条垂线起始y坐标
          [25, 35, 45])  # 每条垂线结束y坐标

# 绘制简单直线
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 2, 9, 8, 15])

plt.plot(x, y)
plt.savefig('mypic.png')  # 保存图片为PNG 图片
plt.show() # 显示图片,阻塞方法

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Byf22lb-1638272061348)(./img/直线.png)]

2)设置线条属性( 线型、线宽…)
  • 用来标识线性的关键字参数

    • linestyle、ls:

      设置线型

      • 符号字符串:常见取值有实线(’-’)、虚线(’–’)、点虚线(’-.’)、点线(’:’)
      • 线型名字字符串,如:‘solid’, ‘dotted’, ‘dashed’, ‘dashpot’
      • 元组:如(0, (1, 5))

      具体线型见下表

    • linewidth、lw:线宽数字

    • color、c颜色:

      • 颜色字符串,如: ‘red’, ‘dodgerblue’; 详见下表《颜色标记字符串》
      • RGB 格式的字符串#RRGGBB, 如 ‘#CE50B3’或#RRGGBBAA 如:’#FF888840’
      • RGB颜色的列表(red, blue, green), 如(0.3, 1.0, 0.5, 0.5)
    • alpha: 设置透明度(0~1之间)

案例:绘制正弦、余弦曲线,并设置线型、线宽、颜色、透明度

# 绘制正弦曲线
import numpy as np
import matplotlib.pyplot as plt
import math

x = np.arange(0, 2 * np.pi, 0.1)  # 以0.1为单位,生成0~6的数据
print(x)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制图形
plt.plot(x, y1, label="sin", linewidth=2)  # 实线,线宽2像素
plt.plot(x, y2, label="cos", linestyle="--", linewidth=4)  # 虚线,线宽4像素

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(0, 2 * math.pi)
plt.ylim(-1, 2)

plt.title("sin & cos")  # 图标题
plt.legend()  # 图例
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmXKxS3E-1638272061349)(./img/sin_cos曲线.png)]

  • 线型表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHDASXNK-1638272061349)(./img/line_style.png)]

  • 颜色标记字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmJdLqd4-1638272061350)(./img/matplotlib_colors.png)]

3)设置坐标轴范围

语法:

#x_limt_min:     x轴范围最小值
#x_limit_max:     x轴范围最大值
plt.xlim(x_limt_min, x_limit_max)
#y_limt_min:     y轴范围最小值
#y_limit_max:     y轴范围最大值
plt.ylim(y_limt_min, y_limit_max)
4)设置坐标刻度

语法:

# 设置 x 轴 刻度
plt.xticks(
    ticks=None,   # x轴刻度值序列
    labels=None,  # x轴刻度标签文本序列
    rotation=0    # 刻度旋转角度
)
# 设置 y 轴 刻度
plt.yticks(
    ticks=None,   # y轴刻度值序列
    labels=None,  # y轴刻度标签文本序列
    rotation=0    # 刻度旋转角度
)
5) 设置坐标文字

语法

# 设置x轴文字
plt.xlabel("x轴文字", fontsize=字体大小) 
# 设置y轴文字
plt.ylabel("y轴文字", fontsize=字体大小) 

案例:绘制二次函数曲线

# 绘制二次函数曲线
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.1)  # 以0.1为单位,生成-5~5的数据
y = x ** 2

# 绘制图形
plt.plot(x, y, label="$y = x^2$",
         linewidth=2,  # 线宽2像素
         color="red",  # 颜色
         alpha=0.5)  # 透明度

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-1, 30)

# 设置刻度
plt.title("square")  # 图标题
plt.legend(loc="upper right")  # 图例 upper right, center
plt.show()

执行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX5MaWgB-1638272061350)(./img/一元二次曲线.png)]

刻度文本的特殊语法LaTex排版语法字符串

r'$x^n+y^n=z^n$',   r'$intfrac{1}{x} dx = ln |x| + C$',     r'$-frac{pi}{2}$'

x n + y n = z n , ∫ 1 x d x = ln ⁡ ∣ x ∣ + C , − π 2 x^n+y^n=z^n, intfrac{1}{x} dx = ln |x| + C, - frac{pi}{2} xn+yn=zn,∫x1​dx=ln∣x∣+C,−2π​

6)设置坐标轴

坐标轴名:left / right / bottom / top

# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = plt.gca()
# 获取其中某个坐标轴
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
# type:  移动坐标轴的参照类型  一般为'data' (以数据的值作为移动参照值)
# val:  参照值
axis.set_position((type, val))
# 设置坐标轴的颜色
# color:  颜色值字符串
axis.set_color(color)

案例:设置坐标轴格式

# 设置坐标轴
import matplotlib.pyplot as plt

ax = plt.gca()
axis_b = ax.spines['bottom']  # 获取下轴
axis_b.set_position(('data', 0))  # 设置下轴位置, 以数据作为参照值

axis_l = ax.spines['left']  # 获取左轴
axis_l.set_position(('data', 0))  # 设置左轴位置, 以数据作为参照值

ax.spines['top'].set_color('none')  # 设置顶部轴无色
ax.spines['right'].set_color('none')  # 设置右部轴无色

plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VRiFhRYg-1638272061351)(./img/坐标轴格式.png)]

7)图例
  • Label 关键子参数设置图例文字

    再绘制曲线时定义曲线的label

    label: <关键字参数 str> 支持LaTex排版语法字符串

    函数:

plt.plot(xarray, yarray, ... ,label='图例文字', ...)

  • 设置图例的位置

    函数:

plt.legend(loc='位置字符串')

图例的显示位置 loc 的值

Location StringLocation Code
‘best’0
‘upper right’1
‘upper left’2
‘lower left’3
‘lower right’4
‘right’5
‘center left’6
‘center right’7
‘lower center’8
‘upper center’9
‘center’10

示例

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi)
sin_y = np.sin(x)
cos_y = np.cos(x)/2


plt.plot(x, sin_y, linewidth=2, label=r'$y=sin(x)$')
plt.plot(x, cos_y, linewidth=2, label=r'$y=frac{cos(x)}{2}$')
plt.legend()

plt.show()

效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuR9VL4W-1638272061351)(./img/lines_label.png)]

8)设置特殊点

函数:

# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray, 
           marker='',         #点型 ~ matplotlib.markers
           size='',             #大小
           edgecolor='',     #边缘色
           facecolor='',    #填充色
           zorder=3              #绘制图层编号 (编号越大,图层越靠上)
)

示例:在二次函数图像中添加特殊点

# 绘制二次函数曲线
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.1)  # 以0.1为单位,生成-5~5的数据
y = x ** 2

# 绘制图形
plt.plot(x, y, label="$y = x^2$",
         linewidth=2,  # 线宽2像素
         color="red",  # 颜色
         alpha=0.5)  # 透明度

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-1, 30)

# 设置刻度
plt.title("square")  # 图标题
plt.legend(loc="upper right")  # 图例 upper right, center
# 绘制散点图
point_x = np.array([-4, -2, 0, 2, 4])
point_y = point_x ** 2

# 绘制特殊点
plt.scatter(point_x, point_y,
           marker='s',
           s=50,
           edgecolors='blue',
           facecolor='yellow',
           zorder=3)
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTveZNvL-1638272061352)(./img/特殊点.png)]

  • matplotlib点样式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lU9lbug6-1638272061352)(./img/matplotlib_markers.png)]

9)备注

语法:

# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
plt.annotate(
    r'$frac{pi}{2}$',         #备注中显示的文本内容
    xycoords='data',            #备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(x, y),                  #备注目标点的坐标
    textcoords='offset points', #备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(x, y),              #备注文本的坐标
    fontsize=14,                #备注文本的字体大小
    arrowprops=dict()           #使用字典定义文本指向目标点的箭头样式
)

arrowprops参数使用字典定义指向目标点的箭头样式

#arrowprops字典参数的常用key
arrowprops=dict(
    arrowstyle='',        #定义箭头样式
    connectionstyle=''    #定义连接线的样式
)

箭头样式(arrowstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  '-'          None
  '->'         head_length=0.4,head_width=0.2
  '-['         widthB=1.0,lengthB=0.2,angleB=None
  '|-|'        widthA=1.0,widthB=1.0
  '-|>'        head_length=0.4,head_width=0.2
  '<-'         head_length=0.4,head_width=0.2
  '<->'        head_length=0.4,head_width=0.2
  '<|-'        head_length=0.4,head_width=0.2
  '<|-|>'      head_length=0.4,head_width=0.2
  'fancy'      head_length=0.4,head_width=0.4,tail_width=0.4
  'simple'     head_length=0.5,head_width=0.5,tail_width=0.2
  'wedge'      tail_width=0.3,shrink_factor=0.5
============   =============================================

连接线样式(connectionstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  'angle'         angleA=90,angleB=0,rad=0.0
  'angle3'         angleA=90,angleB=0`   
  'arc'            angleA=0,angleB=0,armA=None,armB=None,rad=0.0
  'arc3'         rad=0.0
  'bar'         armA=0.0,armB=0.0,fraction=0.3,angle=None
============   =============================================

示例:在二次函数图像中添加备注

# 绘制二次函数曲线
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.1)  # 以0.1为单位,生成-5~5的数据
y = x ** 2

# 绘制图形
plt.plot(x, y, label="$y = x ^ 2$",
         linewidth=2,  # 线宽2像素
         color="red",  # 颜色
         alpha=0.5)  # 透明度

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-1, 30)

# 设置刻度
plt.title("square")  # 图标题
plt.legend(loc="upper right")  # 图例 upper right, center
# 绘制散点图
point_x = np.array([-4, -2, 0, 2, 4])
point_y = point_x ** 2

# 绘制特殊点
plt.scatter(point_x, point_y,
           marker='s',
           s=50,
           edgecolors='blue',
           facecolor='yellow',
           zorder=3)

# 设置备注
plt.annotate(
    r'$y=x^2$',             #备注中显示的文本内容
    xycoords='data',        #备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(4, 16),             #备注目标点的坐标 (4,16)
    textcoords='offset points',    #备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(20, 30),        #备注文本的坐标
    fontsize=14,            #备注文本的字体大小
    arrowprops=dict(
        arrowstyle="->",
        connectionstyle="angle3"
    )    #使用字典定义文本指向目标点的箭头样式
)

plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4scGfafh-1638272061352)(./img/添加备注.png)]

2. 图形对象(图形窗口)

语法:绘制两个窗口,一起显示。

# 手动构建 matplotlib 窗口
plt.figure(
    'sub-fig',                    #窗口标题栏文本 
    figsize=(4, 3),        #窗口大小 <元组>
    facecolor=''        #图表背景色
)
plt.show()

plt.figure方法不仅可以构建一个新窗口,如果已经构建过title='xxx’的窗口,又使用figure方法构建了title=‘xxx’ 的窗口的话,mp将不会创建新的窗口,而是把title='xxx’的窗口置为当前操作窗口。

设置当前窗口的参数

语法:测试窗口相关参数

# 设置图表标题 显示在图表上方
plt.title(title, fontsize=12)
# 设置水平轴的文本
plt.xlabel(x_label_str, fontsize=12)
# 设置垂直轴的文本
plt.ylabel(y_label_str, fontsize=12)
# 设置刻度参数   labelsize设置刻度字体大小
plt.tick_params(..., labelsize=8, ...)
# 设置图表网格线  linestyle设置网格线的样式
    #    -  or solid 粗线
    #   -- or dashed 虚线
    #   -. or dashdot 点虚线
    #   :  or dotted 点线
plt.grid(linestyle='')
# 设置紧凑布局,把图表相关参数都显示在窗口中
plt.tight_layout() 

示例:绘制两个图像窗口

# 绘制两个图像窗口
import matplotlib.pyplot as plt

plt.figure("FigureA", facecolor="lightgray")
plt.grid(linestyle="-.")  # 设置网格线

plt.figure("FigureB", facecolor="gray")
plt.xlabel("Date", fontsize=14)
plt.ylabel("Price", fontsize=14)
plt.grid(linestyle="--")  # 设置网格线
plt.tight_layout()  # 设置紧凑布局

plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0kZWgvm-1638272061353)(./img/两个窗口.png)]

1)子图

矩阵式布局

绘制矩阵式子图布局相关API:

plt.figure('Subplot Layout', facecolor='lightgray')
# 拆分矩阵
    # rows:    行数
    # cols:    列数
    # num:    编号
plt.subplot(rows, cols, num)
    #    1 2 3
    #    4 5 6
    #    7 8 9 
plt.subplot(3, 3, 5)        #操作3*3的矩阵中编号为5的子图
plt.subplot(335)            #简写

案例:绘制9宫格矩阵式子图,每个子图中写一个数字。

import matplotlib.pyplot as plt

plt.figure('Subplot Layout', facecolor='lightgray')

for i in range(9):
    plt.subplot(3, 3, i+1)
    plt.text(
        0.5, 0.5, i+1,
        ha='center',
        va='center',
        size=36,
        alpha=0.5
    )
    plt.xticks([])
    plt.yticks([])

plt.tight_layout()
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgwQgMte-1638272061353)(./img/9个子图.png)]

网格式布局(很少使用)**

网格式布局支持单元格的合并。

绘制网格式子图布局相关API:

import matplotlib.gridspec as mg
plt.figure('Grid Layout', facecolor='lightgray')
# 调用GridSpec方法拆分网格式布局
# rows:    行数
# cols:    列数
# gs = mg.GridSpec(rows, cols)    拆分成3行3列
gs = mg.GridSpec(3, 3)    
# 合并0行与0、1列为一个子图表
plt.subplot(gs[0, :2])
plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VatiLf78-1638272061353)(./img/grid_layout.png)]

案例:绘制一个自定义网格布局。

import matplotlib.pyplot as plt

import matplotlib.gridspec as mg

plt.figure('Grid Layout', facecolor='lightgray')
# 创建一个 3x3的矩阵
gs = mg.GridSpec(3, 3)
# 创建子图,占用 第一行、第1~2列
plt.subplot(gs[0, :2])
plt.xticks([])
plt.yticks([])
plt.text(0.5, 0.5, '1', fontsize=36, ha='center', va='center', alpha=0.5)

# 创建子图,占用 第1~2行、第3列
plt.subplot(gs[:2, 2])
plt.xticks([])
plt.yticks([])
plt.text(0.5, 0.5, '2', fontsize=36, ha='center', va='center', alpha=0.5)
...

plt.tight_layout()
plt.savefig('grid_layout.png')
plt.show()

自由式布局(很少使用)

自由式布局相关API:

plt.figure('Flow Layout', facecolor='lightgray')
# 设置图标的位置,给出左下角点坐标与宽高即可
# left_bottom_x: 坐下角点x坐标
# left_bottom_x: 坐下角点y坐标
# width:         宽度
# height:        高度
# plt.axes([left_bottom_x, left_bottom_y, width, height])
plt.axes([0.03, 0.03, 0.94, 0.94])

plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
plt.show()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QEAT59d-1638272061354)(./img/axes_layout.png)]

示例代码:

import matplotlib.pyplot as plt

plt.figure('Axes Layout', facecolor='lightgray')

# 大的坐标图
plt.axes([0.05, 0.05, 0.9, 0.9])
plt.xticks(())
plt.yticks(())
plt.text(0.5, 0.5, '1', fontsize=48, ha='center', va='center', alpha=0.5)

# 小的坐标图(自由式布局,定位子图)
plt.axes([0.55, 0.1, 0.35, 0.35])
plt.xticks(())
plt.yticks(())
plt.text(0.5, 0.5, '2', fontsize=48, ha='center', va='center', alpha=0.5)

plt.tight_layout()

plt.savefig('axes_layout.png')
plt.show()

day04

2)刻度定位器

刻度定位器相关API:

# 获取当前坐标轴
ax = plt.gca()
# 设置水平坐标轴的主刻度(显示字的刻度)定位器
ax.xaxis.set_major_locator(plt.NullLocator())
# 设置水平坐标轴的次刻度(不显示字的刻度)定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

案例:绘制一个数轴,每隔1一个主刻度,每隔0.1一个次刻度。

import matplotlib.pyplot as plt

plt.figure('Locators', facecolor='lightgray')
# 获取当前坐标轴
ax = plt.gca()

# 隐藏除底轴以外的所有坐标轴
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

# 将底坐标轴调整到子图中心位置
ax.spines['bottom'].set_position(('data', 0))
# 设置水平坐标轴的主刻度定位器
ax.xaxis.set_major_locator(plt.MultipleLocator(1))
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X69bfvcz-1638272061354)(./img/主刻度次刻度.png)]

常用刻度器如下:

# 空定位器:不绘制刻度
plt.NullLocator()

# 最大值定位器:
#   最多绘制nbins+1个刻度
plt.MaxNLocator(nbins=3)

# 定点定位器:根据locs参数中的位置绘制刻度
plt.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])

# 自动定位器:由系统自动选择刻度的绘制位置
plt.AutoLocator()

# 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔
plt.IndexLocator(offset=0.5, base=1.5)

# 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
plt.MultipleLocator()

# 线性定位器:等分numticks-1份,绘制numticks个刻度
plt.LinearLocator(numticks=21)

# 对数定位器:以base为底,绘制刻度
plt.LogLocator(base=2)

案例:

使用for循环测试刻度器样式:

import matplotlib.pyplot as plt
import numpy as np

locators = ['plt.NullLocator()', # 空刻度定位器,不绘制刻度
            'plt.MultipleLocator(1)', # 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制
            'plt.MaxNLocator(nbins=4)',# 最多绘制指定个数+1个主刻度
            'plt.AutoLocator()'] # 自动定位器:由系统自动选择刻度的绘制位置

for i, locator in enumerate(locators):
    plt.subplot(len(locators), 1, i + 1)
    plt.xlim(0, 10)
    plt.ylim(-1, 1)
    plt.yticks([])
    # 获取当前坐标轴
    ax = plt.gca()
    # 隐藏除底轴以外的所有坐标轴
    ax.spines['left'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    # 将底坐标轴调整到子图中心位置
    ax.spines['bottom'].set_position(('data', 0))
    # 设置水平坐标轴的主刻度定位器
    ax.xaxis.set_major_locator(eval(locator))
    # 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
    ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
    plt.plot(np.arange(11), np.zeros(11), c='none')
    # 标记所用刻度定位器类名
    plt.text(5, 0.3, locator, ha='center', size=12)

plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2V96Dx5k-1638272061354)(./img/多个刻度定位器.png)]

3)刻度网格线

绘制刻度网格线的相关API:

ax = plt.gca()
#绘制刻度网格线
ax.grid(
    which='',        # 'major'/'minor'/'both'/主刻度/次刻度 
    axis='',         # 'x'/'y'/'both' <-> 绘制x/y/两轴
    linewidth=1,     # 线宽
    linestyle='',    # 线型
    color='',        # 颜色
    alpha=0.5        # 透明度
)

案例:绘制曲线 [1, 10, 100, 1000, 100, 10, 1],然后设置刻度网格线,测试刻度网格线的参数。

import numpy as np
import matplotlib.pyplot as plt

y = np.array([1, 10, 100, 1000, 100, 10, 1]) # 数据

plt.figure('Normal & Log', facecolor='lightgray')
plt.subplot(211) #2行1列中的第1个子图
plt.title('Normal', fontsize=20)
plt.ylabel('y', fontsize=14)

ax = plt.gca() # 获取当前图形的坐标轴对象
# 设置x,y方向主刻度、次刻度
ax.xaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

ax.yaxis.set_major_locator(plt.MultipleLocator(250))
ax.yaxis.set_minor_locator(plt.MultipleLocator(50))


ax.grid(which='major', axis='both', linewidth=0.75,
        linestyle='-', color='orange') #主刻度网格线,axis还可以取x,y
ax.grid(which='minor', axis='both', linewidth=0.25,
        linestyle='-', color='orange') #次刻度网格线

plt.plot(y, 'o-', c='blue', label='plot')
plt.legend()
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHwWkFGC-1638272061354)(./img/刻度网格线.png)]

5)填充

以某种颜色自动填充两条曲线的闭合区域。

plt.fill_between(
    x,                # x轴的水平坐标
    sin_x,            # 下边界曲线上点的垂直坐标
    cos_x,            # 上边界曲线上点的垂直坐标
    sin_x 

示例:

绘制两条曲线: sin_x = sin(x) cos_x = cos(x / 2) / 2 [0-8π]

import matplotlib.pyplot as plt
import numpy as np

n = 1000
x = np.linspace(0, 8 * np.pi, n)  # 返回指定间隔上的等距数字

sin_y = np.sin(x)  # 计算sin函数值
cos_y = np.cos(x / 2) / 2  # 计算cos函数值

plt.figure('Fill', facecolor='lightgray')
plt.title('Fill', fontsize=20)
plt.xlabel('x', fontsize=14)  # x轴标签
plt.ylabel('y', fontsize=14)  # y轴
plt.tick_params(labelsize=10)  # 刻度
plt.grid(linestyle=':')

plt.plot(x, sin_y, c='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cos_y, c='orangered', label=r'$y=frac{1}{2}cos(frac{x}{2})$')

# 填充cos_y < sin_y的部分
plt.fill_between(x, cos_y, sin_y, cos_y < sin_y, color='dodgerblue', alpha=0.5)

# 填充cos_y > sin_y的部分
plt.fill_between(x, cos_y, sin_y, cos_y > sin_y, color='orangered', alpha=0.5)

plt.legend()
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzwgw9yy-1638272061355)(./img/区域填充示例.png)]

6)散点图

可以通过每个点的坐标、颜色、大小和形状表示不同的特征值。

身高体重性别年龄段种族
18080中年亚洲
16050青少美洲

绘制散点图的相关API:

plt.scatter(
    x,                   # x轴坐标数组
    y,                   # y轴坐标数组
    marker='',           # 点型
    s=10,                # 大小
    color='',            # 颜色
    edgecolor='',        # 边缘颜色
    facecolor='',        # 填充色
    zorder=''            # 图层序号
)

numpy.random提供了normal函数用于产生符合 正态分布 的随机数

n = 100
# 172:    期望值
# 10:    标准差
# n:    数字生成数量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)

案例:绘制平面散点图。

# 散点图示例
import matplotlib.pyplot as plt
import numpy as np

n = 40
# 期望值:期望值是该变量输出值的平均数
# 标准差:是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标
x = np.random.normal(172, 20 ,n ) # 期望值, 标准差, 生成数量
y = np.random.normal(60, 10, n) # 期望值, 标准差, 生成数量

x2 = np.random.normal(180, 20 ,n ) # 期望值, 标准差, 生成数量
y2 = np.random.normal(70, 10, n) # 期望值, 标准差, 生成数量

plt.figure("scatter", facecolor="lightgray")
plt.title("Scatter Demo")
plt.scatter(x, y, c="red", marker="D")
plt.scatter(x2, y2, c="blue", marker="v")

plt.xlim(100, 240)
plt.ylim(0, 100)
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gxUc5p9-1638272061355)(./img/散点图示例.png)]

cmap颜色映射表参照附件:cmap颜色映射表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBg05LT1-1638272061355)(./img/matplotlib_cmap.png)]

7)条形图(柱状图)

绘制柱状图的相关API:

plt.bar(
    x,            # 水平坐标数组
    height,       # 柱状图高度数组
    width=0.8,    # 柱子的宽度, 默认 0.8
    bottom=None,  # 柱子的起点位置
    color=None,   # 填充颜色
    label='',     # 图例文字
    alpha=0.2     # 透明度
)

案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

import matplotlib.pyplot as plt
import numpy as np

apples = np.array([30, 25, 22, 36, 21, 29, 
                   20, 24, 33, 19, 27, 15])
oranges = np.array([24, 33, 19, 27, 35, 20,
                   15, 27, 20, 32, 20, 22])

plt.figure('Bar', facecolor='lightgray')
plt.title('Bar', fontsize=20)
plt.xlabel('Month', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(axis='y', linestyle=':')
plt.ylim((0, 40))

x = np.arange(len(apples))  # 产生均匀数组,长度等同于apples

plt.bar(x - 0.2,  # 横轴数据
       apples,  # 纵轴数据
       0.4,  # 柱体宽度
       color='dodgerblue',
       label='Apple')
plt.bar(x + 0.2,  # 横轴数据
       oranges,  # 纵轴数据
       0.4,  # 柱体宽度
       color='orangered', label='Orange', alpha=0.75)

plt.xticks(x, ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])

plt.legend()
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ObgIc91R-1638272061355)(./img/matplotlib_bar.png)]

8)饼图

绘制饼状图的基本API:

plt.pie(
    values,          # 值列表        
    explode=None,    # 扇形之间的间距列表
    labels=None,     # 标签列表
    colors=None,     # 颜色列表
    autopct=None,    # 标签所占比例格式,如:'%d%%'
    shadow=True,     # 是否显示阴影
    startangle=90    # 逆时针绘制饼状图时的起始角度
    radius=1         # 半径
)
    ,
    None,
    colors=None,

案例:绘制饼状图显示6门编程语言的流行程度:

import matplotlib.pyplot as plt

plt.figure('pie', facecolor='lightgray')
plt.title('Pie', fontsize=20)
# 整理数据
values = [16.48,12.53,12.21,6.91,4.20, 47.6]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01, 0.01]
labels = ['C', 'Python', 'Java', 'C++', 'C#', 'Other']
colors = ['dodgerblue', 'orangered', 'limegreen', 'violet', 'gold', 'blue']
# 等轴比例
plt.axis('equal')
plt.pie(
    values,  # 值列表
    spaces,  # 扇形之间的间距列表
    labels,  # 标签列表
    colors,  # 颜色列表
    '%d%%',  # 标签所占比例格式
    shadow=True,  # 是否显示阴影
    startangle=90,  # 逆时针绘制饼状图时的起始角度
    radius=1  # 半径
)
plt.legend()
plt.show()

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySqD7aFb-1638272061355)(./img/饼图示例.png)]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/618876.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号