Holoviews 图表在组合和输出时共享轴
Holoviews charts sharing axis when combined and outputted
我正在使用 Holoviews 构建图表仪表板。其中一些图表在 y 轴上有百分比,而其他图表有 sums/counts 等。当我尝试将我创建的所有图表输出到一个 html 文件时,所有图表都会更改它们的 y 轴以匹配我的图表列表中第一个图表的轴。
例如:
- 图表 1 是总和,值从 0 到 1000
- 图表 2 是 %
- 图表 3 是一个 %
当我使用以下方法在全息视图中组合这些图表时:
- 图表 = 图表 1 + 图表 2 + 图表 3
图表 2 和 3 的 y 轴与图表 1 相同。
有谁知道为什么会这样以及我该如何解决它以便所有图表保持各自的轴与它们试图表示的内容相关。
谢谢!
当 y 轴名称相同时会发生这种情况。
如果您希望每个绘图都有自己独立的 x 轴和 y 轴,则需要使用选项 axiswise=True。
在 holoviews 常见问题解答中有对 axiswise 的简短引用:
https://www.holoviews.org/FAQ.html
这是我检查过并有效的代码示例:
# import libraries etc.
import numpy as np
import pandas as pd
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')
# create some sample data
df1 = pd.DataFrame({
'x': np.random.rand(10),
'y': np.random.rand(10),
})
df2 = pd.DataFrame({
'x': np.random.rand(10) * 10,
'y': np.random.rand(10) * 10,
})
# set axiswise=True so that every plot gets its own independent x- and y-axis
plot1 = hv.Scatter(df1).opts(axiswise=True)
plot2 = hv.Scatter(df2).opts(axiswise=True)
plot1 + plot2
或者您可以这样做:
plot1 = hv.Scatter(df1)
plot2 = hv.Scatter(df2)
(plot1 + plot2).opts(opts.Scatter(axiswise=True))
如果这不起作用,当您尝试我的代码示例时,您可能需要升级到最新版本的 holoviews。这可以按如下方式完成:
Sander 的回答是正确的,可以解决您的具体问题,但在这种情况下,它可能无法解决根本原因。 HoloViews 只有 links 个相同的轴,听起来你在每个图中的 y 轴上绘制了不同的数量。在这种情况下,真正的解决方法是为每个图的 y 轴输入一个真实名称,以区别于您可能想要在您显示的其他图的 y 轴上绘制的其他内容。这样,不仅 HoloViews 不再 link 坐标轴不当,您的绘图的查看者将能够分辨出每个绘图显示不同的东西。
我试过设置 xlim 和 ylim,设置 axiswise=True
和许多其他设置都没有成功。
最终解决问题的是设置your_layout.opts(shared_axes=False)
。
阅读更多here。
我正在使用 Holoviews 构建图表仪表板。其中一些图表在 y 轴上有百分比,而其他图表有 sums/counts 等。当我尝试将我创建的所有图表输出到一个 html 文件时,所有图表都会更改它们的 y 轴以匹配我的图表列表中第一个图表的轴。
例如:
- 图表 1 是总和,值从 0 到 1000
- 图表 2 是 %
- 图表 3 是一个 %
当我使用以下方法在全息视图中组合这些图表时:
- 图表 = 图表 1 + 图表 2 + 图表 3
图表 2 和 3 的 y 轴与图表 1 相同。
有谁知道为什么会这样以及我该如何解决它以便所有图表保持各自的轴与它们试图表示的内容相关。
谢谢!
当 y 轴名称相同时会发生这种情况。
如果您希望每个绘图都有自己独立的 x 轴和 y 轴,则需要使用选项 axiswise=True。
在 holoviews 常见问题解答中有对 axiswise 的简短引用:
https://www.holoviews.org/FAQ.html
这是我检查过并有效的代码示例:
# import libraries etc.
import numpy as np
import pandas as pd
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')
# create some sample data
df1 = pd.DataFrame({
'x': np.random.rand(10),
'y': np.random.rand(10),
})
df2 = pd.DataFrame({
'x': np.random.rand(10) * 10,
'y': np.random.rand(10) * 10,
})
# set axiswise=True so that every plot gets its own independent x- and y-axis
plot1 = hv.Scatter(df1).opts(axiswise=True)
plot2 = hv.Scatter(df2).opts(axiswise=True)
plot1 + plot2
或者您可以这样做:
plot1 = hv.Scatter(df1)
plot2 = hv.Scatter(df2)
(plot1 + plot2).opts(opts.Scatter(axiswise=True))
如果这不起作用,当您尝试我的代码示例时,您可能需要升级到最新版本的 holoviews。这可以按如下方式完成:
Sander 的回答是正确的,可以解决您的具体问题,但在这种情况下,它可能无法解决根本原因。 HoloViews 只有 links 个相同的轴,听起来你在每个图中的 y 轴上绘制了不同的数量。在这种情况下,真正的解决方法是为每个图的 y 轴输入一个真实名称,以区别于您可能想要在您显示的其他图的 y 轴上绘制的其他内容。这样,不仅 HoloViews 不再 link 坐标轴不当,您的绘图的查看者将能够分辨出每个绘图显示不同的东西。
我试过设置 xlim 和 ylim,设置 axiswise=True
和许多其他设置都没有成功。
最终解决问题的是设置your_layout.opts(shared_axes=False)
。
阅读更多here。