【问题标题】:Can yaxis be dynamically added into an graph_objects Layout in plotly?可以将 yaxis 动态添加到 plotly 中的 graph_objects 布局中吗?
【发布时间】:2021-12-16 06:49:09
【问题描述】:

在我现在正在进行的实践培训中,有一个 python 脚本可以读取 CSV 文件并针对该文件的选定列进行绘图。然而,标题的选择是硬编码的,所以如果有人想使用脚本,他们必须操纵代码。我的任务是让它充满活力,例如。 G。脚本的用户可以通过控制台 (argparse) 选择任意数量的列,脚本会自动创建跟踪、创建布局、将两者添加到图形并将其导出到 html 文件中。

我已经设法完成了所有这些,除了布局部分。在脚本的当前(硬编码)状态下,有这些参数被传递给graph_objects.Layout 函数:

 layout = go.Layout(title=inFile,
                       plot_bgcolor='rgb(230, 230,230)', showlegend=True,
                       yaxis=dict(
                           title=df.columns[y1graph] # Note: 'ygraph' contains the index of the column
                       ),
                       yaxis2=dict(
                            title=df.columns[y2graph],
                            side='right',
                            overlaying='y'
                       ),
                       yaxis3=dict(
                            title=df.columns[y3graph],
                            side='right',
                            overlaying='y'
                       )
                    )

不幸的是,我还没有找到一种方法来使所有这些都动态化,以便根据所选列的数量添加“yaxis”参数。我也没有找到一种方法来为图表添加标题,使它们相互重叠并将它们放在右侧,就像go.Layout 一样。当然,有一种方法可以使用 plotly express 添加标题,但对于 overlayingside 参数,它对我来说并没有做同样的事情。

有什么想法吗?

请注意:这是我在 stackoverflow 上的第一个问题,所以如果我做错了什么,请指教!另外,如果我遗漏了重要信息,请告诉我。

【问题讨论】:

  • 您的问题可能因多种原因而被关闭。您缺少完整的 sn-p 和数据来重现您的问题,并且您在同一篇文章中提出了多个问题。因此,需要进行一些澄清。首先,这是您使用make_subplots 构建的情节吗?
  • 好的,我会尽力澄清一切。谢谢你的建议!原始脚本是使用 plotly.graph_objects 构建的。不幸的是,由于数据保护原因,我无法共享 CSV,我会询问官员是否允许我共享整个脚本。它的工作方式非常基本:首先,创建了三个跟踪变量,并将它们分配给 go.Scatter 调用。接下来,按照我在原始帖子中显示的方式创建布局。然后使用 go.Figure 创建一个图形,所有跟踪都作为数据与布局一起传递。
  • 我会尽快贴出整个代码。
  • Rob raymond 没有找到解决您问题的方法吗?

标签: python pandas plotly plotly.graph-objects


【解决方案1】:
  • 模拟一个 CSV,一个 20 列的数据框
  • 模拟用户选择要绘制的列(随机抽取 20 列中的 4 列)
  • 构建图形,为每个轨迹分配不同的 yaxis
  • 最后根据问题,动态配置y轴
import numpy as np
import plotly.express as px
import pandas as pd

# simulate a CSV, 20 columns...
df = pd.DataFrame(
    {
        chr(ord("A") + i): np.random.uniform(miny, miny + 200, 30)
        for i, miny in zip(range(20), np.random.randint(30, 3000, 20))
    }
)

# simulate user passing columns to plot...
cols = pd.Series(df.columns).sample(4).tolist()

# build figure with each trace using it's own yaxis
fig = px.line(df, y=cols).for_each_trace(
    lambda t: t.update(yaxis=f"y{cols.index(t.name)+1 if cols.index(t.name)>0 else ''}")
).update_layout(yaxis={"title":cols[0]})

# dynamically update yaxes...
fig.update_layout(
    {
        t.yaxis.replace("y", "yaxis"): {
            "title": t.name,
            "overlaying": "y",
            "side": "right",
            "position":1-(i/15)
        }
        for i,t in enumerate(fig.data)
        if t.yaxis != "y"
    }
).update_layout(xaxis={"domain":[0,1-(len(cols)*.05)]}) # give some space for additional yaxes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2016-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多