我写了以下简单的代码,其中有一个循环函数。
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 "之类的。这里有一些例子。
请大家帮我指出我做错了什么,先谢谢大家!
我相信你的问题是当 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
.