河流图主要用于展示随时间变化的数据流或事件流。
它通过连续的带状图形来表示不同类别的数据流,河流的宽度与数据的大小成正比。
特别适合于展示多个类别或数据流随时间的变化,尤其是当这些数据之间存在重叠或交互时。
欢迎关注本人微信公众号--交通数据探索师
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import ThemeRiver
import numpy as np
np.random.seed(1)
data = pd.DataFrame(
{
'time': pd.date_range('2024-01-01 00:00:00', '2024-01-01 23:00:00', freq='H'),
'road1_flow': np.random.randint(1000, 2000, 24), # 路段1每小时的流量
'road2_flow': np.random.randint(800, 2200, 24), # 路段2每小时的流量
'road3_flow': np.random.randint(500, 2500, 24) # 路段3每小时的流量
}
)
# 不同类别的名称,即路段1、路段2、路段3
x_data = ['road1', 'road2', 'road3']
# 对上面的data转换下形式,因为该河流图需要传入特定形式的数据,可见下文
data = (
data.
melt(id_vars='time', var_name='road', value_name='flow').
eval("road=road.str.split('_', expand=True)[0]").
reindex(['time', 'flow', 'road'], axis=1).
values.
tolist()
)
(
ThemeRiver()
.add(
series_name=x_data, # 系列名称,即每个分类的名称
data=data, # 数据,有特定格式,参考上面
singleaxis_opts=opts.SingleAxisOpts(
pos_top="50",
pos_bottom="50",
type_="time" # 指定轴的类型为时间轴
),
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line")
)
.render(r"theme_river.html")
)
该主题河流图需要传入特定格式的数据,给数据满足以下要求:
时间戳:表示数据点对应的时间,通常是一个日期字符串或者时间戳数值;值:表示在特定时间的数据值,可以是数量、频率或其他度量;
类别:表示数据点属于哪个类别,用于区分不同的数据流。
示例数据如下,
可视化效果如下,输出的是html文件,截图如下,