调试 Plotly 表面标题未更新

Posted

技术标签:

【中文标题】调试 Plotly 表面标题未更新【英文标题】:Debug Plotly Surface Title Not Updating 【发布时间】:2020-10-06 10:43:45 【问题描述】:

我用循环函数编写了以下简单代码:

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 个曲面,但标题是随机分配的,我不明白为什么,我什至在添加 +1 之前和之后添加了 print(time),并且在打印曲面时它正确打印 1,2 然后 @ 987654331@,然后是3,4,等等。但标题一直说“0秒后”,即使它应该说“3”;或“6 秒后”,当它应该分别说“5,6,7,8”时突然变为“9”或其他什么。这里有一些示例:

请您帮忙指出我做错了什么,提前谢谢!

【问题讨论】:

【参考方案1】:

我相信您的问题是pio 将图像创建为 html 与尝试使用pio.show(surf) 显示图像之间的时间。当您使用iframe_connected 时,情节将:

...将数字写入独立的 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'
...

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

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

注意:您需要在顶部添加import time as tm。此外,time 通常是一个不好的变量名称,但我们可以避免 as tm 的问题。

【讨论】:

你说得对,问题是我没有时间创建新的 html,添加时间 3 给了我完美的解决方案。非常感谢您的帮助,非常感谢您花时间检查我的问题!

以上是关于调试 Plotly 表面标题未更新的主要内容,如果未能解决你的问题,请参考以下文章

在调试 ASP.NET MVC 应用程序期间未更新 CSS

颤振:BLoC Builder 未更新,尽管我在调试器中看到新的/不同的状态

如何在 R 中旋转 3D Plotly,更新?

Firebird 中是不是有详细的调试功能?

Qt Creator 调试器未显示返回值

Flutter:正在运行/调试应用程序-> 黑屏并且无法在屏幕表面上包裹 Android 模拟器