全息图散点图颜色

2024-04-25 00:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图理解如何完成这个非常简单的任务,即绘制两个数据集,每个数据集都有不同的颜色,但我在网上找到的东西似乎都做不到。下面是一些示例代码:

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])

目标是在一个帧中生成两个数据集,用一个分类列跟踪源。然后我试着画一个散点图。在

^{pr2}$

这和预期的一样。但我似乎不明白如何根据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数据集,同样的类型。在

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

是的,我知道我可以把数据分开,叠加两个散点图,这样就会有不同的颜色。但肯定有一种方法可以基于分类数据来实现这一点。在


Tags: 数据importsource颜色npdsrandompd
2条回答

您可以在全息图中创建一个散射图,每个类别有不同的颜色,如下所示。它们都是优雅的一句话:

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)通过创建n覆盖散点图,如下所示:

^{pr2}$

3)或doppler的答案稍作调整,将“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),
})

作为额外的:

我发现有趣的是,这个问题基本上有两种解决方案。
您可以创建高压散射()将分类列作为额外的vdim,提供颜色或2个单独的散点图,这些散点图由hv.N覆盖().

在后端高压散射()解决方案如下:

:Scatter [col1] (col2,category_col)


以及hv.N覆盖()后端如下所示:

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

这可能有帮助: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

相关问题 更多 >