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

使用hvplot时如何根据y值对x轴排序且适配groupby场景

hvplot分组切换时动态按Y轴值排序X轴的实现方案

你可以直接借助holoviews的apply方法对每个分组的子图做实时排序,不需要提前对全量DataFrame做处理,代码实现非常简洁:

import hvplot.pandas
import holoviews as hv
hv.extension('bokeh')

# 你的原始DataFrame不需要提前做任何排序操作
df.hvplot.bar(
    x='产品名称',
    y='学生平均人数',
    groupby='城市',
    title='各城市产品学生平均使用人数',
    xlabel='产品名称',
    ylabel='学生平均人数',
    width=700,
    height=400
# 核心逻辑:对每个分组的子图按Y值降序排序,自动调整X轴顺序
).apply(lambda x: x.sort('学生平均人数', reverse=True))

如果需要升序排序,把reverse=True删掉或者改成reverse=False即可

如果你需要更复杂的自定义逻辑(比如排序规则联动其他参数、自定义控件样式等),可以自己封装DynamicMap回调实现:

import pandas as pd
import hvplot.pandas
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

# 所有可选城市列表
cities = df['城市'].unique().tolist()

# 定义绘图回调,每次切换城市时实时筛选、排序、绘图
def plot_city(city):
    # 仅对当前城市的子数据集做排序,不影响原始DataFrame
    current_df = df[df['城市'] == city].sort_values('学生平均人数', ascending=False)
    return current_df.hvplot.bar(
        x='产品名称',
        y='学生平均人数',
        title=f'{city}产品使用数据',
        width=700,
        height=400,
        color='#36A2EB'
    )

# 生成带城市选择控件的动态可视化组件
dynamic_plot = hv.DynamicMap(plot_city, kdims=['城市']).redim.values(城市=cities)
dynamic_plot.opts(opts.Bars(xrotation=45, show_legend=False))

# 直接显示即可
dynamic_plot

两种实现方式的X轴排序都是切换城市时实时计算的,不会修改你原始的全量数据集,也不需要提前对所有城市的数据做统一排序,完全适配不同城市产品热度分布差异的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:42:00