Holoviews图表在组合和输出时共享轴标签

11
我正在使用Holoviews构建图表仪表板。其中一些图表的y轴有百分比,而其他图表则有总和/计数等。当我尝试将所有创建的图表输出到html文件时,所有图表都会更改其y轴以匹配图表列表中第一个图表的轴。
例如: - 图表1为总和,值从0到1000 - 图表2和图表3是百分比
当我在Holoviews中组合这些图表时: Charts = Chart 1 + Chart 2 + Chart 3
图表2和图表3的y轴变成与图表1相同。
请问为什么会出现这种情况?如何修复它,使得所有图表保持各自的轴对其所要表示的内容相关呢?
谢谢!

哦,还有一件事。如果你在 stackoverflow 上提出一个新问题,请尝试添加一个代码示例,就像我在我的回答中给出的那个一样。这真的有助于弄清楚你的精确问题。 - Sander van den Oord
3个回答

10

如果y轴的名称相同,则会发生这种情况。
如果您想让每个图都有自己独立的x轴和y轴,则需要使用选项axiswise=True。

在holoviews FAQ中有关于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。操作步骤如下:
安装最新的holoviews、hvplot、panel、datashader和param的git版本


嗨,桑德,我在想,如果我使用“.plot”创建了我的Holoview图表,我是否能够做同样的事情? - Amen_90
1
你试过了吗? :) 你确实可以这样做:(df1.plot.scatter(x='x', y='y') + df2.plot.scatter(x='x', y='y')).opts(opts.Scatter(axiswise=True)) - Sander van den Oord
2
但说实话,我更希望你使用:import hvplot.pandas; 然后:(df1.hvplot.scatter(x='x', y='y') + df2.hvplot.scatter(x='x', y='y')).opts(opts.Scatter(axiswise=True)) 这样你就使用了 .hvplot() 而不是 .plot(),这基本上就是当你将绘图后端设置为 holoviews 时所做的。你真的应该查看一下:https://hvplot.holoviz.org/ Hvplot 才是真正被使用的。 - Sander van den Oord
非常感谢Sander,这个可行!是的,未来我一定会的!我已经在这个项目中使用.plot取得了相当大的进展!这真的很棒,这意味着我不必重新开始我已经完成的数小时的清理和透视工作!=) - Amen_90

4
桑德的回答是正确的,并且可以解决您的具体问题,但在这种情况下,它可能没有解决根本原因。HoloViews仅链接相同的轴,而且听起来您正在每个图中在y轴上绘制不同的量。在这种情况下,真正的解决方法是为每个图的y轴输入一个真实名称,这个名称应该能够将其与其他可能要在另一个显示的绘图中绘制在y轴上的内容区分开来。这样一来,不仅HoloViews不会再错误地链接轴,而且您绘图的查看者也能够看出每个图正在显示不同的内容。

谢谢您的回复!只有一个简短的额外问题。在使用'holoviews'作为后端的情况下,上面的代码是否有效?在这种情况下似乎无法使代码正常工作。 - Amen_90
是的,这种行为应该在HoloViews支持的所有绘图库中保持一致。如果您发现问题,请制作一个小例子并在https://github.com/holoviz/holoviews上提交问题。 - James A. Bednar
嗨,詹姆斯。感谢你的解释。但是Holoview的这种行为对我来说没有意义。为什么Holoviews会根据轴名称决定轴共享?最终用户可能正在绘制完全独立的图形,但具有相同的轴名称。轴链接或共享应该只能通过额外的参数实现。顺便说一下,除非我将它们包装在pn.row或pn.Column中,否则我没有看到任何轴链接。 - Enis Arik
HoloViews是一个高级库,基于这样的思想构建:当您声明语义相关信息(如数据的维度标签和单位)时,这些信息将在整个可视化过程中得到尊重。 - James A. Bednar
1
因此,如果您创建了共享相同坐标轴的两个图形,然后将它们放在一个布局中并排放置,HoloViews会链接这两个轴,假设您想要比较绘图A中的数据和绘图B中的数据。否则,为什么它们会在同一布局中呢?您始终可以关闭自动链接,但库被设计为尊重您声明的信息。 - James A. Bednar

4

我尝试过设置xlim和ylim,设置axiswise=True等许多方法均无法解决问题。

最终解决问题的是设置your_layout.opts(shared_axes=False)

更多信息请点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接