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

使用hvplot.pandas的groupby创建2x2子图报错:DynamicMap无cols属性

问题描述

尝试用hvplot.pandas的widget groupby功能创建2x2子图,不使用groupby时代码正常运行:

import pandas as pd
import hvplot.pandas
df = pd.DataFrame({'x':[0 ,1, 2, 3], 'a': [1, 2, 8, 5], 'b': [200, 300, 50 ,0], 'c': [-1, -5, 5, 3], 'd': [0, 0, 1 , 2], 'group': [1, 1, 2, 2]})
df.hvplot(x='x', y=['a', 'b', 'c', 'd'], width=300, height=300, subplots=True, shared_axes=False).cols(2)

但添加groupby='group'参数后执行失败,报错:

AttributeError: 'DynamicMap' object has no attribute 'cols'
解决方法

问题核心是:添加groupby后,返回的对象是DynamicMap而非普通的Layout,因此无法直接调用.cols()方法。以下是两种优雅的解决方式:

方法一:在hvplot调用中直接指定cols参数

hvplot支持直接在函数内部定义子图列数,把cols=2加入hvplot()的参数列表即可:

import pandas as pd
import hvplot.pandas
df = pd.DataFrame({'x':[0 ,1, 2, 3], 'a': [1, 2, 8, 5], 'b': [200, 300, 50 ,0], 'c': [-1, -5, 5, 3], 'd': [0, 0, 1 , 2], 'group': [1, 1, 2, 2]})
df.hvplot(
    x='x', 
    y=['a', 'b', 'c', 'd'], 
    width=300, 
    height=300, 
    subplots=True, 
    shared_axes=False, 
    groupby='group',
    cols=2  # 直接在这里指定2列布局
)

方法二:用DynamicMap.map()处理每个Layout

如果需要更灵活的布局调整逻辑,可以通过map()方法,对DynamicMap中的每个Layout对象单独设置列数:

import pandas as pd
import hvplot.pandas
df = pd.DataFrame({'x':[0 ,1, 2, 3], 'a': [1, 2, 8, 5], 'b': [200, 300, 50 ,0], 'c': [-1, -5, 5, 3], 'd': [0, 0, 1 , 2], 'group': [1, 1, 2, 2]})
plot = df.hvplot(
    x='x', 
    y=['a', 'b', 'c', 'd'], 
    width=300, 
    height=300, 
    subplots=True, 
    shared_axes=False, 
    groupby='group'
)
# 对每个动态生成的Layout应用cols(2)
plot.map(lambda layout: layout.cols(2))

两种方法都能实现2x2的子图布局,同时保留groupby的交互widget功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:20:36