Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在matplotlib python中限制x轴_Python_Pandas_User Interface_Matplotlib_Graph - Fatal编程技术网

在matplotlib python中限制x轴

在matplotlib python中限制x轴,python,pandas,user-interface,matplotlib,graph,Python,Pandas,User Interface,Matplotlib,Graph,我有代码生成一个实时图,每隔几秒钟更新一次。它的所有功能完全符合我的要求,除了一个问题,x轴不断添加新值,但从不删除旧值 在下面的示例代码中,因为我将dataframe限制为6列,所以我希望在x轴上显示的测量值不会超过6个。相反,图形会继续更新,最终点之间的距离太近 from matplotlib import pyplot from matplotlib.animation import FuncAnimation import pandas as pd from datetime impor

我有代码生成一个实时图,每隔几秒钟更新一次。它的所有功能完全符合我的要求,除了一个问题,x轴不断添加新值,但从不删除旧值

在下面的示例代码中,因为我将dataframe限制为6列,所以我希望在x轴上显示的测量值不会超过6个。相反,图形会继续更新,最终点之间的距离太近

from matplotlib import pyplot
from matplotlib.animation import FuncAnimation
import pandas as pd
from datetime import datetime
import threading
import random
import time
measurements = ['abc','bcd','afr','reg','wow']
counter = 0
figure = pyplot.figure()
measurement_frame = pd.DataFrame(index = measurements)
def get_live(counter2, col_num):
    measurement_frame.iat[counter2,col_num] = random.randint(50,80)
def add_to_dataframe():
    global measurement_frame
    #timey = datetime.now().strftime('%H:%M:%S')
    timey = datetime.now().time()
    if measurement_frame.shape[1] == 6:
        measurement_frame.drop(measurement_frame.columns[0], axis = 1, inplace = True)
    measurement_frame[timey] = measurements
    col_num = measurement_frame.shape[1]-1
    print(col_num)
    counter2 = 0
    for item in measurements:
        t = threading.Thread(target=get_live, args=(counter2, col_num,))
        t.start()
        counter2 = counter2 +1
    t.join()
    print(measurement_frame.columns[0])
    time.sleep(1)
def update(frame):
    add_to_dataframe()
    x_data = measurement_frame.columns
    print(x_data[0])
    y1_data = measurement_frame.loc[measurement_frame.index[0]]
    y2_data = measurement_frame.loc[measurement_frame.index[1]]
    y3_data = measurement_frame.loc[measurement_frame.index[2]]
    y4_data = measurement_frame.loc[measurement_frame.index[3]]
    y5_data = measurement_frame.loc[measurement_frame.index[4]]
    line, = pyplot.plot_date(x_data, y1_data, '-', color = 'b')
    line2, = pyplot.plot_date(x_data, y2_data, '-', color = 'g')
    line3, = pyplot.plot_date(x_data, y3_data, '-', color = 'r')
    line4, = pyplot.plot_date(x_data, y4_data, '-', color = 'm')
    line5, = pyplot.plot_date(x_data, y5_data, '-', color = 'y')
    line.set_data(x_data, y1_data)
    line2.set_data(x_data, y2_data)
    line3.set_data(x_data, y3_data)
    line4.set_data(x_data, y4_data)
    line5.set_data(x_data, y5_data)
    figure.gca().set_xlim(x_data[0])
    figure.gca().autoscale()
    print(figure.gca().get_xlim())
    return line, line2, line3, line4, line5,
animation = FuncAnimation(figure, update, interval=1000)
pyplot.show()

我需要的是,在数据帧达到最大大小后,删除最左边的测量值,以便一次不超过屏幕上的一组测量值。请注意,当数据帧达到一定大小时,在添加新列之前,它已经删除了不需要的列,但我的图表并没有反映出使用自动缩放时试图保留旧数据的情况。如果您放弃自动缩放并使用

figure.gca().set_xlim(left =x_data[0], right = datetime.now().time()) 
它按预期工作

完整的代码现在是

from matplotlib import pyplot
from matplotlib.animation import FuncAnimation
import pandas as pd
from datetime import datetime
import threading
import random
import time
measurements = ['abc','bcd','afr','reg','wow']
counter = 0
figure = pyplot.figure()
measurement_frame = pd.DataFrame(index = measurements)
def get_live(counter2, col_num):
    measurement_frame.iat[counter2,col_num] = random.randint(50,80)
def add_to_dataframe():
    global measurement_frame
    #timey = datetime.now().strftime('%H:%M:%S')
    timey = datetime.now().time()
    if measurement_frame.shape[1] == 6:
        measurement_frame.drop(measurement_frame.columns[0], axis = 1, inplace = True)
    measurement_frame[timey] = measurements
    col_num = measurement_frame.shape[1]-1
    print(col_num)
    counter2 = 0
    for item in measurements:
        t = threading.Thread(target=get_live, args=(counter2, col_num,))
        t.start()
        counter2 = counter2 +1
    t.join()
    print(measurement_frame.columns[0])
    time.sleep(1)
def update(frame):
    add_to_dataframe()
    x_data = measurement_frame.columns
    print(x_data[0])
    y1_data = measurement_frame.loc[measurement_frame.index[0]]
    y2_data = measurement_frame.loc[measurement_frame.index[1]]
    y3_data = measurement_frame.loc[measurement_frame.index[2]]
    y4_data = measurement_frame.loc[measurement_frame.index[3]]
    y5_data = measurement_frame.loc[measurement_frame.index[4]]
    line, = pyplot.plot_date(x_data, y1_data, '-', color = 'b')
    line2, = pyplot.plot_date(x_data, y2_data, '-', color = 'g')
    line3, = pyplot.plot_date(x_data, y3_data, '-', color = 'r')
    line4, = pyplot.plot_date(x_data, y4_data, '-', color = 'm')
    line5, = pyplot.plot_date(x_data, y5_data, '-', color = 'y')
    line.set_data(x_data, y1_data)
    line2.set_data(x_data, y2_data)
    line3.set_data(x_data, y3_data)
    line4.set_data(x_data, y4_data)
    line5.set_data(x_data, y5_data)
    figure.gca().set_xlim(left =x_data[0], right = datetime.now().time())
    print(figure.gca().get_xlim())
    return line, line2, line3, line4, line5,
animation = FuncAnimation(figure, update, interval=1000)
pyplot.show()

这个方法在这种情况下有用吗?我相信如果我的时间不是字符串,它会有用的。我认为它不知道如何使用它。你知道它是否能解释日期时间对象吗?扫描你显示的是
pyplot.get_xlim()
?我注意到我的输出就是你要找的,或者你会在它不运行时理解它,所以我编辑了上面的代码,你可以在本地运行它