2

我正在尝试使用 Qutip 的函数 bloch() 在 bloch 球体上绘制实时数据。

到目前为止,当我在那里有 b.show() 时,代码总是会中断。

我在网上找到了很多类似问题的解决方案,但其中大多数都使用了 matplotlib.draw() 等直接 matplotlib 命令,这似乎不适用于 bloch 类。然后,还有其他使用例如 Tk 或 GTKagg 的解决方案(例如https://stackoverflow.com/a/15742183/3276735使用 matplotlib 在 while 循环中实时绘图

有人可以帮我解决布洛赫班上的同样问题吗?

编辑:这是一个最小的例子:

基本上,我想一次更新我的情节,最好是在一个循环中。我的目标是在必须从文件中读取的图中显示实时数据。

import qutip as qt
import numpy as np


b = qt.Bloch()

theta = np.arange(0,np.pi,0.1)

for ii in range(len(theta)):
     b.add_points([np.sin(theta[ii]),0,np.cos(theta[ii])])
     b.show()
4

1 回答 1

1

我认为你正在打破你的阴谋,因为你在为每一点都打电话。尝试在循环外调用 show (最后)。

import qutip as qt
import numpy as np


b = qt.Bloch()

theta = np.arange(0,np.pi,0.1)

for ii in range(len(theta)):
     b.add_points([np.sin(theta[ii]),0,np.cos(theta[ii])])

b.show() # Changed here

编辑: 动画情节

考虑show作为一个绝对命令来调用绘图。这不是一个绘图命令(或重绘)。如果您确实想每隔“n”秒左右显示一个图像,那么您需要clear在再次调用它之前绘制该图。你可以试试这个:

import qutip as qt
import numpy as np

b = qt.Bloch()

theta = np.arange(0,np.pi,0.1)

for ii in range(len(theta)):
     b.clear()
     b.add_points([np.sin(theta[ii]),0,np.cos(theta[ii])])
     b.show()
     # wait time step and load new value from file.

,我当前的发行版中没有 QuTip,所以我无法真正测试它,但我打赌它主要基于 matplotlib。不过,我最好的建议是让您使用QuTiP文档中的动画公式。按照这个食谱:

from pylab import *
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

fig = figure()
ax = Axes3D(fig,azim=-40,elev=30)
sphere=Bloch(axes=ax)

def animate(i):
    sphere.clear()
    sphere.add_vectors([sin(theta),0,cos(theta)])
    sphere.add_points([sx[:i+1],sy[:i+1],sz[:i+1]])
    sphere.make_sphere()
    return ax

def init():
    sphere.vector_color = ['r']
    return ax

ani = animation.FuncAnimation(fig, animate, np.arange(len(sx)),
                            init_func=init, blit=True, repeat=False)
ani.save('bloch_sphere.mp4', fps=20, clear_temp=True)

,您应该能够修改 animate 函数以执行您需要的所有操作。

于 2016-03-23T18:50:56.803 回答