首页 > 解决方案 > 在matplotlib python中限制x轴

问题描述

我有生成实时图表的代码,每隔几秒更新一次。除了单个问题之外,所有功能都完全按照我的意愿运行,x 轴不断添加新值但从不删除旧值

在下面的示例代码中,因为我将数据框限制为 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()

我需要的是,在数据框达到最大大小后,删除最左边的测量值,以免一次超过屏幕上设定的测量值。请注意,当数据框达到一定大小时,数据框在添加新列之前已经删除了不需要的列,但我的图表并未反映这一点

标签: pythonpandasuser-interfacematplotlibgraph

解决方案


使用自动缩放会尝试保留旧数据。如果您放弃自动缩放并使用

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

推荐阅读