You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Datashader绘制按密度着色的时间序列直方图折线图

数据格式转换

你当前的宽表结构(每列对应一个y值)无法直接适配Datashader的处理逻辑,第一步先转为三列长表:时间戳dt、纵轴值y、密度值density。用pandas的melt方法即可完成转换,500列10万行的原始数据转换后为5000万行,属于Datashader的常规处理规模:

import pandas as pd
# df为原始宽表数据
long_df = df.melt(id_vars="dt", var_name="y", value_name="density")
# 清洗y字段,提取数值
long_df["y"] = long_df["y"].str.replace("y=", "").astype(int)
long_df["dt"] = pd.to_datetime(long_df["dt"])

基础渲染实现

你要的效果本质是时间-y二维网格的颜色按密度值映射,不需要拆分绘制每一条折线,直接按点聚合即可:

import datashader as ds
import datashader.transfer_functions as tf

# 初始化画布,可根据需求调整宽高和轴范围
cvs = ds.Canvas(
    plot_width=1200,
    plot_height=600,
    x_axis_type="datetime",
    x_range=(long_df["dt"].min(), long_df["dt"].max()),
    y_range=(long_df["y"].min(), long_df["y"].max())
)
# 按(dt,y)位置聚合密度值,相同位置取均值即可,无数据位置默认补0
agg = cvs.points(long_df, "dt", "y", ds.mean("density"))
# 渲染,cmap参数可替换为自定义颜色序列,匹配你的密度-颜色对应规则
img = tf.shade(agg, cmap=["white", "red", "blue"], how="linear")

如果需要实现时间区间段的颜色对应前序时间点的密度,只需给长表新增dt_next字段存储下一个时间戳,将每个点扩展为(dt, dt_next)的区间,用cvs.quads方法聚合渲染即可,性能不会有明显下降。

离散密度值的颜色映射

如果你的密度值是离散分类值,需要固定颜色对应,可先将密度转为分类编码,用分类色阶渲染:

# 示例:密度10对应红色,20对应蓝色,其余值为白色
long_df["density_cat"] = long_df["density"].map({10: 1, 20: 2}).fillna(0).astype(int)
color_map = {0: "white", 1: "red", 2: "blue"}
agg = cvs.points(long_df, "dt", "y", ds.max("density_cat"))
img = tf.shade(agg, color_key=color_map)

内容的提问来源于stack exchange,提问作者Sigmund Fraud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:15:02