# Matplotlib数据可视化高级

### 目录

🌟 学习本文之前，需要先自修：NumPy从入门到进阶pandas从入门到进阶 本文中很多的操作在NumPy从入门到进阶pandas从入门到进阶 二文中有详细的介绍，包含一些软件以及扩展库，图片的安装和下载流程，本文会直接进行使用。

1.多图布局

## 1.1 子视图

🚩创建子视图可以一个视图一个视图的创建，也可以多个视图一起创建：

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)

ax = plt.subplot(2, 1, 1)
ax.plot(x, np.sin(x))

ax = plt.subplot(2, 1, 2)
ax.plot(x, np.cos(x))



fig, axes = plt.subplots(2, 2)

axes[0, 0].plot(x, np.sin(x), color = 'red')
axes[0, 1].plot(x, np.sin(x), color = 'green')
axes[1, 0].plot(x, np.cos(x), color = 'purple')
axes[1, 1].plot(x, np.cos(x))


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.figure(figsize = (9, 6))
ax = plt.subplot(221)
ax.plot(x, y, color = 'red')
ax.set_facecolor('green')

ax = plt.subplot(2, 2, 2)
line, = ax.plot(x, -y)
line.set_marker('*')
line.set_markerfacecolor('red')
line.set_markeredgecolor('green')
line.set_markersize(10)

ax = plt.subplot(2, 1, 2)
plt.sca(ax)
x = np.linspace(-np.pi, np.pi, 200)
plt.plot(x, np.sin(x * x), color = 'red')



import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.figure(figsize = (9, 6))
ax = plt.subplot(221)
ax.plot(x, y, color = 'red')
ax.set_facecolor('green')

ax = plt.subplot(2, 2, 2)
ax.plot(x, -y)


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.figure(figsize = (9, 6))
ax = plt.subplot(221)
ax.plot(x, y, color = 'red')
ax.set_facecolor('green')

ax = plt.subplot(2, 2, 2)
line = ax.plot(x, -y)
line[0]


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.figure(figsize = (9, 6))
ax = plt.subplot(221)
ax.plot(x, y, color = 'red')
ax.set_facecolor('green')

ax = plt.subplot(2, 2, 2)
line, = ax.plot(x, -y)
line


ax = plt.subplot(221)


ax = plt.subplot(2, 2, 2)


ax = plt.subplot(2, 1, 2)


## 1.2 嵌套

🚩所谓嵌套，其实就是在图形中继续画图：

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 25)
y = np.sin(x)
fig = plt.figure(figsize = (9, 6))

plt.plot(x,y)

ax = plt.axes([0.2, 0.55, 0.3, 0.3])
ax.plot(x, y, color = 'g')

ax = fig.add_axes([0.55, 0.2, 0.3, 0.3])
ax.plot(x, y, color = 'r')


## 1.3 多图布局分格显示

### 1.3.1 均匀布局

🚩每张图片都是均匀展示的

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)

fig, ((ax11,ax12,ax13), (ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3, 3)

fig.set_figwidth(9)
fig.set_figheight(6)
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tanh(x))
ax21.plot(x,np.tan(x))
ax22.plot(x,np.cosh(x))
ax23.plot(x,np.sinh(x))
ax31.plot(x,np.sin(x) + np.cos(x))
ax32.plot(x,np.sin(x * x) + np.cos(x * x))
ax33.plot(x,np.sin(x) * np.cos(x))

plt.tight_layout()
plt.show()


### 1.3.2 不均匀分布

🚩上图中代码运行所展示的就是均匀分布的结果，可以看出每张图片所占的空间大小都是均等的，如下面图片的展示结果，就是不均匀分布：

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 200)
fig = plt.figure(figsize = (12, 9))

ax1 = plt.subplot(3, 1, 1)
ax1.plot(x, np.sin(10 * x))

ax1.set_title('ax1_title')
ax2 = plt.subplot(3, 3, (4, 5))
ax2.set_facecolor('green')
ax2.plot(x, np.cos(x),color = 'red')
ax3 = plt.subplot(3, 3, (6, 9))
ax3.plot(x,np.sin(x) + np.cos(x))
ax4 = plt.subplot(3, 3, 7)
ax4.plot([1, 3], [2, 4])
ax5 = plt.subplot(3, 3, 8)
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
plt.figure(figsize = (12, 9))

ax1 = plt.subplot2grid(shape = (3, 3),
loc =  (0, 0),
colspan = 3)
ax1.plot(x, np.sin(10 * x))

ax1.set_title('ax1_title')

ax2 = plt.subplot2grid((3, 3), (1, 0), colspan = 2)
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x),color = 'red')

ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan = 2)
ax3.plot(x,np.sin(x) + np.cos(x))

ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.plot([1, 3], [2, 4])

ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)


import numpy as np
import matplotlib.pyplot as plt

import matplotlib.gridspec as gridspec
x = np.linspace(0, 2 * np.pi, 200)
fig = plt.figure(figsize = (12, 9))

gs = gridspec.GridSpec(3, 3)

ax1.plot(x,np.sin(10 * x))

ax1.set_title('ax1_title')
ax2 = plt.subplot(gs[1, :2])
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x), color = 'red')

ax3 = plt.subplot(gs[1:, 2])
ax3.plot(x,np.sin(x) + np.cos(x))

ax4 = plt.subplot(gs[-1, 0])
ax4.plot([1, 3], [2, 4])

ax5 = plt.subplot(gs[-1, -2])
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()


## 1.4 双轴显示

🚩有时候，有两个轴是不够用的，我们经常会见到如下的图形，下述图形的样式就是双轴显示：

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')

y2 = np.exp(x)
plt.plot(x, y2, color = 'red')


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')

ax = plt.gca()

ax2 = ax.twinx()

y2 = np.exp(x)
plt.plot(x, y2, color = 'red')


import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)

plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')

ax = plt.gca()

ax2 = ax.twinx()

y2 = np.exp(x)
plt.plot(x, y2, color = 'red')

_ = plt.yticks(np.arange(0, 26, 5), color = 'red')


2.文本、注释、箭头

🚩常用函数如下：

Pyplot函数API方法描述text()mpl.axes.Axes.text()在Axes对象的任意位置添加文字xlabel()mpl.axes.Axes.set_xlabel()为X轴添加标签ylabel()mpl.axes.Axes.set_ylabel()为Y轴添加标签title()mpl.axes.Axes.set_title()为Axes对象添加标题legend()mpl.axes.Axes.legend()为Axes对象添加图例annnotate()mpl.axes.Axes.annotate()为Axes对象添加注释（箭头可选）figtext()mpl.figure.Figure.text()在Figure对象的任意位置添加文字suptitle()mpl.figure.Figure.suptitle()为Figure对象添加中心化的标题

## 2.1 文本

import numpy as np
import matplotlib.pyplot as plt

font = {'fontsize': 20,
'family': 'KaiTi',
'color':  'red',
'weight': 'bold'}

x = np.linspace(0.0, 5.0, 100)
y = np.cos(2 * np.pi * x) * np.exp(-x)

plt.figure(figsize = (9, 6))
plt.plot(x, y, 'k')

plt.title('exponential decay', fontdict = font, pad = 20)

plt.suptitle('指数衰减', y = 1.05, fontdict = font, fontsize = 30)

plt.text(x = 2, y = 0.65,
s = r'$\cos(2 \pi t) \exp(-t)$',
fontsize = 25)

plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.show()


## 2.2 箭头

import matplotlib.pyplot as plt
import numpy

loc = np.random.randint(0, 10,size = (10, 2))
plt.figure(figsize=(10, 10))

plt.plot(loc[:, 0], loc[:, 1], 'g*', ms = 20)
plt.grid(True)

way = np.arange(10)
np.random.shuffle(way)

for i in range(0, len(way) - 1):
start = loc[way[i]]
end = loc[way[i + 1]]

plt.arrow(start[0], start[1],
end[0] - start[0],
end[1] - start[1],
head_width = 0.2, lw = 2,

plt.text(start[0], start[1], s = i, fontsize = 18, color = 'red')

if i == len(way) - 2:
plt.text(end[0], end[1], s = i + 1, fontsize = 18, color = 'red')


## 2.3 注释

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
x = np.arange(0.0, 5.0, 0.01)
y = np.cos(2 * np.pi * x)
line, = ax.plot(x, y, lw = 2)

ax.annotate('local max',
xy = (2, 1),
xytext = (3, 1.5),

arrowprops = dict(facecolor = 'black',
shrink = 0.05))
ax.annotate('local min',
xy = (2.5, -1),
xytext = (4, -1.8),
arrowprops = dict(facecolor = 'black',
width = 2,
shrink = 0.1))
ax.annotate('median',
xy = (2.25, 0),
xytext = (0.5, -1.8),
arrowprops = dict(arrowstyle = '-|>'),

fontsize = 20)

ax.set_ylim(-2, 2)


## 2.4 注释箭头连接形状

import matplotlib.pyplot as plt

def annotate_con_style(ax, connectionstyle):
x1, y1 = 3,2
x2, y2 = 8,6
ax.plot([x1, x2], [y1, y2], ".")
ax.annotate(text = '',
xy = (x1, y1),
xytext = (x2, y2),
arrowprops = dict(arrowstyle = '->', color = 'red',
shrinkA = 5,shrinkB = 5,
connectionstyle = connectionstyle))

ax.text(.05, 0.95, connectionstyle.replace(",", "\n"),
transform = ax.transAxes,
ha = "left", va = "top")

fig, axs = plt.subplots(3, 5, figsize = (9, 6))
annotate_con_style(axs[0, 0], "angle3,angleA=90,angleB=0")
annotate_con_style(axs[1, 0], "angle3,angleA=0,angleB=90")
annotate_con_style(axs[2, 0], "angle3,angleA = 0,angleB=150")
annotate_con_style(axs[0, 4], "bar,fraction=0.3")
annotate_con_style(axs[1, 4], "bar,fraction=-0.3")
annotate_con_style(axs[2, 4], "bar,angle=180,fraction=-0.2")

for ax in axs.flat:

ax.set(xlim = (0, 10), ylim = (0, 10), xticks = [], yticks = [], aspect = 1)


3.训练场

## 3.1 绘制如下子图

• 设置中文字体并设置字体大小
• 分别计算每个城市年份、季度、月份、小时的PM2.5数据
• 会用到分组求平均值操作
• 进行数据重塑
• 根据需要调整行索引或者列索引
• 创建子视图2行2列
• 向子视图分别绘制年份、季度、月份、小时的各城市PM2.5走势数据
• 根据需要设置坐标轴标签（比如月份、小时）

%%time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['font.size'] = 18



fig, axes = plt.subplots(2, 2, figsize = (16, 12))

df2 = df.groupby(by = ['城市', '年份'])[['PM2.5']].mean().round(2)

df2 = df2.unstack(level = 0)
df2.columns = df2.columns.droplevel(0)
df2 = df2[['北京', '上海', '广州', '沈阳', '成都']]
df2.plot(ax = axes[0, 0])


df3 = df.groupby(by = ['城市', '季节'])[['PM2.5']].mean().round(2)

df3 = df3.unstack(level = 0)

df3 = df3.loc[list('春夏秋冬')]

df3.columns = df3.columns.droplevel(0)

df3 = df3[['北京', '上海', '广州', '沈阳', '成都']]

df3.plot(ax = axes[0, 1])


df4 = df.groupby(by = ['城市', '月份'])[['PM2.5']].mean().round(2)

df4 = df4.unstack(level = 0)
df4.columns = df4.columns.droplevel(0)
df4 = df4[['北京', '上海', '广州', '沈阳', '成都']]
ax = df4.plot(ax = axes[1, 0])

months = ['一月', '二月', '三月', '四月', '五月', '六月',
'七月', '八月', '九月', '十月', '十一月', '十二月']
ax.set_xticks(np.arange(1, 13))
_ = ax.set_xticklabels(months, rotation = 60)


df5 = df.groupby(by = ['城市', '小时'])[['PM2.5']].mean().round(2)

df5 = df5.unstack(level = 0)
df5.columns = df5.columns.droplevel(0)
df5 = df5[['北京', '上海', '广州', '沈阳', '成都']]
ax = df5.plot(ax = axes[1, 1])
_ = ax.set_xticks(np.arange(0, 24))


plt.savefig('./homework7.png')


Original: https://blog.csdn.net/qq_52156445/article/details/122650761
Author: 辰chen
Title: Matplotlib数据可视化高级

(0)

### 大家都在看

1.项目源码/业务逻辑 百度网盘链接：链接：https://pan.baidu.com/s/13VNfrSJE6vcL3HP1J5T8ew 提取码：00s0，项目业务逻辑自行阅读 …

Python 2023年10月11日
0110
• #### Python之Numpy矩阵操作

Numpy是Python的一个重要科学计算库。 矩阵操作是深度学习、数值计算的重要部分。 只介绍矩阵操作的代码实现，不介绍数学原理。 下面是一些常用的使用Numpy库矩阵操作。 i…

Python 2023年8月26日
0153
• #### 【*CTF/starctf oh-my-lotto-revenge复盘】

1NDEX 0x00 前言 oh-my-lotto && revenge * – 官方预期解(两道通杀) + brain.md 第一题wgetrc非预期…

Python 2023年8月11日
0131
• #### 速度优化——python的pandas批量读取CSV、Excel等文件

有一堆命名、格式、内容样式都一样的文件，逐个读取过于麻烦，那么可以选择批量读取 （本质上是多线程的思想） import pandas as pdimport numpy as np…

Python 2023年8月8日
0199
• #### 关于序列化器的使用和处理

关于普通序列化器和模型序列化器 1:普通序列化器 众所周知 Response不能直接返回orm对象的，所以需要我们进行 序列化操作，可以通过手动将其转为字典或 JSON，也可以使用…

Python 2023年8月4日
0134
• #### Scrapy中的yield使用

yield和协程总是相伴出现。scrapy使用yield进行数据解析和爬取request。 yield的理解 yield的解释都比较复杂，一段典型的yield的使用如下： def …

Python 2023年10月1日
097
• #### Scrapy爬取北京公交并保存MYSQL数据库实例

前言就不过多赘述了，大家只要把scrapy的基本了解之后就可以完成这个项目。 进入项目文件夹创建爬虫scrapy genspider (爬虫名) (域名) 查看beibus项目，如…

Python 2023年10月1日
0121
• #### AJAX后端数据

提取将URL作为其第一个参数。根据Django项目的URLconf和视图的配置方式，URL可能包含关键字参数或查询字符串，我们希望在视图中使用该参数来选择请求的数据。 设置AJAX…

Python 2023年8月4日
0114
• #### [Pygame]对话框制作教程.part1

在大部分游戏中都会有对话框的存在，能推动剧情发展，能让玩家玩懂游戏。 那么在Pygame中，应该怎么制作这种对话框呢? Pygame中基础的文字渲染和绘制: #创建文字库 my_f…

Python 2023年9月18日
0102
• #### python可视化的图表汉字显示成框框_数据可视化——Matplotlib输出中文显示问题…

写在前面 在学习可视化过程中，Matplotlib是其余Python可视化工具包的基础，是它们的老祖宗。 Matplotlib是一个用于绘制高质量图形的Python第三方包，一般将…

Python 2023年9月7日
0117
• #### python对excel数据分析常用功能（一文学会如何用Python实现excel基础功能）

（一文学会如何用Python实现excel基础功能） 本文主要应用pandas包完成，先加载pandas包 import pandas as pd data = pd.read_e…

Python 2023年8月6日
0103
• #### pytorch自定义Dataset，torch加载自己的numpy数据集，torch-cnn训练numpy进行回归

目录在这里 前言 简单介绍 Show you the Code 路径哦 整份代码 备注 参考 前言 纯粹想学习一下torch的数据集类，可能后面会用到吧。 简单介绍 我们在训练过程…

Python 2023年8月24日
0157
• #### 浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解

前言 在进行tensor图片数据进行视觉时,一般会进行预处理操作,这个时候就需要用到ToTensor()和Normalize()这两个函数. &#x63D0;&#x…

Python 2023年8月29日
0137
• #### 解决热力图（heatmap）坐标处边界无法完整显示的问题

本篇文章记录如何快速安装matplotlib库，解决sns.heatmap()方法绘制的热力图最上面一行和最小面一行只显示一半，数字不居中的问题。 小白入门系列。单纯记录我的学习与…

Python 2023年9月4日
0161
• #### OpenAI Gym｜cart-pole-v1任务的环境源码

本文代码来源于Gym官方文档 cart-pole-v1任务的实现见pytorch实现CartPole-v1任务的DQN代码_bujbujbiu的博客-CSDN博客 描述 一根杆子由…

Python 2023年9月21日
0109
• #### Python机器学习13——主成分分析

本系列所有的代码和数据都可以从陈强老师的个人主页上下载：Python数据程序 参考书目：陈强.机器学习及Python应用. 北京：高等教育出版社, 2021. 本系列基本不讲数学原…

Python 2023年8月1日
0115