可视化之瀑布图的绘制--基于matplotlib库
写在前面:近日学习matplotlib库时,可以自己绘制柱状图,条形图,堆叠条形图,并列条形图等等;对于瀑布图,算是一个练习,我们基于matplotlib.pyplot中的bar()函数来绘制我们的瀑布图吧。
代码重难点提示:
- 颜色设置与图例的添加
- 柱体上数字的添加
- 横坐标刻度的定义与旋转
编译器:jupyter notebook
首先来看一下我们需要绘制出来的瀑布图长什么样子吧。
第一步:前期准备-导入数据
导入我们需要使用的包以及数据;我们这里用到的数据是随便写的一个fake data。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 识别汉字
mpl.rcParams['axes.unicode_minus'] = False # 识别负号
data = pd.read_excel("fakedata.xlsx")
data
month day money
0 11 1 900
1 11 2 345
2 11 3 393
3 11 4 -100
4 11 5 -154
5 11 6 135
6 11 7 178
7 11 8 286
8 11 9 -119
9 11 10 -361
10 11 11 -203
第二步:打好基础1-画出堆叠柱形图的样子
因为我们需要画的是一个瀑布图,观察瀑布图的样子可以发现,瀑布图的每一个小柱体,除了第一个柱子之外,都是以前一个柱子的末尾为当前柱子的起点,所以我们可以先画出堆叠柱形图的模样。
money = data['money']
# 首先画出堆叠柱形图的样子,多用几个plt.bar(),设置好bottle就可以了,画出来应该有11根柱子
bottom1 = 0
bar_width=0.8
x = np.arange(len(money))
for i in money.index:
y = money[i]
plt.bar(x, y, bar_width, align='center', bottom=bottom1)
bottom1 += y
plt.legend()
plt.title("瀑布图")
plt.xlabel('time')
plt.ylabel('money')
得到下面的图形
第三步:打好基础2-并排柱形图
在上一步中,我们画出了堆叠柱形图,我们得到了11个完全一模一样的柱子,并且是堆叠起来的。再次观察我们的瀑布图,可以看到,瀑布图的柱子并不是堆积在一起的,而是每个x轴的刻度对应一个柱子,所以我们可以利用并排柱形图的思想咯。
# 对上面的代码进行改进,让他显示出一点并排柱状图的样子;事实上,这时候我们已经有了瀑布图的样子了
bottom1 = 0
bar_width=0.8
x_idx = np.arange(len(money), dtype=np.float64) # 这里要将x_idx的类型定义一下,否则下面不能进行加的操作
for i in money.index:
x = x_idx[i]
y = money[i]
plt.bar(x, y, bar_width, align='center', bottom=bottom1)
bottom1 += y
x += 0.8
plt.legend()
plt.title("瀑布图")
plt.xlabel('time')
plt.ylabel('money')
结果展示
第四步:瀑布图成形
经过前面几步的准备工作,我们可以看到,在使用了堆叠柱形图以及并排柱形图的思想之后,我们已经得到了一个与瀑布图十分类似的图形了。但是观察发现,我们现在画出来的图每个柱子的颜色都不一样,并且也没有图例(右上角的小白方框中什么也没有),这可怎么办呀。
别急,我们在画图的时候使用一个