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

