如何为Datashader/HoloViews图表按自定义类别上色并启用色条
使用Datashader绘制带类别配色与色条的大规模地理散点图
针对你拥有的500万条带自定义温度类别的地理数据,以下是实现指定需求的完整方案:
核心思路
利用Datashader的大规模数据渲染能力,结合自定义类别配色映射,通过hvPlot(封装Datashader的易用工具)快速生成带色条的可视化图表,避免百万级数据导致的性能问题。
步骤实现
1. 导入依赖库
import pandas as pd import hvplot.pandas # 封装Datashader的可视化工具
2. 定义自定义类别配色映射
根据你的category列取值,创建一一对应的颜色字典:
color_map = { 'green': '#008000', 'blue': '#0000FF', 'yellow': '#FFFF00', 'indigo': '#4B0082', 'red': '#FF0000' }
3. 绘制Datashader图表(带色条)
直接调用hvPlot的points方法,启用Datashader渲染并配置配色与色条:
df.hvplot.points( x='long', y='lat', datashade=True, # 启用Datashader处理大规模数据 color='category', # 按category列映射颜色 cmap=color_map, # 应用自定义配色 colorbar=True, # 显示色条 width=800, height=600, title='Temperature Category Geographic Distribution' )
纯Datashader原生实现(可选)
如果需要完全基于Datashader原生API实现,可使用以下代码(需手动处理色条):
import datashader as ds import datashader.transfer_functions as tf import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 创建画布 x_range = (df['long'].min(), df['long'].max()) y_range = (df['lat'].min(), df['lat'].max()) cvs = ds.Canvas(plot_width=800, plot_height=600, x_range=x_range, y_range=y_range) # 按类别聚合数据 agg = cvs.points(df, 'long', 'lat', ds.count_cat('category')) # 渲染图像 img = tf.shade(agg, color_key=color_map) img = tf.set_background(img, 'white') # 生成并显示色条 cmap = ListedColormap([color_map[c] for c in color_map.keys()]) fig, ax = plt.subplots(figsize=(10, 1)) fig.subplots_adjust(bottom=0.5) cb = plt.colorbar(plt.cm.ScalarMappable(cmap=cmap), cax=ax, orientation='horizontal', ticks=range(len(color_map))) cb.set_ticklabels(color_map.keys()) plt.show() # 显示渲染后的地图 display(img.to_pil())
关键说明
datashade=True:强制使用Datashader渲染,避免百万级数据导致的内存溢出与卡顿- 配色映射需确保覆盖所有
category取值,否则未匹配的类别会显示默认颜色 - hvPlot方式无需手动处理画布范围,会自动根据数据适配
内容的提问来源于stack exchange,提问作者Debashish Samantaray
相关产品推荐
相关产品推荐

