以下是利用Python绘制数据的瀑布图的教程攻略:
什么是瀑布图
瀑布图(Waterfall chart)又称为桥形图,它适用于展示某一目标从初始数值一步步地增加或减少到最终数值的整个过程,是一种不常用的图表类型。
利用Python绘制瀑布图的步骤
绘制瀑布图的第一步是导入必要的库,包括pandas,matplotlib和numpy。接下来是读取数据并对其进行预处理,包括计算每一阶段的数值、颜色和标签。最后,使用plt.bar函数绘制瀑布图。
下面,我们将一步步学习如何使用Python完成这些步骤。
导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
读取数据并进行预处理
数据的格式应该是一个包含若干列和若干行的矩阵,其中每一行代表一个阶段,每个阶段包含了以下信息:
- 阶段的名称
- 阶段的数值变化(可以是增加或减少)
- 阶段的颜色
例如,下面的数据表格显示了一个包含四个阶段的数据。
阶段 | 变化 | 颜色 |
---|---|---|
第一阶段 | 100 | 红色 |
第二阶段 | -20 | 黄色 |
第三阶段 | -50 | 绿色 |
第四阶段 | 70 | 蓝色 |
我们可以使用pandas库读取这个数据,并对其进行处理,首先计算出每个阶段的值:
data = pd.DataFrame({'Stage': ['第一阶段', '第二阶段', '第三阶段', '第四阶段'], 'Change': [100, -20, -50, 70], 'Color': ['red', 'yellow', 'green', 'blue']})
data['Value'] = data['Change'].cumsum()
data = data[['Stage', 'Value', 'Change', 'Color']]
这里我们使用了pandas的cumsum函数,它可以对数据进行累加。对于这个数据来说,计算出来的值是[100,80,30,100]。
接下来,我们可以使用np.arange函数生成每个阶段的X轴坐标,将阶段名称作为Y轴坐标,并根据颜色信息设置瀑布图的每个部分的颜色信息。
x = np.arange(len(data))
y = data['Value'].values
colors = data['Color'].values
fig, ax = plt.subplots(figsize=(8, 6))
for i in range(len(x)):
ax.bar(x[i], data['Change'][i], bottom=y[i], color=colors[i], width=0.5, align='center')
if data['Change'][i] < 0:
ax.text(x[i]+0.25, y[i]+(data['Value'][i+1]-data['Value'][i])/2, str(data['Value'][i+1]-data['Value'][i]), va='center')
else:
ax.text(x[i]+0.25, y[i]+(data['Value'][i]-data['Value'][i-1])/2, str(data['Value'][i]-data['Value'][i-1]), va='center')
plt.xticks(x, data['Stage'])
plt.show()
最后,我们使用plt.bar函数绘制瀑布图,设置每个部分的颜色和对齐方式,以及使用的字体。
示例一
让我们以一个更复杂的数据为例。假设我们有一个包含10个阶段的数据,每个阶段都包含名称、变化、颜色和注释。下面是这个数据的格式:
data=pd.DataFrame({'Stage':['第1个月','第2个月','第3个月','第4个月','第5个月','第6个月','第7个月','第8个月','第9个月','第10个月'],
'Change':[20,-10,-5,-10,-10,20,30,5,-20,-10],
'Color':['green','green','green','green','green','grey','grey','grey','grey','grey'],
'Note':['本月涨了20%','本月跌了10%','本月小跌了5%','本月大跌了10%','本月继续下跌10%','本月大涨20%','本月继续大涨30%','本月小涨了5%','本月下跌了20%','本月继续下跌了10%']})
我们可以使用和前一个示例相同的方法对数据进行预处理,并使用注释信息添加说明文本。
x = np.arange(len(data))
y = data['Value'].values
colors = data['Color'].values
fig, ax = plt.subplots(figsize=(16, 8))
for i in range(len(x)):
ax.bar(x[i], data['Change'][i], bottom=y[i], color=colors[i], width=0.5, align='center')
if data['Change'][i] < 0:
ax.text(x[i]+0.25, y[i]+(data['Value'][i+1]-data['Value'][i])/2, str(data['Value'][i+1]-data['Value'][i]), va='center')
else:
ax.text(x[i]+0.25, y[i]+(data['Value'][i]-data['Value'][i-1])/2, str(data['Value'][i]-data['Value'][i-1]), va='center')
ax.text(x[i], y[i]+data['Change'][i]+5, data['Note'][i], ha='center', va='bottom', fontsize=8)
plt.xticks(x, data['Stage'])
plt.title('Monthly Revenue')
plt.show()
示例二
下面,我们假设有一批商品,每个商品的售价都不同,我们希望使用瀑布图展示这些商品的销售额以及销售额的变化情况。在这个示例中,我们将使用CSV格式的数据文件,并使用pandas库进行数据读取。
首先,我们需要下载“商品数据.csv”文件(假设文件位置为~/Downloads/)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('~/Downloads/商品数据.csv')
x = np.arange(len(data))
y = data['Value'].values
colors = np.array(['grey']*len(data))
colors[data['Revenue']>0] = 'green'
colors[data['Revenue']<0] = 'red'
fig, ax = plt.subplots(figsize=(16, 8))
for i in range(len(x)):
ax.bar(x[i], data['Revenue'][i], bottom=y[i], color=colors[i], width=0.5, align='center')
ax.text(x[i], y[i]+data['Revenue'][i]+50, '${:,.0f}'.format(data['Revenue'][i]), ha='center', va='bottom', fontsize=10)
plt.xticks(x, data['Product'])
plt.title('Sales Performance')
plt.show()
代码说明
绘制瀑布图的关键是计算出每个阶段的值,然后使用plt.bar函数绘制瀑布图。对于每个瀑布图的部分,它的高度表示了该部分的价值,它的宽度表示了不同阶段之间的距离。
下面是每个参数的解释:
- plt.bar()函数中的x值表示每个阶段在X轴上的位置,y值表示每个阶段的高度,也就是价值变化的数值。
- bottom参数表示每个部分的起始高度,也就是前面部分的高度加上当前部分的价值。
- color参数表示每个部分的颜色。
- width参数表示每个部分的宽度。
- align参数表示每个部分的对齐方式。
- plt.text()函数用于添加注释,它的x值表示文本的位置,y值表示文本在Y轴上的位置,va参数表示文本的垂直对齐方式,ha参数表示文本的水平对齐方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用Python绘制数据的瀑布图的教程 - Python技术站