调试Plotly表面标题不更新。

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

我写了以下简单的代码,其中有一个循环函数。

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等。但是标题一直在说 "0秒后",虽然应该说 "3";或者 "6秒后",应该说 "分别是5,6,7,8",然后突然变成 "9 "之类的。这里有一些例子。surface for time=3surface on time=6

请大家帮我指出我做错了什么,先谢谢大家!

python 3d plotly
1个回答
0
投票

我相信你的问题是当 pio 将图片创建为html,当它试图用 pio.show(surf). 当你使用 iframe_connected plotly会......将数字写成独立的HTML文件,然后显示引用这些HTML文件的iframe元素..:

...把数字写成独立的HTML文件,然后显示引用这些HTML文件的iframe元素...。

在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'}}
...

接下来添加一个延迟,让 plotly 有时间生成 html。

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

注意:你需要添加 import time as tm 在顶部。 还有: time 通常对于一个变量来说是一个不好的名字,但是我们可以用 as tm.

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