如何使用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
相关产品推荐
相关产品推荐

