Holoviews 按分类数据散点图颜色
Holoviews scatter plot color by categorical data
我一直在努力了解如何完成绘制两个数据集的这一非常简单的任务,每个数据集都具有不同的颜色,但我在网上找到的任何东西似乎都无法做到这一点。这是一些示例代码:
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。是的,我知道我可以拆分数据并叠加两个散点图,这会给出不同的颜色。但肯定有一种方法可以根据分类数据来实现这一点。
这可能有帮助: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 中创建每个类别具有不同颜色的散点图,如下所示。都是优雅的一行字:
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'])
结果图:
如果你想直接使用我的示例,你需要以下示例数据:
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),
})
额外的:
我觉得有趣的是 这个问题基本上有 2 个解决方案。
您可以使用 category_col 创建一个 hv.Scatter() 作为额外的 vdim,它提供颜色或者 2 个单独的散点图,它们由 hv.NdOverlay() 放在一起。
在后端,hv.Scatter() 解决方案将如下所示:
:Scatter [col1] (col2,category_col)
hv.NdOverlay() 后端看起来像这样:
:NdOverlay [category_col] :Scatter [col1] (col2)
我一直在努力了解如何完成绘制两个数据集的这一非常简单的任务,每个数据集都具有不同的颜色,但我在网上找到的任何东西似乎都无法做到这一点。这是一些示例代码:
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。是的,我知道我可以拆分数据并叠加两个散点图,这会给出不同的颜色。但肯定有一种方法可以根据分类数据来实现这一点。
这可能有帮助: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 中创建每个类别具有不同颜色的散点图,如下所示。都是优雅的一行字:
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'])
结果图:
如果你想直接使用我的示例,你需要以下示例数据:
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),
})
额外的:
我觉得有趣的是 这个问题基本上有 2 个解决方案。
您可以使用 category_col 创建一个 hv.Scatter() 作为额外的 vdim,它提供颜色或者 2 个单独的散点图,它们由 hv.NdOverlay() 放在一起。
在后端,hv.Scatter() 解决方案将如下所示:
:Scatter [col1] (col2,category_col)
hv.NdOverlay() 后端看起来像这样:
:NdOverlay [category_col] :Scatter [col1] (col2)