如何用 Python 画组合图?我给你 2 个有效的套路

林骥
林骥
林骥
44
文章
0
评论
2021-08-1317:42:45 评论 1,334 3144字
摘要

组合图就是将多个形状,组合到一个图形中,主要作用是节约作图的空间,节省读者的时间,从而提高信息传达的效率。

 

你好,我是林骥,今天我们聊一聊组合图。

 

组合图就是将多个形状,组合到一个图形中,主要作用是节约作图的空间,节省读者的时间,从而提高信息传达的效率。

 

一种典型的组合图,是将柱状图与折线图组合在一起。

 

比如说,要展现每月销售目标达成情况,我总结了 2  个高效的套路。

 

第 1 个套路,是用两个不同颜色的柱子,分别展示每个月的实际销售额和目标销售额,用折线图展示目标完成率。

如何用 Python 画组合图?我给你 2 个有效的套路

 

通常情况下,在这种组合图中,左边的主坐标轴是柱形图对应的数据,右边的次坐标轴是折线图对应的数据,下边的横坐标轴表示细分的维度,比如时间、地区、渠道等。

 

第 2 个套路,是用两条不同颜色的折线,分别展示每个月的实际销售额和目标销售额,再用两种不同颜色的柱形图展示实际与目标的差额,绿色代表完成目标,红色代表没有完成目标,这种组合图不需要用到两个纵坐标轴,我觉得比较简单而且实用。

如何用 Python 画组合图?我给你 2 个有效的套路

 

你可能会说,我用 Excel 很容易就能画出组合图,为什么还要用 Python?

 

我曾表达过自己的观点,因为我觉得用 Python 能够更加灵活高效,而且 Python 能让很多日常的数据分析工作,变得更加自动化、标准化、流程化。

 

比如说,要处理一个 1000 万行的数据文件,Python 的效率要明显高于 Excel。

 

下面我们开始用 Python 来画组合图。

 

1. 读取数据

 

首先,我们导入所需的库,并做一些初始化的设置,然后用 Pandas 从 Excel 文件中读取数据,用变量存储画图所需的数据,再计算目标完成率。

 

我们假设数据源保存在 data 目录下

 

# 导入所需的库import pandas as pdimport numpy as npimport matplotlib.pyplot as plt# 设置正常显示中文标签plt.rcParams["font.sans-serif"] = ["SimHei"]# 正常显示负号plt.rcParams["axes.unicode_minus"] = False# 设置字体大小plt.rcParams.update({"font.size"16})########## 读取数据 ################ 从 Excel 文件中读取数据,第一列设置为索引sale = pd.read_excel("data/每月目标销售额和实际销售额.xlsx", index_col=0)# 提取数据x = np.arange(12) + 1y1 = sale.目标销售额y2 = sale.实际销售额# 计算目标完成率y3 = y2 / y1

 

 

2. 第 1 个套路

 

接下来,我们开始用 Python 画第 1 张组合图。

 

在下面的代码中,用到了 plt.twinx() 函数,代表两个 Y 轴共用同一个 X 轴,其中包括详细的注释说明,稍微有点 Python 基础知识的读者应该都能看懂,完整的画图代码如下

 

# 定义图形大小fig = plt.figure(figsize=(168))ax1 = plt.subplot(111)# 柱形宽度bar_width = 0.35# 在主坐标轴绘制柱形图plt.bar(x, y1, bar_width, label="目标销售额")plt.bar(x+bar_width, y2, bar_width, label="实际销售额")# 设置坐标轴的取值范围,避免柱子过高而与图例重叠plt.ylim(0, max(y1.max(), y2.max())*1.2)# 设置图例ax1.legend(loc="upper left")# 设置横坐标的标签ax1.set_xticks(x)ax1.set_xticklabels(sale.index, rotation=0)# 在次坐标轴绘制折线图ax2 = plt.twinx()ax2.plot(x, y3, ls="-", lw=2, color="r", marker="o", label="目标完成率")# 设置次坐标轴的取值范围,避免折线图波动过大plt.ylim(01.35)# 设置图例ax2.legend(loc="upper right")# 定义显示百分号的函数def to_percent(number, position=0):    return "%.f"%(number*100) + "%"# 次坐标轴的标签显示百分号 %from matplotlib.ticker import FuncFormatterplt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))# 设置标题title = "
每月销售目标达成情况
"plt.title(title, fontsize=36, loc="center", color="k")plt.show()

 

3. 第 2 个套路

 

接下来,我们开始用 Python 画第 2 张组合图。

 

在下面的代码中,使用了 Python 编程中「列表推导式」,实现让柱形图的颜色自动变化,让代码变得更加精炼,完整代码如下。

 

# 导入所需的库import pandas as pdimport numpy as npimport matplotlib.pyplot as plt# 设置正常显示中文标签plt.rcParams["font.sans-serif"] = ["SimHei"]# 正常显示负号plt.rcParams["axes.unicode_minus"] = False# 设置字体大小plt.rcParams.update({"font.size"16})# 从 Excel 文件中读取数据,第一列设置为索引sale = pd.read_excel("data/每月目标销售额和实际销售额.xlsx", index_col=0)# 提取数据x = sale.indexy1 = sale.目标销售额y2 = sale.实际销售额# 计算差额y3 = y2 - y1# 绘制折线图fig = plt.figure(figsize=(168))ax = plt.subplot(111)ax.plot(x, y1, ls="-", lw=2, label="目标销售额")ax.plot(x, y2, ls="--", lw=2, label="实际销售额")# 用列表推导式定义柱子的颜色,绿色代表完成目标, 红色代表没有完成目标color = ["g" if i > 0 else "#dc5034" for i in y3]        # 绘制柱形图plt.bar(x, y3, color=color, label="差额")# 设置图例ax.legend(loc="upper left")# 设置标题title = "
每月销售目标达成情况
"plt.title(title, fontsize=36, loc="center", color="k")plt.show()

 

小结

 

本文介绍了组合图的作用,并应用于展现每月销售目标达成情况,给出了 2 套 Python 实现代码,你更喜欢哪一套?欢迎留言告诉我

 

你可以把这个画图的过程,当作是固定的套路,只需要修改数据源和标题文字等内容,然后运行一遍代码,即使你不懂代码的细节,也能得到自己想要的结果,是不是很有效?

最后提醒一下,关于组合图,有一种常见的误区,就是把不相关的指标组合在一起进行展示,让人难以看懂,这样其实反而降低了信息传达的效率,显然违背了作图的目的,这是不够专业的表现,应该引以为戒。

End.

爱数据网专栏作者:林骥

作者介绍:数据赋能者,专注数据分析 10 多年。

个人公众号:林骥(linjiwx)

本文为挖数网专栏作者原创文章,未经允许禁止转载,需要转载请微信联系授权(微信号:lovedata0520)

更多文章前往爱数据社区网站首页浏览http://www.itongji.cn/

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: