使用 plotly 中的子图设置 column_titles 和 row_titles 以及图的底部和左侧

Set column_titles and row_titles and the bottom and and the left of the plot using subplots in plotly

我正在使用 from plotly.subplots import make_subplots 我的专栏有两个列表_ 和 row_titles:

col_name = list(df.columns)
row_name = col_name[::-1] # the inverse of col_name
fig = make_suplots(rows=5, cols=5,  start_cell="bottom-left", column_titles=col_name , row_titles=row_name )

我设法做了这样的东西:(见图)

如您所见,column_titles 在顶部,row_titles 在图的右侧

可以设置底部的column_titles和左侧的row_titles吗?

简答

fig.for_each_annotation(lambda a:  a.update(y = -0.2) if a.text in column_titles else a.update(x = -0.07) if a.text in row_titles else())

情节


详情

列和行标签在 fig.layout.annotations 中存储为 annotations:

'layout': {'annotations': [{'font': {'size': 16},
                                'showarrow': False,
                                'text': 'A',
                                'x': 0.22,
                                'xanchor': 'center',
                                'xref': 'paper',
                                'y': 1.0,
                                'yanchor': 'bottom',
                                'yref': 'paper'},

乱用注释会很快导致问题,因为您的过程可以操作不是列或行标签的元素。但在这种情况下,识别足够的注释属性以确定它们实际上是您要编辑的标签是相当容易的。例如,如果 annotation[0].text 可以在 column_titles 中找到,那么您可以保留 'x': 0.22, 并将 'y': 1.0 更改为例如 'y': -0.2。这正是建议的方法在下面的完整代码段中所做的:

完整代码

import plotly.graph_objects as go
from plotly.subplots import make_subplots

column_titles = ['A', 'B']
row_titles = ['1', '2']

fig = make_subplots(rows=2, cols=2, start_cell="bottom-left", 
                   column_titles = column_titles,
                   row_titles = row_titles)

fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
              row=1, col=1)

fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
              row=1, col=2)

fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
              row=2, col=1)

fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000]),
              row=2, col=2)

fig.for_each_annotation(lambda a:  a.update(y = -0.2) if a.text in column_titles else a.update(x = -0.07) if a.text in row_titles else())

fig.show()