第五章. 可视化数据分析图
5.3 常用图表的绘制5—多个子图表
·Matplotlib可以实现在一张图上绘制多个子图表,Matplotlib提供了三种方法:一是使用subplot函数,二是使用subplots,三是使用add_subplot函数
·subplot方法和add_subplot,定制效果比较好,可以实现子图在图中的各种布局
·subplots方法不那么灵活,但可以用较少的代码实现绘制多个子图表
1.matplotlib.pyplot.subplot 函数
subplot函数直接指定划分方式和位置,它可以将一个绘图区域划分成n个子图,每个subplot函数只能绘制一个子图。
1).语法:
matplotlib.pyplot.subplot(*args,**kwargs)
参数说明:
*args:当传入的参数个数未知时使用*args
**kwargs:关键字参数,其他可选参数
2).关键说明:
·每绘制一个子图表都要调用一次subplot函数
·绘制区域的位置编号:plt.subplot(2, 2, 1),前两个参数指定的是一个画布被分割成的行数和列数,后一个参数指定的是当前绘制区域的位置编号,编号的规则是行优先
·如果行列的值都小于10,可简写成plt.subplot(221)
3).示例:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet2')
print(df)
# 设置画布
fig = plt.figure(figsize=(6, 4), facecolor='white')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# X,Y轴刻度线的显示方向
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
# 绘制多子图中的折线图
plt.subplot(2, 2, 1)
plt.plot(df['姓名'], df['语文'], color='c', linestyle='-', marker='o', mfc='w')
# 设置网格线
plt.grid(color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('语文')
# 设置坐标轴刻度
plt.yticks(range(0, 150, 15))
# 设置标题和图例
plt.title('学生成绩统计图')
# 显示图例
plt.legend(['语文'], loc='upper right')
# 绘制多子图中的饼形图
plt.subplot(2, 2, 2)
x_lable = df['姓名']
explode = [0, 0, 0, 0, 0, 0.1]
plt.pie(df['语文'] / 150, labels=x_lable, explode=explode, labeldistance=1.1, autopct='%.2f%%', startangle=90,
shadow=True,
radius=0.8, center=(0, 0), textprops={'fontsize': 9, 'color': 'k'}, pctdistance=0.6)
# 设置标题和图例
plt.title('学生成绩统计图')
# 绘制多子图中的柱形图
plt.subplot(2, 1, 2)
plt.bar(df['姓名'], df['语文'], width=0.5, color='orange')
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('语文')
# 设置坐标轴刻度
plt.yticks(range(0, 150, 15))
# 设置标题和图例
plt.title('学生成绩统计图')
# 显示图例
plt.legend(['语文'], loc='upper right')
# 调整图表与画布边缘间距
plt.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
# 坐标轴的刻度线向内显示还是向外显示
plt.tick_params(left=True, bottom=True, right=False, top=False)
# 显示图像
plt.show()
结果展示:
2.matplotlib.pyplot.subplots 函数
1).语法:
matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True,width_ratios=None, height_ratios=None,subplot_kw=None, gridspec_kw=None, **fig_kw)
参数说明:
nrows,ncols:将画布分成几行几列
sharex,sharey:表示坐标轴的属性是否相同
subplot_kw:把字典的关键字传递给add_subplot来创建每个子图
gridspec_kw:把字典的关键字传递给GridSpec构造函数创建网格区域
fig_kw:把所有详细的关键字参数传给figure
2).示例:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet2')
print(df)
# 设置画布
fig, axes = plt.subplots(2, 2)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# X,Y轴刻度线的显示方向
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
# 绘制多子图中的折线图
axes[0, 0].plot(df['姓名'], df['语文'], color='c', linestyle='-', marker='o', mfc='w')
# 设置网格线
axes[0, 0].grid(color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
axes[0, 0].set_xlabel('姓名')
axes[0, 0].set_ylabel('语文')
# 设置坐标轴刻度
axes[0, 0].set_yticks(range(0, 150, 15))
# 设置标题和图例
axes[0, 0].set_title('学生成绩统计图')
axes[0, 0].legend(['语文'], loc='upper right') # 添加图例
# 绘制多子图中的散点图
axes[0, 1].scatter(df['姓名'], df['语文'], color='r')
# 设置网格线
axes[0, 1].grid(color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
axes[0, 1].set_xlabel('姓名')
axes[0, 1].set_ylabel('语文')
# 设置坐标轴刻度
axes[0, 1].set_yticks(range(0, 150, 15))
# 设置标题和图例
axes[0, 1].set_title('学生成绩统计图')
axes[0, 1].legend(['语文'], loc='upper right') # 添加图例
# 绘制多子图中的饼形图
x_lable = df['姓名']
explode = [0, 0, 0, 0, 0, 0.1]
axes[1, 0].pie(df['语文'] / 150, labels=x_lable, explode=explode, labeldistance=1.1, autopct='%.2f%%', startangle=90,
shadow=True,
radius=0.8, center=(0, 0), textprops={'fontsize': 9, 'color': 'k'}, pctdistance=0.6)
# 设置标题和图例
axes[1, 0].set_title('学生成绩统计图')
# 绘制多子图中的柱形图
axes[1, 1].bar(df['姓名'], df['语文'], width=0.5, color='orange')
# 设置x,y轴坐标
axes[1, 1].set_xlabel('姓名')
axes[1, 1].set_ylabel('语文')
# 设置坐标轴刻度
axes[1, 1].set_yticks(range(0, 150, 15))
# 设置标题和图例
axes[1, 1].set_title('学生成绩统计图')
axes[1, 1].legend(['语文'], loc='upper right') # 添加图例
# 调整图表与画布边缘间距
plt.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
# 坐标轴的刻度线向内显示还是向外显示
plt.tick_params(left=True, bottom=True, right=False, top=False)
# 显示图像
plt.show()
结果展示:
3.matplotlib.pyplot.add_subplot 函数
1).语法:
matplotlib.pyplot.add_subplot(nrows, ncols, index, **kwargs)
参数说明:
nrows,ncols:将画布分成几行几列
index:索引index从左上角开始,向右边递增
2).示例:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet2')
print(df)
# 设置画布
fig = plt.figure(figsize=(6, 4), facecolor='white')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# X,Y轴刻度线的显示方向
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
# 绘制多子图中的折线图
fig.add_subplot(2, 2, 1)
plt.plot(df['姓名'], df['语文'], color='c', linestyle='-', marker='o', mfc='w')
# 设置网格线
plt.grid(color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('语文')
# 设置坐标轴刻度
plt.yticks(range(0, 150, 15))
# 设置标题和图例
plt.title('学生成绩统计图')
#设置图例
plt.legend(['语文'], loc='upper right')
# 绘制多子图中的散点图
fig.add_subplot(2, 2, 2)
plt.scatter(df['姓名'], df['语文'], color='r')
# 设置网格线
plt.grid(color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('语文')
# 设置坐标轴刻度
plt.yticks(range(0, 150, 15))
# 设置标题和图例
plt.title('学生成绩统计图')
#设置图例
plt.legend(['语文'], loc='upper right')
# 绘制多子图中的柱形图
fig.add_subplot(2, 1, 2)
plt.bar(df['姓名'], df['语文'], width=0.5, color='orange')
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('语文')
# 设置坐标轴刻度
plt.yticks(range(0, 150, 15))
# 设置标题和图例
plt.title('学生成绩统计图')
#设置图例
plt.legend(['语文'], loc='upper right')
# 调整图表与画布边缘间距
plt.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
# 坐标轴的刻度线向内显示还是向外显示
plt.tick_params(left=True, bottom=True, right=False, top=False)
# 显示图像
plt.show()
结果展示:
4.图标的保存 (matplotlib.pyplot.savefig)
1).将图表保存为JPEG,TIFF或PNG格式的图片
2).保存代码[ plt.savefig(“D:\Result.png”) ]必须在图表预览[ plt.show() ]前,否则保存后的图片是白色的,没有任何图表