Заголовок поверхности отладки не обновляется - PullRequest
1 голос
/ 16 июня 2020

Я написал следующий простой код с повторяющейся функцией:

import plotly.graph_objects as go
import pandas as pd
import numpy as np
import plotly.io as pio
pio.renderers.default='iframe_connected'
import math
%matplotlib inline
x=[-3,-2,-1,0,1,2,3]
y=x
init=0
def surface(x,y,stop,time,ct):
    z=[[],[],[],[],[],[],[]]
    i=0
    for _ in x:
        for __ in y:
            try:
                a=math.sqrt(ct*time+_**2-__**2)
            except ValueError:
                a=0
            z[i].append(a)
        i+=1
    for _ in z:
        _=list(map(lambda x:round(x,2),_))
    z_2d=np.array(z).reshape(7,7)
    surf=go.Figure(
        layout=go.Layout(
            template='plotly_dark',
            title=dict(
                text='Surface after {} seconds'.format(time),
                xref='paper',
                pad_t=15
            )
        )
    )
    surf.add_trace(
        go.Surface(
            showlegend=False,
            x=x,
            y=y,
            z=z_2d,
            surfacecolor=z_2d,
            colorbar=dict(
                tickmode='auto',
                ticks='outside',
                nticks=6
            ),
            colorscale='Jet'
        )
    )
    pio.show(surf)
    time+=1
    if time<stop:
        surface(x,y,stop,time,ct)
    else:
        pass
surface(x,y,10,init,np.e)

Идея состоит в том, что каждая поверхность, на которой печатается заголовок, должна изменяться по мере изменения переменной time time+=1. Рекурсия правильно печатает 10 поверхностей, но названия назначаются случайным образом, я не понимаю, почему, я даже добавил в какой-то момент print(time) до и после добавления +1, и при печати поверхностей он правильно печатает 1,2 затем 2,3, затем 3,4 и т.д. c. Но заголовки продолжают говорить «через 0 секунд», хотя должно быть сказано «3»; или «через 6 секунд», когда он должен сказать «5,6,7,8 соответственно», чтобы затем внезапно перейти на «9» или что-то еще. Вот несколько примеров: surface for time=3 surface on time=6

Пожалуйста, помогите указать, что я делаю неправильно, заранее спасибо!

1 Ответ

0 голосов
/ 16 июня 2020

Я считаю, что ваша проблема - это время между тем, когда pio создает изображение как html, и когда он пытается показать изображение с pio.show(surf). Когда вы используете iframe_connected, plotly будет:

... записать цифры как отдельные HTML файлы, а затем отобразить элементы iframe, которые ссылаются на эти HTML файлы .. .

и

С рендерерами iframe данные фигур хранятся в отдельных HTML файлах ...

Итак , если pio.show(surf) вызывается до того, как будет готов следующий, тогда будет использован предыдущий html.

Чтобы проверить это, сначала попробуйте добавить оператор печати прямо перед pio.show(surf), чтобы проверить ваш макет , и вы должны увидеть, что заголовок установлен правильно. Что-то вроде:

    print(surf)
    pio.show(surf)

, и вы увидите увеличивающиеся версии:

...
'layout': {'template': '...', 'title': {'pad': {'t': 15}, 'text': 'Surface after 0 seconds', 'xref': 'paper'}}
...

Затем добавьте задержку, чтобы дать некоторое время для графического создания html:

    tm.sleep(5)
    pio.show(surf)

Примечание: вам нужно добавить import time as tm вверху. Кроме того, time обычно плохое имя для переменной, но мы можем избежать проблемы с as tm.

...