瀑布图是一种二维可视化工具,它能够展示随时间或多个步骤的正负变化。正如Anthony T. Hincks所幽默指出的,瀑布图可以呈现多种形态。本文将深入探讨瀑布图的重要性,并展示如何利用Matplotlib和Plotly库来创建瀑布图。
瀑布图通常用于财务分析中,以理解多个因素对特定资产的正负影响。这种图表可以基于时间或类别来展示效果。基于类别的图表表示在费用、销售或其他具有连续正负值的变量上的收益或损失。基于时间的图表则表示在时间段上的收益或损失。瀑布图大多数是水平的,它们从水平轴开始,并通过一系列与正负评论相关的浮动柱连接。有时,柱子在图表中用线条连接。
让通过一个例子来理解何时何地使用瀑布图,因为制作瀑布图并不是一个难题。将使用一些虚拟数据和Kaggle数据集来构建瀑布图。
假设给一个表格,不是一个普通的表格,而是一个风格化的表格和一个瀑布图,哪一个更方便阅读?这个表格代表了一周的销售数据,使用了seaborn库来创建具有背景渐变的热图。
import seaborn as sns
a = ['mon','tue','wen','thu','fri','sat','sun']
b = [10,-30,-7.5,-25,95,-7,45]
df2 = pd.DataFrame(b,a).reset_index().rename(columns={'index':'values',0:'week'})
cm = sns.light_palette("green", as_cmap=True)
df2.style.background_gradient(cmap=cm)
现在,将表格和瀑布图并排查看。表格显示了按顺序排列的重要值,但阅读起来相当困难。另一方面,可以轻松地看到黄色条表示减少,红色条表示增加。
将使用的数据来自Kaggle的Netflix电影和电视节目,笔记本可以在这里找到。将使用Plotly,这是一个开源的图表库。
import plotly.graph_objects as go
df = pd.read_csv(r'D:/netflix_titles.csv')
df["date_added"] = pd.to_datetime(df['date_added'])
df['year_added'] = df['date_added'].dt.year
df['month_added'] = df['date_added'].dt.month
d2 = df[df["type"] == "Movie"]
col = "year_added"
vc2 = d2[col].value_counts().reset_index().rename(columns = {col : "count", "index" : col})
vc2['percent'] = vc2['count'].apply(lambda x : 100*x/sum(vc2['count']))
vc2 = vc2.sort_values(col)
fig2 = go.Figure(go.Waterfall(
name = "Movie", orientation = "v",
x = ["2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021"],
textposition = "auto",
text = ["1", "2", "1", "13", "3", "6", "14", "48", "204", "743", "1121", "1366", "1228", "84"],
y = [1, 2, -1, 13, -3, 6, 14, 48, 204, 743, 1121, 1366, -1228, -84],
connector = {"line":{"color":"#b20710"}},
increasing = {"marker":{"color":"#b20710"}},
decreasing = {"marker":{"color":"orange"}},
))
让逐一了解每个参数:
x: 将要出现在x轴上的值
y: 将要出现在y轴上的值
text: 将要出现在图表上的值
textposition: 可以将文本放在图表的条形内部或条形上方
为了使图表更优雅,将给图表的条形及其连接线着色。对于增加的条形,给了红色,对于减少的条形,是黄色。
图表的参数:
connector: 给连接线着色
increasing: 给增加的条形着色
decreasing: 给减少的条形着色
正如所看到的图表看起来相当不错,但让使其更具吸引力:
fig2.update_xaxes(showgrid=False)
fig2.update_yaxes(showgrid=False, visible=False)
fig2.update_traces(hovertemplate=None)
fig2.update_layout(title='Watching Movies over the year', height=350,
margin=dict(t=80, b=20, l=50, r=50),
hovermode="x unified",
xaxis_title=' ', yaxis_title=" ",
plot_bgcolor='#333', paper_bgcolor='#333',
title_font=dict(size=25, color='#8a8d93', family="Lato, sans-serif"),
font=dict(color='#8a8d93'))
现在看起来完美了。
通过pip安装waterfallcharts库:
!pip install waterfallcharts
导入库:
import pandas as pd
import waterfall_chart
import matplotlib.pyplot as plt
%matplotlib inline
让为每周的销售数据绘制一个瀑布图:
a = ['mon','tue','wen','thu','fri','sat','sun']
b = [10,-30,-7.5,-25,95,-7,45]
waterfall_chart.plot(a, b);
如果仔细观察图表,正数值的条形默认是绿色,负数值是红色,总值是蓝色。
给图表添加一些参数:
waterfall_chart.plot(a, b, net_label='Total', rotation_value=360)
图表的参数:
net_label: 在最后一个条形可以改变条形的名称为net_label
rotation_value: 旋转并设置x轴的值