[英]Python Plotly: Adding a horizontal line to a scatter plot that has multiple subplots
我有一個散點圖 plot 在 Plotly 儀表板上運行。 這是代碼:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import numpy as np
fig = make_subplots(rows=2, cols=3, vertical_spacing=0,
horizontal_spacing=0.05, shared_xaxes=True, shared_yaxes=False)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(20, 40, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x1', yaxis='y1'), row=1, col=1)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(100, 140, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x2', yaxis='y2'), row=1, col=2)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(20, 40, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x3', yaxis='y3'), row=1, col=3)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(20, 40, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x4', yaxis='y4'), row=2, col=1)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(100, 140, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x5', yaxis='y5'), row=2, col=2)
fig.add_trace(go.Scatter(x=list(range(40)), y=np.random.randint(20, 40, 40), line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x6', yaxis='y6'), row=2, col=3)
fig.add_shape(go.layout.Shape(type='line', yref='y3', xref='x3', x0=0, x1=30, y0=30, y1=30,
line=dict(color='red', width=3)))
fig.update_layout({'plot_bgcolor': "#21201f", 'paper_bgcolor': "#21201f", 'legend_orientation': "h"},
legend=dict(y=1, x=0),
font=dict(color='#dedddc'), dragmode='pan', hovermode='x unified',
margin=dict(b=20, t=0, l=0, r=40))
fig.update_xaxes(showgrid=False, zeroline=False, rangeslider_visible=False, showticklabels=False,
showspikes=True, spikemode='across', spikesnap='data', showline=False, spikedash='dash',
spikecolor='#ebeae8', spikethickness=0.5)
fig.update_yaxes(showgrid=False, zeroline=False, showticklabels=True, showline=False)
fig.update_traces(xaxis='x1', col=1)
fig.update_traces(xaxis='x2', col=2)
fig.update_traces(xaxis='x3', col=3)
app = dash.Dash(__name__)
app.layout = html.Div(children=[
dcc.Graph(id='chart1', figure=fig,
config={'displayModeBar': False})
])
if __name__ == '__main__':
app.run_server(debug=True, dev_tools_ui=False, dev_tools_props_check=False)
但是,如果我將xref
和yref
更改為第二行的子圖(例如xref='x4'
和yref='y4'
)它就不再起作用了。 我嘗試了這個問題的答案。
我遇到的另一個可能與上述問題有關的問題是第二行的 ylabels 與第一行的不同。 我希望他們像第一排一樣。 我在下圖中強調了我的意思。
下面的代碼采用與您類似的數據樣本,計算每列的平均值,並將其作為水平線添加到每個子圖中以生成此 plot:
我已經從您的原始片段中刪除了一些似乎把事情搞砸的元素。 我也忽略了破折號元素,因為它們不是生成最小可重現示例所必需的。
代碼:
#import dash
#import dash_core_components as dcc
#import dash_html_components as html
import plotly
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import numpy as np
import pandas as pd
np.random.seed(123)
df=pd.DataFrame({ 'x':list(range(40)),
'y1':np.random.randint(20, 40, 40),
'y2':np.random.randint(100, 140, 40),
'y3':np.random.randint(20, 40, 40),
'y4':np.random.randint(20, 40, 40),
'y5':np.random.randint(100, 140, 40),
'y6':np.random.randint(20, 40, 40)})
df.set_index('x')
fig = make_subplots(rows=2, cols=3, vertical_spacing=0.1,
horizontal_spacing=0.1, shared_xaxes=True, shared_yaxes=False)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y1'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x1', yaxis='y1'), row=1, col=1)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y2'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x2', yaxis='y2'), row=1, col=2)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y3'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x3', yaxis='y3'), row=1, col=3)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y4'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x4', yaxis='y4'), row=2, col=1)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y5'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x5', yaxis='y5'), row=2, col=2)
fig.add_trace(go.Scatter(x=list(range(40)), y=df['y6'], line_color='#fae823', showlegend=False,
hovertemplate=[], xaxis='x6', yaxis='y6'), row=2, col=3)
fig.update_layout({'plot_bgcolor': "#21201f", 'paper_bgcolor': "#21201f", 'legend_orientation': "h"},
legend=dict(y=1, x=0),
font=dict(color='#dedddc'), dragmode='pan', hovermode='x unified',
margin=dict(b=20, t=0, l=0, r=40))
fig.update_xaxes(showgrid=False, zeroline=False, rangeslider_visible=False, showticklabels=False,
showspikes=True, spikemode='across', spikesnap='data', showline=False, spikedash='dash',
spikecolor='#ebeae8', spikethickness=0.5)
fig.update_yaxes(showgrid=False, zeroline=False, showticklabels=True, showline=False)
# add shapes
col_count = 1
for i in range(1,3):
for j in range(1,4):
fig.add_shape(go.layout.Shape(type="line",
yref="paper",
xref="x",
x0=1,
y0=df.iloc[:, col_count].mean(),
x1=40,
y1=df.iloc[:,col_count].mean(),
#line=dict(color="RoyalBlue", width=3),),
line=dict(color='red', width=3),),
row=i,
col=j)
col_count = col_count+1
#fig.update_traces(xaxis='x1', col=1)
#fig.update_traces(xaxis='x2', col=2)
#fig.update_traces(xaxis='x3', col=3)
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.