用全息图绘制多条线
Plot multiple lines with holoviews
我有一个看起来像这样的 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)
得到的dataframe如下:
我想用 Holoviews 做的是为每个 id 画一条线。所以 'Order' 在 x 轴上,'Cumulative' 在 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' )
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值之间切换:
另一种方法是使用覆盖从曲线列表构建图像。下面的代码对您的数据框进行了子选择。第一列将用作 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'
)
生成下图:
我有一个看起来像这样的 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)
得到的dataframe如下:
我想用 Holoviews 做的是为每个 id 画一条线。所以 'Order' 在 x 轴上,'Cumulative' 在 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' )
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值之间切换:
另一种方法是使用覆盖从曲线列表构建图像。下面的代码对您的数据框进行了子选择。第一列将用作 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'
)
生成下图: