Holoviews:如何为链接的时间序列曲线图自定义直方图
Holoviews: how to customize histogram for linked time series Curve plots
我刚刚开始使用 Holoviews。我的问题是关于自定义直方图,但我也分享了一个完整的示例,因为它可能对其他新手有所帮助,因为 Holoviews 的文档非常详尽,但可能会让人不知所措。
我在文本文件中有许多时间序列加载为 Pandas 数据帧,其中:
每个文件都有一个特定的位置
在每个位置收集了大约 10 个时间序列,每个时间序列大约有 15,000 个点
我正在构建一个小型交互式工具,其中一个选择器可用于选择位置/DataFrame,然后另一个选择器可以从 10 个时间序列中选择 3 个一起绘制。
我的目标是允许链接缩放(x 和 y 缩放)。问题和代码将集中在工具的这一方面。
不幸的是,我无法分享我正在使用的实际数据,因为它是专有的,但我创建了 3 个随机游走,其特定数据范围与实际数据一致。
## preliminaries ##
import pandas as pd
import numpy as np
import holoviews as hv
from holoviews.util.transform import dim
from holoviews.selection import link_selections
from holoviews import opts
from holoviews.operation.datashader import shade, rasterize
import hvplot.pandas
hv.extension('bokeh', width=100)
## create random walks (one location) ##
data_df = pd.DataFrame()
npoints=15000
np.random.seed(71)
x = np.arange(npoints)
y1 = 1300+2.5*np.random.randn(npoints).cumsum()
y2 = 1500+2*np.random.randn(npoints).cumsum()
y3 = 3+np.random.randn(npoints).cumsum()
data_df.loc[:,'x'] = x
data_df.loc[:,'rand1'] = y1
data_df.loc[:,'rand2'] = y2
data_df.loc[:,'rand3'] = y3
第一个块只是为了绘制数据并展示如何根据设计,其中一个随机游走具有与其他两个不同的范围:
data_df.hvplot(x='x',y=['rand1','rand2','rand3'],value_label='y',width=800,height=400)
因此,虽然 hvplot 子图开箱即用(用于链接),但范围不同,因此缩放比例不完全:
data_df.hvplot(x='x',y=['rand1','rand2','rand3'],
value_label='y',subplots=True,width=800,height=200).cols(1)
所以,我的第一次尝试是改编文档中 Linked brushing 中基于 Python 的点示例:
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
hv.Points(data_df, dim).opts(color=c)
for c, dim in zip(colors, [['x', d] for d in dims])
])
link_selections(layout).opts(opts.Points(width=1200, height=300)).cols(1)
对于 20 分钟的努力,这已经是一个了不起的结果!
但是,我真正想要的是绘制曲线而不是点,并且还可以看到直方图,因此我调整了理解语法以使用 Curve(在阅读文档页面 Applying customization, and Composing elements 之后):
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([hv.Curve(data_df,'x',dim).opts(height=300,width=1200,
color=c).hist(dim) for c,
dim in zip(colors,[d for d in dims])])
link_selections(layout).cols(1)
这几乎正是我想要的。但我仍然在为 opts
语法的不同层次而苦苦挣扎。
问题 1:根据上一个代码块的理解,如何使直方图与曲线共享颜色?
现在,假设我想要 rasterize
绘图(虽然我认为在这种情况下还没有必要使用 15,000 点),我尝试使用 Points
调整第一个示例:
cmaps = ['Blues', 'Greens', 'Reds']
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
shade(rasterize(hv.Points(data_df, dims),
cmap=c)).opts(width=1200, height = 400).hist(dims[1])
for c, dims in zip(cmaps, [['x', d] for d in dims])
])
link_selections(layout).cols(1)
这是一个不错的开始,但我再次与 options/customization.
作斗争
问题2:在上面的代码块中,我如何传递颜色图(它现在不起作用),以及如何使直方图像之前那样反映数据值案例(并且还有正确的颜色图)?
谢谢!
为了回答您第一个使直方图共享曲线颜色的问题,我已将 .opts(opts.Histogram(color=c))
添加到您的代码中。
当你有一个布局时,你可以像这样在布局内指定一个元素的选项。
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout(
[hv.Curve(data_df,'x',dim)
.opts(height=300,width=600, color=c)
.hist(dim)
.opts(opts.Histogram(color=c))
for c, dim in zip(colors,[d for d in dims])]
)
link_selections(layout).cols(1)
Sander 回答了如何为直方图着色,但对于另一个关于为数据着色图着色的问题,Datashader 使用颜色图而不是单一颜色渲染数据,因此参数命名为 cmap
而不是 color
。所以你在数据阴影情况下使用 cmap
是正确的,但是 (a) cmap
实际上是 shade
的参数(它对 rasterize
的输出进行颜色映射) , (b) 你并不真的需要 shade
,因为现在大多数情况下你可以让 Bokeh 进行颜色映射,在这种情况下 cmap
是一个选项而不是参数。示例:
from bokeh.palettes import Blues, Greens, Reds
cmaps = [Blues[256][200:], Greens[256][200:], Reds[256][200:]]
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
rasterize(hv.Points(data_df, ds)).opts(cmap=c,width=1200, height = 400).hist(dims[1])
for c, ds in zip(cmaps, [['x', d] for d in dims])
])
link_selections(layout).cols(1)
我刚刚开始使用 Holoviews。我的问题是关于自定义直方图,但我也分享了一个完整的示例,因为它可能对其他新手有所帮助,因为 Holoviews 的文档非常详尽,但可能会让人不知所措。
我在文本文件中有许多时间序列加载为 Pandas 数据帧,其中:
每个文件都有一个特定的位置 在每个位置收集了大约 10 个时间序列,每个时间序列大约有 15,000 个点 我正在构建一个小型交互式工具,其中一个选择器可用于选择位置/DataFrame,然后另一个选择器可以从 10 个时间序列中选择 3 个一起绘制。
我的目标是允许链接缩放(x 和 y 缩放)。问题和代码将集中在工具的这一方面。 不幸的是,我无法分享我正在使用的实际数据,因为它是专有的,但我创建了 3 个随机游走,其特定数据范围与实际数据一致。
## preliminaries ##
import pandas as pd
import numpy as np
import holoviews as hv
from holoviews.util.transform import dim
from holoviews.selection import link_selections
from holoviews import opts
from holoviews.operation.datashader import shade, rasterize
import hvplot.pandas
hv.extension('bokeh', width=100)
## create random walks (one location) ##
data_df = pd.DataFrame()
npoints=15000
np.random.seed(71)
x = np.arange(npoints)
y1 = 1300+2.5*np.random.randn(npoints).cumsum()
y2 = 1500+2*np.random.randn(npoints).cumsum()
y3 = 3+np.random.randn(npoints).cumsum()
data_df.loc[:,'x'] = x
data_df.loc[:,'rand1'] = y1
data_df.loc[:,'rand2'] = y2
data_df.loc[:,'rand3'] = y3
第一个块只是为了绘制数据并展示如何根据设计,其中一个随机游走具有与其他两个不同的范围:
data_df.hvplot(x='x',y=['rand1','rand2','rand3'],value_label='y',width=800,height=400)
因此,虽然 hvplot 子图开箱即用(用于链接),但范围不同,因此缩放比例不完全:
data_df.hvplot(x='x',y=['rand1','rand2','rand3'],
value_label='y',subplots=True,width=800,height=200).cols(1)
所以,我的第一次尝试是改编文档中 Linked brushing 中基于 Python 的点示例:
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
hv.Points(data_df, dim).opts(color=c)
for c, dim in zip(colors, [['x', d] for d in dims])
])
link_selections(layout).opts(opts.Points(width=1200, height=300)).cols(1)
对于 20 分钟的努力,这已经是一个了不起的结果!
但是,我真正想要的是绘制曲线而不是点,并且还可以看到直方图,因此我调整了理解语法以使用 Curve(在阅读文档页面 Applying customization, and Composing elements 之后):
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([hv.Curve(data_df,'x',dim).opts(height=300,width=1200,
color=c).hist(dim) for c,
dim in zip(colors,[d for d in dims])])
link_selections(layout).cols(1)
这几乎正是我想要的。但我仍然在为 opts
语法的不同层次而苦苦挣扎。
问题 1:根据上一个代码块的理解,如何使直方图与曲线共享颜色?
现在,假设我想要 rasterize
绘图(虽然我认为在这种情况下还没有必要使用 15,000 点),我尝试使用 Points
调整第一个示例:
cmaps = ['Blues', 'Greens', 'Reds']
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
shade(rasterize(hv.Points(data_df, dims),
cmap=c)).opts(width=1200, height = 400).hist(dims[1])
for c, dims in zip(cmaps, [['x', d] for d in dims])
])
link_selections(layout).cols(1)
问题2:在上面的代码块中,我如何传递颜色图(它现在不起作用),以及如何使直方图像之前那样反映数据值案例(并且还有正确的颜色图)?
谢谢!
为了回答您第一个使直方图共享曲线颜色的问题,我已将 .opts(opts.Histogram(color=c))
添加到您的代码中。
当你有一个布局时,你可以像这样在布局内指定一个元素的选项。
colors = hv.Cycle('Category10').values
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout(
[hv.Curve(data_df,'x',dim)
.opts(height=300,width=600, color=c)
.hist(dim)
.opts(opts.Histogram(color=c))
for c, dim in zip(colors,[d for d in dims])]
)
link_selections(layout).cols(1)
Sander 回答了如何为直方图着色,但对于另一个关于为数据着色图着色的问题,Datashader 使用颜色图而不是单一颜色渲染数据,因此参数命名为 cmap
而不是 color
。所以你在数据阴影情况下使用 cmap
是正确的,但是 (a) cmap
实际上是 shade
的参数(它对 rasterize
的输出进行颜色映射) , (b) 你并不真的需要 shade
,因为现在大多数情况下你可以让 Bokeh 进行颜色映射,在这种情况下 cmap
是一个选项而不是参数。示例:
from bokeh.palettes import Blues, Greens, Reds
cmaps = [Blues[256][200:], Greens[256][200:], Reds[256][200:]]
dims = ['rand1', 'rand2', 'rand3']
layout = hv.Layout([
rasterize(hv.Points(data_df, ds)).opts(cmap=c,width=1200, height = 400).hist(dims[1])
for c, ds in zip(cmaps, [['x', d] for d in dims])
])
link_selections(layout).cols(1)