Holoviews 根据标记类型显示点图的图例

问题描述 投票:0回答:1

假设我有以下数据框:

df = pd.DataFrame(data = {'id':['a','b','c','d'], 'value': [1,2,3,4], 'type':['x', 'x', 'y', 'y']})

  id  value type
0  a      1    x
1  b      2    x
2  c      3    y
3  d      4    y

我想制作一个带有全息图的交互式散点图,其中点由

value
着色,标记基于
type
。下面的代码几乎让我得到了我想要的......

p = hv.Points(df)
options = hv.opts.Points(tools=['hover'], size = 10,
                         color = 'value',
                         colorbar=True,
                         marker = hv.dim("type").categorize({'x': 'square', 'y':'circle'}),
                         show_legend = True)
                      
p.opts(options)

但是没有传说。如何添加从圆形标记(type = y)指定方形标记(type = x)的图例?

谢谢!

python visualization bokeh holoviews
1个回答
0
投票

您可以使用

hv.NdOverlay
hv.Legend
元素向散点图添加图例。这是一个例子:

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

df = pd.DataFrame(data={'id':['a','b','c','d'], 'value': [1,2,3,4], 'type':['x', 'x', 'y', 'y']})

points = hv.Points(df, kdims=['value'], vdims=['id'])
overlay = hv.NdOverlay({t: points.select(type=t) for t in df['type'].unique()})
legend = hv.Legend(list(df['type'].unique()))

options = hv.opts.Points(tools=['hover'], size=10, color='value', colorbar=True,
                          show_legend=True)

overlay.opts(options) * legend

在这个例子中,我们使用

Points
方法为DataFrame中的每个类型创建一个
select
对象,然后我们创建一个组合这些点对象的
NdOverlay
。我们还创建了一个
Legend
对象,其中包含 DataFrame 中的唯一类型列表,然后我们使用
*
运算符将图例添加到图中。

注意,我们使用

kdims=['value']
vdims=['id']
来指定
value
列应该用作x轴,
id
列应该用作y轴。您可以调整这些设置以匹配您想要的情节。

编辑(OP评论后):

第一个错误的原因是 kdims 参数必须是点元素的 2 维列表,x 轴和 y 轴。在我之前提供的代码中,我假设你的 df 中的值列同时包含绘图的 x 和 y 值,但事实可能并非如此。

要解决此问题,您需要明确指定 x 和 y 维度。这是创建 Points 元素的更新代码:

points = hv.Points(df, kdims=['id'], vdims=['value'])

关于第二个错误,

Legend
类似乎在Holoviews版本
1.14.0
中被删除,并被替换为
legend
方法。要为情节添加图例,您可以修改最后一行代码,如下所示:

scatter = points.opts(color='blue', size=5, show_grid=True, legend_position='top_left')
scatter.legend(['Value'])

编辑2:

这是我的全息视图版本:

$ pip show holoviews

Name: holoviews
Version: 1.15.4

尝试以下代码:

import pandas as pd
import holoviews as hv
from holoviews import opts

hv.extension('bokeh')

df = pd.DataFrame({'id': ['a', 'b', 'c'], 'value': [1, 2, 3]})

points = hv.Points(data=df, kdims=['id', 'value'])

scatter = hv.Scatter(data=df, kdims=['id'], vdims=['value'])

scatter.opts(opts.Scatter(size=10, color='red', legend_position='top_left'))

scatter * points

这是它的样子:

© www.soinside.com 2019 - 2024. All rights reserved.