Python数据可视化的例子——多个图形的合并

工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果。针对这种情况,如何应用Python将前面所学的各种图形汇总到一个图表中,这将是本节所要学习的重点。
关于多种图形的组合,可以使用matplotlib模块中的subplot2grid函数。这个函数的灵活性非常高,构成的组合图既可以是m×n的矩阵风格,也可以是跨行或跨列的矩阵风格。接下来,对该函数的用法和参数含义加以说明:

subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)
  • shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3)。
  • loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0)。
  • rowspan:指定某个子图需要跨几行。
  • colspan:指定某个子图需要跨几列。

为了使读者理解函数中的四个参数,这里以2×3的组图布局为例,说明子图位置与跨行、跨列的概念,如下图所示:
Python数据可视化的例子——多个图形的合并_第1张图片
这两种布局的前提都需要设置shape参数为(2,3),所不同的是,左图一共需要布置6个图形;右图只需要布置4个图形,其中第三列跨了两行(rowspan需要指定为2),第二行跨了两列(colspan需要指定为2)。图框中的元组值代表了子图的位置。
接下来以某集市商品交易数据为例,绘制含跨行和跨列的组合图:
Python数据可视化的例子——多个图形的合并_第2张图片
代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读取数据
Prod_Trade = pd.read_excel(r'某集市商品交易数据.xlsx')
# 衍生出交易年份和月份字段
Prod_Trade['year'] = Prod_Trade.Date.dt.year
Prod_Trade['month'] = Prod_Trade.Date.dt.month

# 设置大图框的长和高
plt.figure(figsize = (12,6))

# 设置第一个子图的布局  matplotlib模块
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 统计2012年各订单等级的数量
Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
# 将饼图设置为圆形(否则有点像椭圆)
ax1.set_aspect(aspect = 'equal')
# 绘制订单等级饼图
ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 添加标题
ax1.set_title('各等级订单比例')

# 设置第二个子图的布局  pandas模块
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 统计2012年每月销售额
Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({
     'Sales':np.sum})
# 绘制销售额趋势图
Month_Sales.plot(title = '2012年各月销售趋势', ax = ax2, legend = False)
#设置横坐标的刻度范围
plt.xlim((1, 12))
# 删除x轴标签
ax2.set_xlabel('')

# 设置第三个子图的布局  seabron模块
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 绘制各运输方式的成本箱线图
sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
# 添加标题
ax3.set_title('各运输方式成本分布')
# 删除x轴标签
ax3.set_xlabel('')
# 修改y轴标签
ax3.set_ylabel('运输成本')

# 设置第四个子图的布局  seabron模块
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
# 2012年客单价分布直方图
sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012], bins = 40, norm_hist = True, ax = ax4, hist_kws = {
     'color':'steelblue'}, kde_kws=({
     'linestyle':'--', 'color':'red'}))
# 添加标题
ax4.set_title('2012年客单价分布图')
# 修改x轴标签
ax4.set_xlabel('销售额')

# 调整子图之间的水平间距和高度间距
plt.subplots_adjust(hspace=0.6, wspace=0.3)
# 图形显示
plt.show()

结果:
Python数据可视化的例子——多个图形的合并_第3张图片
如上图所示,构成了2×3风格的组合图,其中两幅子图是跨行和跨列的,而且这里特地选了matplotlib模块、pandas模块和seabron模块绘制子图,目的是让读者能够掌握不同模块图形的组合。针对如上代码,需要讲解几个重要的知识点:

  • 在绘制每一幅子图之前,都需要运用subplot2grid函数控制子图的位置,并传递给一个变量对象(如代码中的ax1、ax2等)。
  • 为了使子图位置(ax1、ax2等)产生效果,不同的绘图模块需要应用不同的方法。如果通过matplotlib模块绘制子图,则必须使用ax1.plot_function的代码语法(如上代码中,绘制饼图的过程);如果通过pandas模块或seaborn模块绘制子图,则需要为绘图“方法”或函数指定ax参数(如上代码中,绘制折线图、直方图和箱线图的过程)。
  • *如果为子图添加标题、坐标轴标签、刻度值标签等,不能直接使用plt.title、plt.xlabel、plt.xticks等函数,而是换成ax1.set_的形式(可参考如上代码中对子图标题、坐标轴标签的设置)。
  • 由于子图之间的默认宽间距和高间距不太合理,故需要通过subplots_adjust函数重新修改子图之间的水平间距和垂直间距(如倒数第二行代码所示)。

你可能感兴趣的:(数据挖掘与数据分析,python,可视化,数据分析)