Plotly:如何更改迹线的 z 顺序

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

我的 Plotly.express 和 Plotly.graph_objects 图的显示顺序有问题。我的散点图绘制在灰色阴影连续错误前面。 我尝试通过更新Fig.data数组中的每个痕迹位置来手动更改痕迹的顺序,但无济于事。
我想将散点图强制到后面/最低的 z 级别。

有什么办法可以让黑线前面/下面的阴影区域变灰吗?

import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
import plotly.express as px
pio.renderers.default='browser'

df3 = pd.read_csv('filename.csv')
fig1 = px.scatter(df3, x="height_diff", y="flow_speed",
                 trendline="ols",
                 trendline_color_override = 'crimson',
                 template='plotly',
                 color_continuous_scale='Viridis',
                 color=np.random.randn(32145),
                 title='Linear Regression, HYCOM GOFS3.1, 2010-2020, 3hourly mean height difference vs. 3hourly mean Florida Current flow speed'
                 )



fig1.add_traces(px.line(df3, x="hgt_roll_avg", y="flow_roll_avg",color_discrete_sequence=['black']).data)
#fig2 = px.line(df3, x="hgt_roll_avg", y="flow_roll_avg",color_discrete_sequence=['black'])
#fig3 = go.Figure(data=fig1.data + fig.data, layout = fig1.layout)
fig1.update_layout(coloraxis_showscale=False,colorscale=dict(diverging = 'Viridis'))
fig1.add_traces([
    go.Scatter(
        name='Upper Bound',
        x=df3['hgt_roll_avg'],
        y=df3['flow_roll_avg']+df3['std'],
        mode='lines',
        marker=dict(color="#444"),
        line=dict(width=1),
        showlegend=False
    ),
    go.Scatter(
        name='Lower Bound',
       x=df3['hgt_roll_avg'],
       y=df3['flow_roll_avg']-df3['std'],
        marker=dict(color="#444"),
        line=dict(width=1),
        mode='lines',
        fillcolor='rgba(68, 68, 68, 0.3)',
        fill='tonexty',
        showlegend=False
    )
])
fig1.show()```
python pandas plotly plotly-express
2个回答
1
投票

解决方案: 仅使用 PLOTLY.GRAPH_OBJECT 跟踪进行重建。 [1]:https://i.stack.imgur.com/iK9gK.png


fig1 = go.Figure()
fig1.add_traces([
    go.Scatter(
        name='scatter',
        x=df3['height_diff'],
        y=df3['flow_speed'],
        mode='markers',
        marker=dict(color=np.random.randn(32145),colorscale='Viridis'),
        showlegend=False
    ),
    go.Scatter(
                  x=df4['height_diff'],
                  y=df4['bestfit'],
                  mode='lines',
                  marker=go.Marker(color='crimson'),
                  showlegend=False
                  )]) 

fig1.add_traces([
    go.Scatter(
        name='Upper Bound',
        x=df3['hgt_roll_avg'],
        y=df3['flow_roll_avg']+df3['std'],
        mode='lines',
        marker=dict(color="#444"),
        line=dict(width=1),
        showlegend=False
    ),
    go.Scatter(
        name='Lower Bound',
       x=df3['hgt_roll_avg'],
       y=df3['flow_roll_avg']-df3['std'],
        marker=dict(color="#444"),
        line=dict(width=1),
        mode='lines',
        fillcolor='rgba(68, 68, 68, 0.3)',
        fill='tonexty',
        showlegend=False
    ),
    go.Scatter(
        x=df3['hgt_roll_avg'],
        y=df3['flow_roll_avg'],
        mode='lines',
        marker=dict(color="black"),
        line=dict(width=1),
        showlegend=False
    )
])
fig1.show()

0
投票

一种解决方案是使用

go.Scattergl
而不是
px.scatter
作为您想要显示在顶部的迹线。

您出现跟踪绘制顺序与代码中的顺序不匹配的行为的原因是,Plotly 首先按照添加到 fig

 的顺序绘制 
常规跟踪然后按照添加到plotly.express.scatter的顺序绘制
使用WebGL绘图引擎
创建的轨迹(通过
fig
创建的轨迹)。

因此,需要明确的是,使用 WebGL 引擎创建的任何轨迹都将绘制在任何常规轨迹之上,例如

go.Scatter
,即使此类轨迹被添加到
fig
之后WebGL 轨迹。

在您的情况下,这条线是罪魁祸首,因为它是在稍后添加的

go.Scatter
迹线之上绘制的。

fig1 = px.scatter(df3, x="height_diff", y="flow_speed", ...)

如果您将所有

go.Scatter
跟踪更改为
go.Scattergl
,那么您在代码中添加每条跟踪的顺序将被保留,因为每条跟踪都将使用 WebGL 绘图引擎进行。

或者,您可以将

px.scatter
更改为
go.Scatter
,以便 WebGL 绘图引擎不会使用任何痕迹,如您在答案中所示。

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