python - Holoviews 按分类数据散点图颜色

标签 python holoviews hvplot

我一直在尝试了解如何完成绘制两个数据集(每个数据集具有不同颜色)这一非常简单的任务,但我在网上发现的任何内容似乎都无法做到这一点。这是一些示例代码:

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 数据集,相同类型的数据。

为什么本来应该如此简单的事情却如此晦涩难懂?

附注是的,我知道我可以分割数据并叠加两个散点图,这会给出不同的颜色。但肯定有一种方法可以基于分类数据来实现这一目标。

最佳答案

您可以在 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创建一个hv.Scatter()作为额外的vdim,它提供颜色或者由hv.NdOverlay()组合在一起的2个单独的散点图。

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

:Scatter [col1] (col2,category_col)


hv.NdOverlay() 后端如下所示:

:NdOverlay [category_col] :Scatter [col1] (col2)

关于python - Holoviews 按分类数据散点图颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484779/

相关文章:

python - python 中具有多个循环和 if 语句的列表理解

python - 在全息 View 中自定义工具提示

python - 如何在 Databricks 上使用 HoloViews/hvPlot

python - 如何在 hvPlot 图中禁用科学记数法?

python - 模拟具有特定返回值的实例方法?

python - 在 django 项目中生成此日志文件结构所需的建议

python - 使用 Pandas 数据框绘制 Holoviews.Image

python - 尝试通过 pip 安装 MySQL-python 时找不到 Visual C++ 2010 Redistributable

python - 如何旋转 x 标签或 y 标签? (hvplot 或全息图)