回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我刚刚开始HoloView。我的问题是关于自定义直方图,但我也分享了一个完整的例子,因为它可能有助于其他新手查看,因为Holoviews的文档非常全面,但可能会非常多</p>
<p>我在文本文件中加载了许多时间序列作为数据帧,其中:</p>
<p>每个文件都针对特定的位置
在每个地点收集了大约10个时间序列,每个时间序列大约有15000个点
我正在构建一个小的交互式工具,其中可以使用一个选择器来选择位置/数据帧,然后使用另一个选择器从10个时间序列中选择3个一起绘制</p>
<p>我的目标是允许链接缩放(x和y比例)。问题和代码将集中在工具的这一方面。
不幸的是,我不能分享我正在使用的实际数据,因为它是专有的,但我创建了3个随机游动,具有与实际数据一致的特定数据范围</p>
<pre><code>## 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
</code></pre>
<p>第一块图仅用于绘制数据,并通过设计说明其中一个随机游动与其他两个随机游动的范围不同:</p>
<pre><code>data_df.hvplot(x='x',y=['rand1','rand2','rand3'],value_label='y',width=800,height=400)
</code></pre>
<p><a href="https://i.stack.imgur.com/BnoQr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/BnoQr.png" alt="hvplot"/></a></p>
<p>因此,尽管hvplot子地块可以开箱即用(用于链接),但范围不同,因此缩放比例不太合适:</p>
<pre><code>data_df.hvplot(x='x',y=['rand1','rand2','rand3'],
value_label='y',subplots=True,width=800,height=200).cols(1)
</code></pre>
<p><a href="https://i.stack.imgur.com/5kNpf.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5kNpf.gif" alt="subplots"/></a></p>
<p>因此,我的第一次尝试是改编文档中<a href="http://holoviews.org/user_guide/Linked_Brushing.html" rel="nofollow noreferrer">Linked brushing</a>的基于Python的点示例:</p>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/THYZ4.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/THYZ4.gif" alt="Points"/></a></p>
<p>这已经是一个惊人的结果,20分钟的努力</p>
<p>然而,我真正想要的是绘制一条曲线而不是点,并且还可以看到一个直方图,因此我调整了理解语法来处理曲线(在阅读了文档页面<a href="https://holoviews.org/user_guide/Applying_Customizations.html" rel="nofollow noreferrer">Applying customization</a>和<a href="http://holoviews.org/user_guide/Composing_Elements.html" rel="nofollow noreferrer">Composing elements</a>):</p>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/IGzoB.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/IGzoB.gif" alt="lines"/></a></p>
<p>这几乎正是我想要的。但是我仍然在为<code>opts</code>语法的不同层次而挣扎。
<strong>问题1:根据上一个代码块的理解,如何使直方图与曲线共享颜色?</strong></p>
<p>现在,假设我想<code>rasterize</code>绘制图(尽管我认为在这种情况下,15000个点还不是很必要),我尝试用<code>Points</code>修改第一个示例:</p>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/eWmy5.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/eWmy5.png" alt="rasterized"/></a>
这是一个不错的开始,但我还是很难选择/定制</p>
<p><strong>问题2:在上面的cod块中,我将如何传递颜色映射(它不像现在那样工作),以及如何使直方图像前一种情况一样反映数据值(并且具有正确的颜色映射)?</strong></p>
<p>谢谢大家!</p>