Plotly:如何使用 plotly express 在次要 y 轴上绘制

问题描述 投票:0回答:2

如何利用 plotly.express 在一个 Pandas 数据帧的两个 yaxis 上绘制多条线?

我发现这对于绘制包含特定子字符串的所有列非常有用:

    fig = px.line(df, y=df.filter(regex="Linear").columns, render_mode="webgl")

因为我不想遍历我所有过滤的列并使用类似的东西:

    fig.add_trace(go.Scattergl(x=df["Time"], y=df["Linear-"]))

在每次迭代中。

python express plotly yaxis
2个回答
54
投票

我花了一些时间来解决这个问题,但我觉得这对某些人可能有用。

# import some stuff
import plotly.express as px
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np

# create some data
df = pd.DataFrame()
n = 50
df["Time"] = np.arange(n)
df["Linear-"] = np.arange(n)+np.random.rand(n)
df["Linear+"] = np.arange(n)+np.random.rand(n)
df["Log-"] = np.arange(n)+np.random.rand(n)
df["Log+"] = np.arange(n)+np.random.rand(n)
df.set_index("Time", inplace=True)

subfig = make_subplots(specs=[[{"secondary_y": True}]])

# create two independent figures with px.line each containing data from multiple columns
fig = px.line(df, y=df.filter(regex="Linear").columns, render_mode="webgl",)
fig2 = px.line(df, y=df.filter(regex="Log").columns, render_mode="webgl",)

fig2.update_traces(yaxis="y2")

subfig.add_traces(fig.data + fig2.data)
subfig.layout.xaxis.title="Time"
subfig.layout.yaxis.title="Linear Y"
subfig.layout.yaxis2.type="log"
subfig.layout.yaxis2.title="Log Y"
# recoloring is necessary otherwise lines from fig und fig2 would share each color
# e.g. Linear-, Log- = blue; Linear+, Log+ = red... we don't want this
subfig.for_each_trace(lambda t: t.update(line=dict(color=t.marker.color)))
subfig.show()

技巧

subfig.for_each_trace(lambda t: t.update(line=dict(color=t.marker.color)))

我从 nicolaskruchten 那里得到:https://stackoverflow.com/a/60031260


1
投票

谢谢derflo和vestland!我真的很想使用 Plotly Express 而不是双轴图形对象来更轻松地处理具有大量列的 DataFrame。我把它放到了一个函数中。 Data1/2 可以很好地用作 DataFrame 或 Series。

import plotly.express as px
from plotly.subplots import make_subplots
import pandas as pd

def plotly_dual_axis(data1,data2, title="", y1="", y2=""):
    # Create subplot with secondary axis
    subplot_fig = make_subplots(specs=[[{"secondary_y": True}]])

    #Put Dataframe in fig1 and fig2
    fig1 = px.line(data1)
    fig2 = px.line(data2)
    #Change the axis for fig2
    fig2.update_traces(yaxis="y2")

    #Add the figs to the subplot figure
    subplot_fig.add_traces(fig1.data + fig2.data)

    #FORMAT subplot figure
    subplot_fig.update_layout(title=title, yaxis=dict(title=y1), yaxis2=dict(title=y2))

    #RECOLOR so as not to have overlapping colors
    subplot_fig.for_each_trace(lambda t: t.update(line=dict(color=t.marker.color)))


    return subplot_fig

更新:

这非常适合创建双轴图,但我也想指出网格线和零点的行为。这些 y 轴是完全独立的。所以默认情况下,零点不会对齐(见红框),网格线也不会对齐:

在应用布局时,您可以通过在 yaxis 字典中使用

rangemode = 'tozero'
来相当容易地对齐零。请参阅layout-yaxis Plotly 文档。但是,如果您有负值,这将不起作用。

plotly 的好人目前正在研究网格线对齐。在this Github repo中有一些很好的例子。

© www.soinside.com 2019 - 2024. All rights reserved.