Holoviews通过分类数据分散绘图颜色

时间:2019-06-06 20:36:52

标签: python holoviews

我一直在试图了解如何完成绘制两个数据集(每个数据集具有不同的颜色)这一非常简单的任务,但是我在网上发现没有任何事情可以做到。这是一些示例代码:

import pandas as pd
import numpy as np
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

ds1x = np.random.randn(1000)
ds1y = np.random.randn(1000)
ds2x = np.random.randn(1000) * 1.5
ds2y = np.random.randn(1000) + 1

ds1 = pd.DataFrame({'dsx' : ds1x, 'dsy' : ds1y})
ds2 = pd.DataFrame({'dsx' : ds2x, 'dsy' : ds2y})
ds1['source'] = ['ds1'] * len(ds1.index)
ds2['source'] = ['ds2'] * len(ds2.index)

ds = pd.concat([ds1, ds2])

目标是在一个框架中生成两个数据集,并使用分类列跟踪源。然后,我尝试绘制散点图。

scatter = hv.Scatter(ds, 'dsx', 'dsy')
scatter

这按预期工作。但是我似乎无法理解如何基于source列为两个数据集着色。我尝试了以下方法:

scatter = hv.Scatter(ds, 'dsx', 'dsy', color='source')

scatter = hv.Scatter(ds, 'dsx', 'dsy', cmap='source')

都抛出警告,没有颜色。我尝试过:

scatter = hv.Scatter(ds, 'dsx', 'dsy')
scatter.opts(color='source')

哪个抛出错误。我尝试将其转换为相同类型的Holoviews数据集。

为什么某些东西应该如此简单,如此晦涩?

P.S。是的,我知道我可以拆分数据并覆盖两个散点图,这将提供不同的颜色。但是肯定有一种方法可以基于分类数据来完成此任务。

2 个答案:

答案 0 :(得分:1)

这可能会有所帮助:http://holoviews.org/user_guide/Style_Mapping.html

具体来说,您不能在未声明,完全不模糊的维度上使用dim变换:)

scatter = hv.Scatter(ds, 'dsx', ['dsy', 'source']
).opts(color=hv.dim('source').categorize({'ds1': 'blue', 'ds2': 'orange'}))

应该让您到达那里(我自己没有测试过)。

相关:

Holoviews color per category

Overlay NdOverlays while keeping color / changing marker

答案 1 :(得分:1)

您可以在Holoviews中创建散点图,每个类别使用不同的颜色,如下所示。他们都是优雅的一线客:

1),只需在数据帧上使用 .hvplot()即可。

import hvplot
import hvplot.pandas

df.hvplot(kind='scatter', x='col1', y='col2', by='category_col')

# If you are using bokeh as a backend you can also just use 'color' parameter.
# I like this one more because it creates a hv.Scatter() instead of hv.NdOverlay() 
# 'category_col' is here just an extra vdim, which is used for colors
df.hvplot(kind='scatter', x='col1', y='col2', color='category_col')

2),如下所示创建 NdOverlay 散点图:

import holoviews as hv

hv.Dataset(df).to(hv.Scatter, 'col1', 'col2').overlay('category_col')

3)或略微调整了多普勒的答案,将“ category_col”设置为额外的vdim ,然后将其用于颜色:

hv.Scatter(
    data=df, kdims=['col1'], vdims=['col2', 'category_col'],
).opts(color='category_col', cmap=['blue', 'orange'])

结果图: holoviews hvplot scatter plot different color per category
如果您想直接使用我的示例,则需要以下示例数据:

import numpy as np
import pandas as pd

# create sample dataframe
df = pd.DataFrame({
    'col1': np.random.normal(size=30),
    'col2': np.random.normal(size=30),
    'category_col': np.random.choice(['category_1', 'category_2'], size=30),
})

额外:

我发现有趣的是,基本上有两种解决方案
您可以使用category_col作为额外的vdim创建hv.Scatter(),以提供颜色,或者通过hv.NdOverlay()将2个单独的散点图放在一起。

在后端,hv.Scatter()解决方案将如下所示:

  

:散点[col1](col2,category_col)


而hv.NdOverlay()后端看起来像这样:

  

:NdOverlay [category_col]:散点图[col1](col2)