Python bloch球面上的实时绘图

Python bloch球面上的实时绘图,python,matplotlib,plot,qutip,Python,Matplotlib,Plot,Qutip,我试图使用Qutip的函数bloch()在bloch球体上绘制实时数据 到目前为止,当我有一个b.show()时,代码总是中断 我在网上找到了很多类似问题的解决方案,但大多数都使用了直接的matplotlib命令,比如matplotlib.draw(),它似乎不适用于bloch类。 然后,还有其他解决方案,例如使用Tk或GTKagg(例如,或) 有人能帮我解决布洛赫班上的同样问题吗 编辑: 下面是一个简单的例子: 基本上,我想一次更新一个点,最好是在循环中。我的目标是在绘图中显示必须从文件读取的

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

到目前为止,当我有一个b.show()时,代码总是中断

我在网上找到了很多类似问题的解决方案,但大多数都使用了直接的matplotlib命令,比如matplotlib.draw(),它似乎不适用于bloch类。 然后,还有其他解决方案,例如使用Tk或GTKagg(例如,或)

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

编辑: 下面是一个简单的例子:

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

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()

我认为你是在破坏你的阴谋,因为你在为每一点呼吁秀。尝试在循环外调用show(最后)

编辑:动画打印

show
视为调用绘图进入视图的绝对命令。它不是绘制命令(或重画)。如果确实希望每隔“n”秒左右显示一幅图像,则需要在再次调用绘图之前清除绘图。你可以试试这个:

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我最好的建议不过,您可以使用文档中的动画公式。按照这个食谱:

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函数以执行所有需要的操作。

在此添加代码的最小示例(如果可能,可以通过复制粘贴进行测试)。好的。我希望这能让你更容易理解这个问题。嗨@armatita,谢谢你的回答。我的问题是我想显示我想在绘图中看到的实时数据。因此,我不能将所有内容都放入一个数组中,同时显示所有内容。因此,将有一个文件每0.2秒更新一次,我想将最后一行读入python,并将其绘制到图形中,以实时查看度量是如何演变的。这就是为什么我希望能够从循环内部绘图。@Mechanix我已经更新了我的帖子。我的答案取决于这样一个事实:我认为QuTip的工作原理可能与matplotlib非常相似。如果它不起作用,我建议你只使用网站上给出的动画配方。文章中的链接。再次感谢。问题是我如何在屏幕上显示动画。。。有什么想法吗?@Mechanix该配方基于matplotlib,它可以在屏幕上显示实时动画。你只需要根据你的案例研究来调整它。在此链接中,您将看到另一个使用实时随机生成数据的类似动画。注意同一个调用是如何使用的:好吧,很有趣,我实际上在看同一个示例。问题是,他们使用plt.draw(),它支持这种实时更新。在我的例子中,我只得到消息“AttributeError:Bloch实例没有属性'draw'”
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)