假设我有以下数据框:
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)的图例?
谢谢!
您可以使用
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轴。您可以调整这些设置以匹配您想要的情节。
第一个错误的原因是 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'])
这是我的全息视图版本:
$ 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
这是它的样子: