python 更新绘图中的特定子绘图轴

4c8rllxm  于 2023-06-28  发布在  Python
关注(0)|答案(2)|浏览(147)

设置:

  • 我特灵用plotly库绘制子图,但不知道如何引用特定的子图轴来更改其名称(或其他属性)。
  • Code 1中,我展示了一个简单的例子,其中我用plotly.subplots.make_subplots将两个图一个加在另一个上。
    代码1
import numpy as np
from plotly.subplots import make_subplots
from math import exp

fig = make_subplots(2, 1)

x = np.linspace(0, 10, 1000)
y = np.array(list(map(lambda x: 1 / (1 + exp(-0.1 * x + 5)), x)))
fig.add_trace(
    go.Scatter(
        x=x,
        y=y,
        name=f'\N{Greek Small Letter Sigma}(x)',
        showlegend=True
    ),
    row=1,
    col=1
)

x = np.where(np.random.randint(0, 2, 100)==1)[0]
fig.add_trace(
    go.Scatter(
        x=x,
        y=np.zeros_like(x),
        name=f'Plot 2',
        mode='markers', 
        marker=dict(
                symbol='circle-open',
                color='green',
                size=5
            ),
        showlegend=True
    ),
    row=2,
    col=1
)
fig.show()

我所尝试的

我曾尝试在每次添加跟踪后使用fig.update_xaxes(),但它会使绘图变得混乱,并且不会产生所需的输出,如Code 2所示。

代码二:

import numpy as np
from plotly.subplots import make_subplots
from math import exp

fig = make_subplots(2, 1)

x = np.linspace(0, 10, 1000)
y = np.array(list(map(lambda x: 1 / (1 + exp(-0.1 * x + 5)), x)))
fig.add_trace(
    go.Scatter(
        x=x,
        y=y,
        name=f'\N{Greek Small Letter Sigma}(x)',
        showlegend=True
    ),
    row=1,
    col=1
)
fig.update_xaxes(title_text='x')
x = np.where(np.random.randint(0, 2, 100)==1)[0]
fig.add_trace(
    go.Scatter(
        x=x,
        y=np.zeros_like(x),
        name=f'Plot 2',
        mode='markers', 
        marker=dict(
                symbol='circle-open',
                color='green',
                size=5
            ),
        showlegend=True
    ),
    row=2,
    col=1
)
fig.update_xaxes(title_text='active users')
fig.show()

这导致(注意,active users被打印在顶部):

我的问题:

1.如何将顶部图的x轴标签xactive users标签分配给底部图的x轴?
1.在一般情况下-我如何访问一个单独的子情节的属性?

cczfrluj

cczfrluj1#

this answer的帮助下,我能够解决它,通过引用xaxis用于绘制位置row=1col=1xaxis1用于绘制row=2col=1位置。完整的解决方案在Code 1中。

代码1:

import numpy as np
from plotly.subplots import make_subplots
from math import exp

fig = make_subplots(2, 1)

x = np.linspace(0, 10, 1000)
y = np.array(list(map(lambda x: 1 / (1 + exp(-0.1 * x + 5)), x)))
fig.add_trace(
    go.Scatter(
        x=x,
        y=y,
        name=f'\N{Greek Small Letter Sigma}(x)',
        showlegend=True
    ),
    row=1,
    col=1
)
fig['layout']['xaxis'].update(title_text='x')

x = np.where(np.random.randint(0, 2, 100)==1)[0]
fig.add_trace(
    go.Scatter(
        x=x,
        y=np.zeros_like(x),
        name=f'Plot 2',
        mode='markers', 
        marker=dict(
                symbol='circle-open',
                color='green',
                size=5
            ),
        showlegend=True
    ),
    row=2,
    col=1
)
fig['layout']['xaxis2'].update(title_text='active users')

fig.show()

干杯

eoxn13cs

eoxn13cs2#

如果不确定xaxis#的ID是什么,也可以使用.select_xaxes()通过轴的colrow在网格中寻址轴。
如果您以非顺序方式遍历网格,或者具有多个轴或不同类型(例如,你混合了piescatter类型)。
我已经单独渲染了所有必要的轨迹,然后填充一个空的小平面5×5网格,如下所示:

fig = make_subplots(rows=5, cols=5)
for i, subplot in enumerate(rendered_subplots):
    fig.add_trace(subplot.data[0], row = 1 + i//5, col = 1 + i%5)
    next(fig.select_xaxes(row=1 + i//5, col= 1 + i%5)).update(title="Speed",
                                               tickmode = 'array',
                                               tickvals = [1,2,3,4],
                                               ticktext = ['Very slow', 'Slow', 'Fast', 'Very fast'])

如果您已经预先格式化了从rendered_subplots中提取的每个子图中的轴,则可以进一步操作并以这种方式移植轴属性:

rendered_xaxis = next(subplot.select_xaxes())
    this_xaxis = next(fig.select_xaxes(row = 1 + i//5, col = 1 + i%5))
    this_xaxis.update({x:rendered_xaxis[x] for x in
                       ["tickmode", "ticktext", "tickvals", "title"]})

相关问题