在 hvplot 中自定义标记列表
Customizing marker lists in hvplot
我有一个像这样的数据集:
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
我想要一个 A 与 B 的散点图,其中标记由 'group' 列着色,标记类型基于 'category' 列,标记大小基于 'sizes'列。
以下...
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes')
scatter
...让我得到正确的着色,而当我得到 "Cannot declare mapping for 'size' option"(知道为什么吗?)时,我实际上得到了正确的标记大小。
但是,我似乎无法获得基于 'category' 列的标记类型。
我试过了...
markers=['x' if zone=='DD' else 'o' for zone in df['category']]
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker=markers)
scatter
... 但它会将所有点转换为十字(x),将 none 转换为圆(o)。
我也试过添加一列:
df['markers'] = np.random.choice(['x','o'],size=10)
然后...
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker='markers')
scatter
...但这会引发错误并且根本不起作用。
使用 hvplot 按变量自定义标记的正确方法是什么?
感谢您的建议。
编辑 1:
现在我也尝试使用 holoviews.dim, 1. 与 holoviews:
hvd = hv.Dataset(df,['A'],['B','markers'])
markers_custom = hv.dim('markers').apply(hvd)
hvd.to.scatter().opts(marker=marker)
然后 2. 再次使用 hvplot:
scatter = df.hvplot.scatter(x='A',y='B',marker=markers_custom)
我得到:
TypeError [Call holoviews.ipython.show_traceback() for details]
unhashable type: 'numpy.ndarray'
...在这两种情况下。
它适用于我的自定义列:
import numpy as np, pandas as pd, holoviews as hv, hvplot.pandas
hv.extension("bokeh")
np.random.seed(3)
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
df['marker'] = df.category.replace("DD","x").replace("CC","circle")
df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker="marker")
以上方法有效,但我们强烈建议不要转换您的实际数据,除非您确实需要,这就是我们引入所谓的 dim
表达式的原因,您可以阅读有关 here 的内容。这些使您无需接触数据即可表达复杂的转换,例如在你的例子中你可以这样做:
import holoviews as hv
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
marker = hv.dim("category").categorize({'DD': 'x'}, default='circle')
df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker=marker)
此处的转换基本上采用类别列并通过将所有 'DD' 值映射到 'x' 并将所有其他值映射到 'circle' 来转换它。
我有一个像这样的数据集:
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
我想要一个 A 与 B 的散点图,其中标记由 'group' 列着色,标记类型基于 'category' 列,标记大小基于 'sizes'列。
以下...
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes')
scatter
...让我得到正确的着色,而当我得到 "Cannot declare mapping for 'size' option"(知道为什么吗?)时,我实际上得到了正确的标记大小。
但是,我似乎无法获得基于 'category' 列的标记类型。
我试过了...
markers=['x' if zone=='DD' else 'o' for zone in df['category']]
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker=markers)
scatter
... 但它会将所有点转换为十字(x),将 none 转换为圆(o)。
我也试过添加一列:
df['markers'] = np.random.choice(['x','o'],size=10)
然后...
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker='markers')
scatter
...但这会引发错误并且根本不起作用。
使用 hvplot 按变量自定义标记的正确方法是什么?
感谢您的建议。
编辑 1: 现在我也尝试使用 holoviews.dim, 1. 与 holoviews:
hvd = hv.Dataset(df,['A'],['B','markers'])
markers_custom = hv.dim('markers').apply(hvd)
hvd.to.scatter().opts(marker=marker)
然后 2. 再次使用 hvplot:
scatter = df.hvplot.scatter(x='A',y='B',marker=markers_custom)
我得到:
TypeError [Call holoviews.ipython.show_traceback() for details] unhashable type: 'numpy.ndarray'
...在这两种情况下。
它适用于我的自定义列:
import numpy as np, pandas as pd, holoviews as hv, hvplot.pandas
hv.extension("bokeh")
np.random.seed(3)
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
df['marker'] = df.category.replace("DD","x").replace("CC","circle")
df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker="marker")
以上方法有效,但我们强烈建议不要转换您的实际数据,除非您确实需要,这就是我们引入所谓的 dim
表达式的原因,您可以阅读有关 here 的内容。这些使您无需接触数据即可表达复杂的转换,例如在你的例子中你可以这样做:
import holoviews as hv
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
marker = hv.dim("category").categorize({'DD': 'x'}, default='circle')
df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker=marker)
此处的转换基本上采用类别列并通过将所有 'DD' 值映射到 'x' 并将所有其他值映射到 'circle' 来转换它。