Python Matplotlib更新实时绘图

Python Matplotlib更新实时绘图,python,matplotlib,plot,while-loop,Python,Matplotlib,Plot,While Loop,我想用matplotlib更新一条线图,并想知道是否有对代码的良好修改,使得绘制的线只是得到更新,而不是每次都重新绘制。下面是一个示例代码: import matplotlib.pyplot as plt import numpy as np import pandas as pd matplotlib.style.use('ggplot') plt.ion() fig=plt.figure() i=0 df = pd.DataFrame({"time": [pd.datetime.now

我想用matplotlib更新一条线图,并想知道是否有对代码的良好修改,使得绘制的线只是得到更新,而不是每次都重新绘制。下面是一个示例代码:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
matplotlib.style.use('ggplot')

plt.ion() 
fig=plt.figure()

i=0
df = pd.DataFrame({"time": [pd.datetime.now()], "value": 0}).set_index("time")
plt.plot(df);

while True:
    temp_y=np.random.random();
    df2 = pd.DataFrame({"time": [pd.datetime.now()], "value": temp_y}).set_index("time")
    df = df.append(df2)
    plt.plot(df)
    i+=1
    plt.show()
    plt.pause(0.000001) 
正如你所看到的,绘图在一段时间后变得越来越慢,我认为折线图每次迭代都会重新绘制,因为它会改变颜色

是的

x = np.arange(10)
y = np.random.rand(10)

line, = plt.plot(x,y)
line.set_data(x,np.random.rand(10))
plt.draw()
但是,打印速度会变慢,因为您正在扩展数据帧,并且每个附加操作可能会将内存中的数据帧复制到新位置。随着数据帧大小的增加,该复制操作需要更长的时间。我将循环一个索引并绘制(
范围内的ii(len(data)):line.set_data(x[:ii],y[:ii])

编辑:

import numpy as np
import matplotlib.pyplot as plt; plt.ion()
import pandas as pd

n = 100
x = np.arange(n)
y = np.random.rand(n)
# I don't get the obsession with pandas...
df = pd.DataFrame(dict(time=x, value=y))

# initialise plot and line
line, = plt.plot(df['time'], df['value'])

# simulate line drawing
for ii in range(len(df)):
    line.set_data(df['time'][:ii], df['value'][:ii]) # couldn't be bothered to look up the proper way to index in pd
    plt.draw()
    plt.pause(0.001)

可以在matplotlib中使用以下代码进行实时打印

import random 
from itertools import count
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

plt.style.use('fivethirtyeight')

x_vals = []
y_vals = []

index = count()


def analyse(i):

    data = pd.read_csv(<your file which is updated or live data>)#u can use the pandas or any other data frame work
    x = data['index']
    y1 = data['readings']

    plt.cla()

    plt.plot(x, y1, label='Temperature') #in my case data is temperature
    
    plt.legend(loc='upper left')
    plt.tight_layout()

ani = FuncAnimation(plt.gcf(), analyse, interval=1000) #adjust intervals for call

plt.tight_layout()
plt.show()
随机导入
从itertools导入计数
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
从matplotlib.animation导入FuncAnimation
plt.style.use('fivethirtyeight'))
x_vals=[]
y_vals=[]
索引=计数()
第(一)款:
data=pd.read_csv()#您可以使用pandas或任何其他数据框架
x=数据[“索引”]
y1=数据[‘读数’]
plt.cla()
plt.plot(x,y1,label='Temperature')#在我的例子中,数据是温度
plt.图例(位置='左上')
plt.紧_布局()
ani=FuncAnimation(plt.gcf(),analysis,interval=1000)#调整通话间隔
plt.紧_布局()
plt.show()

获取
lines=plt.plot(df)
,并查看返回对象的属性。我认为
plt.setp(lines,xdata=new\u xdata,ydata=new\u ydata)
可能有效。请您根据我发布的代码提供一个示例。非常感谢帕特,谢谢你的编辑。只有当您事先知道数据的长度(n=100)时,[:ii]的示例才有效,对吗?使用while循环并在while循环中创建新的附加数据(如我的示例中所示),我必须以另一种方式进行。不,请不要这样做——您的绘图最终将停止。大概,你至少知道你想让情节持续多久,至少大致如此。然后初始化一个足够大的空数组,并在它进入时用数据填充该数组,然后按照上面的建议绘制已经拥有的数据。附加到数组总是一个坏主意,在99.9999%的情况下,不需要一点计划。我明白你的意思。但目前的情况是,我有一个来自金融信息系统的数据源。这些新的数据点(在这些示例中是附加的数据)被存储并随后从HDF存储中提取。我的目标是从这个HDFstore中获得最后n个元素的计数滚动窗口。因此,在我看来,没有理由认为打开while循环并绘制滚动数据是一个不好的选择,因为该程序理论上可以永远运行。好吧,目前它不会永远运行,因为很快你将落后于股票代码数分钟甚至数小时(如果你真的像代码显示的那样每微秒更新一次)。只需初始化一个足够1小时或一天的数组,然后在该数组已满时初始化并附加一个相同大小的新数组。另外,我真的,真的希望你不是以同样的方式附加到你的hdf5文件,因为在那里你会有完全相同的问题。。。接受答案,它会满足你最初的要求,甚至更多。