6

我有一个看起来像这样的df:

data = {'Cumulative': {0: 4, 1: 18, 2: 24, 3: 24, 4: 4, 5: 20, 6: 32, 7: 42},  'Id': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 2},  'Order': {0: '1-1',   1: '1-2',   2: '1-3',   3: '1-4',   4: '1-1',   5: '1-2',   6: '1-3',   7: '1-4'},  'Period': {0: 1, 1: 2, 2: 3, 3: 4, 4: 1, 5: 2, 6: 3, 7: 4},  'Time': {0: '1-1',   1: '1-2',   2: '1-3',   3: '1-4',   4: '1-1',   5: '1-2',   6: '1-3',   7: '1-4'},  'Year': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}}

df = pd.DataFrame(data)

生成的数据框如下:

示例数据框

我想对 Holoviews 做的是为每个 id 绘制一条线。所以“订单”在 x 轴上,“累积”在 y 轴上,每个“Id”都有自己的线(所有颜色都相同)。这是我到目前为止所拥有的,但它并没有给我正确的结果。

%opts Curve [width=600 height=400 show_grid=True ] (color='indianred', alpha=0.5, line_width=1)

kdims=['Order' ] vdims = ['Cumulative',
            ] ds = hv.Dataset(df.sort_values(by=['Year','Period']), kdims=kdims, vdims= vdims)

ds.to(hv.Curve, ['Order'] ,'Cumulative' )
4

2 回答 2

4

HoloViews 只会知道已声明的维度。这意味着当您这样做时,hv.Dataset(df, kdims, vdims)它不知道“Id”列并且无法对其进行分组。这是我要做的:

%%opts Curve [width=600 height=400 show_grid=True ] (color='indianred', alpha=0.5, line_width=1)
ds = hv.Dataset(df).sort(['Year', 'Period'])
ds.to(hv.Curve, 'Order' ,'Cumulative', 'Id')

在这里,我们声明了没有任何显式 kdims 或 vdims 的数据集,这意味着我们可以使用 HoloViews 对数据进行排序,然后使用该.to方法绘制“Order”与“Cumulative”列的曲线,按“Id”列分组. 如果您想查看一张图上的所有曲线,只需将其更改为ds.to(hv.Curve, 'Order' ,'Cumulative', 'Id').overlay().

生成的图像如下,使用滑块在不同的 Id 值之间切换:

代码生成的图像

于 2018-02-18T20:46:59.743 回答
0

另一种方法是使用覆盖从曲线列表构建图像。下面的代码对您的数据框进行了子选择。第一列将用作 X 轴值,第二列将用作 y 轴值。

df.loc[df['Id']==1][['Period', 'Cumulative']]

然后创建需要绘制的曲线列表。这些不一定都是曲线,您可以根据需要混合和匹配。

# Specified individually  
list_of_curves = [
    hv.Curve(df.loc[df['Id']==1][['Period', 'Cumulative']], label='Id = 1'), 
    hv.Curve(df.loc[df['Id']==2][['Period', 'Cumulative']], label='Id = 2'), 
]

# As a list comprehension
list_of_curves = [hv.Curve(
    df.loc[df['Id']==the_id][['Period', 'Cumulative']], 
    label=f"Id = {the_id}"
) for the_id in [1,2]]

然后将此曲线列表传递给叠加层,并设置其选项。

hv.Overlay(list_of_curves).opts(
    height=300, 
    width=600,
    xlabel='Period', 
    ylabel='Cumulative', 
    title='Change in cumulative over period',
    legend_position='right'
)

产生下图:

由代码创建的图

于 2021-05-05T07:17:27.823 回答