# Python matplotlib数据可视化 subplot绘制多个子图

### 1. 对子绘图区域的划定和选择

GridSpec是matplotlib中一个特殊的用来进行子绘图区域设计和选定的一个类

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(2, 2)   # 设计一个网格 2行2列
# 选定子绘图区域
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[0, 1])
ax3 = plt.subplot(gs[1, 0])
ax4 = plt.subplot(gs[1, 1])

### 2. 绘制多个子图

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.gridspec as gridspec
import collections
import numpy as np

# 读取数据

# 子图1数据
skill_count = df['Skill_Moves'].value_counts()
skill = [f'等级{m}' for m in skill_count.index]    # 列表推导式构造不同技术等级
counts = skill_count.values.tolist()               # 技术等级对应人数统计的列表

# 子图2数据
age_group = ["17-26", "27-36", "37-47"]
count_1 = df[(df['Age'] >= 17) & (df['Age'] <= 26)]
count_2 = df[(df['Age'] >= 27) & (df['Age'] <= 36)]
count_3 = df[(df['Age'] >= 37) & (df['Age'] <= 47)]
age_counts = [len(count_1), len(count_2), len(count_3)]

# 子图3数据
# &符号 并且    |符号 或   不同条件之间 ()括起来
data1 = df[(17 <= df['Age']) & (df['Age'] <= 26)]
age1 = list(data1['Skill_Moves'])
data2 = df[(27 <= df['Age']) & (df['Age'] <= 36)]
age2 = list(data2['Skill_Moves'])
data3 = df[(37 <= df['Age']) & (df['Age'] <= 47)]
age3 = list(data3['Skill_Moves'])

# 分别统计三个年龄段 不同等级人数
count_1 = collections.Counter(age1).most_common()
count_2 = collections.Counter(age2).most_common()
count_3 = collections.Counter(age3).most_common()
count_3.append((5, 0))    # 37-47年龄段等级5人数为零  手动填上
age_counts3 = count_1 + count_2 + count_3

datas = [[] for i in range(5)]
for i in age_counts3:
datas[i[0]-1].append(i[1])

# 子图4数据
skill_moves = list(df['Skill_Moves'])
skill_count = collections.Counter(skill_moves).most_common()
skill = ['等级{}'.format(m[0]) for m in skill_count]
counts = [n[1] for n in skill_count]

# 绘制多个子图
mpl.rcParams['font.family'] = 'SimHei'
gs = gridspec.GridSpec(2, 2)
plt.figure(figsize=(12, 20), dpi=100)

ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[0, 1])
ax3 = plt.subplot(gs[1, 0])
ax4 = plt.subplot(gs[1, 1])

ax1.barh(skill[::-1], counts[::-1], height=0.5, color='#FF00FF')
ax1.set_xlabel('人数')
ax1.set_title('不同技术等级人数统计')

ax2.bar(age_group, age_counts, width=0.35, color='red')
ax2.set_title('不同年龄段人数统计')
ax2.set_xlabel('年龄段')
ax2.set_ylabel('人数')

ax3.set_title('不同年龄段等级人数统计')
ax3.set_xlabel('年龄段')
ax3.set_ylabel('人数')

x_ = [1, 0, 0, 0, 0]	   # 用于显示空心
color = ["red", "blue", "yellow", "green", "purple"]
# 正圆
ax4.set_aspect(aspect='equal')
ax4.pie(x=counts, colors=color, pctdistance=0.9,
startangle=45, autopct='%.1f%%',
)

ax4.set_title('不同技术等级的运动员人数占比图')
# 调整图例位置
plt.legend(skill, bbox_to_anchor=(0.9, 0.92))
plt.show()

0 条评论

• ### Python matplotlib数据可视化 绘制柱形图、堆叠图、折线图、饼图和环图

Python中可以通过matplotlib模块的pyplot子库来完成绘图。Matplotlib可用于创建高质量的图表和图形，也可以用于绘制和可视化结果。mat...

• ### 数字信号处理——绪论总结

随着信息学科的快速发展，以及大规模集成电路、超大规模集成电路和软件开发引起的计算机学科的飞速发展，自1965年快速傅里叶变换算法提出后，数字信号处理( digi...

• ### Python Matplotlib数据可视化 绘制箱形图、散点图和直方图

Python中可以通过matplotlib模块的pyplot子库来完成绘图。Matplotlib可用于创建高质量的图表和图形，也可以用于绘制和可视化结果。mat...

• ### 基于xgboost的波士顿房价预测kaggle实战

2018年8月24日笔记 这是作者在波士顿房价预测项目的第3篇文章，在查看此篇文章之前，请确保已经阅读前2篇文章。 第2篇文章链接：https://www....

• ### 13个Pandas实用技巧，有点香 ！

先按Mt列进行分组，然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列，再用iloc位置索引将行取出。有重复值的情况

• ### 6个提升效率的pandas小技巧

文章来源：towardsdatascience 作者：B.Chen 翻译\编辑：Python大数据分析

• ### 13个Pandas奇技淫巧

先按Mt列进行分组，然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列，再用iloc位置索引将行取出。有重复值的情况

• ### 13个Pandas实用技巧，有点香 ！

归纳整理了一些工作中常用到的pandas使用技巧，方便更高效地实现数据分析。文章很短，不用收藏就能Get~

• ### 25个视频神同步，还能给视频声音移花接木，谷歌开源最新自监督算法

对于AI来说，识别视频里发生了什么已经不是难事，训练它的方法就是用带有标签的视频数据集进行监督学习。

• ### 对比MySQL学习Pandas的groupby分组聚合

不管是mysql，还是pandas，都是处理像excel那样的二维表格数据的。对于一个二维表，每一行都可以看作是一条记录，每一列都可以看作是字段。