Как заставить matplotlib обновлять мои оси на основе диапазона данных

0

Вопрос

У меня есть живая анимация, которую я хотел бы обновлять по осям x и y во время каждой перерисовки.

Я перепробовал несколько способов решить эту проблему, которые оставлены в комментариях в приведенном ниже коде

Теперь я полагаю, что проблема возникает из-за возврата строки, которая связана с переменной ax, в то время как функция оживления действует на переменную fig?

import pandas as pd
import time
import matplotlib.pyplot as plt
import matplotlib.animation as animation
global df
df = pd.DataFrame(columns = ['time', 'number'])
global start_time
start_time = time.time()
df['time'] = [1]*40
df['number'] = [1]*40
global counter
counter = 0
while counter<40:
    df.iat[counter, 0] = round(((time.time()-start_time)*10))
    df.iat[counter, 1] = counter
    time.sleep(0.1)
    counter = counter+1
def get_data():
    global counter
    global start_time
    global df
    df.drop(range(10), axis = 0, inplace=True)
    df2 = pd.DataFrame(columns = ['time', 'number'])
    list1 = []
    list2 = []
    for item in range(10):
        time.sleep(0.1)
        list1.append(round(((time.time()-start_time)*10)))
        list2.append(counter)
        counter = counter + 1
    df2['time'] = list1
    df2['number'] = list2
    df = df.append(df2, ignore_index = True)
    df.reset_index(inplace=True, drop = True)
    x_data = df['time']
    y_data = df['number']
    return x_data,y_data
def get_limits():
    global df
    x_min = min(df['time'])
    y_min = min(df['number'])
    x_max = max(df['time'])
    y_max = max(df['number'])
    return x_min, y_min, x_max, y_max
fig, ax = plt.subplots()
def animate(i):
    x_data, y_data= get_data()
    x_min, y_min, x_max, y_max = get_limits()
    #plt.xlim(x_min, x_max, auto = True)
    #plt.ylim(y_min, y_max, auto = True)
    ax.set_xlim(x_min, x_max, auto = True)
    ax.set_ylim(y_min, y_max, auto = True)
    line = ax.plot(x_data, y_data)
    #line = ax.plot(x_data, y_data,scalex=True, scaley=True, color="red")

    #plt.plot(x,y, scaley=True, scalex=True, color="red")
    return line
ani = animation.FuncAnimation(
    fig, animate, interval=50, blit=True, save_count=50)
#ani2 = animation.FuncAnimation(ax, animate, interval = 50, blit=True, save_count=50)
plt.show()
1

Лучший ответ

0

Я смог заставить оси динамически изменяться с помощью приведенного ниже кода.

Основные отличия заключаются в том, что я использовал plt.ylim и plt.xlim, в отличие от изменения фигуры xlim или ylim. Тем не менее, его Ive также добавил прокомментированный код рядом с теми, которые также работают. Я полагаю, что ax1-это подзаголовок, который представляет собой оси, присвоенные рис. Таким образом, обновление ax1 обновляет оси. Это также может быть доступно с fig.gca(), так как figure.gca() возвращает оси фигуры.

import pandas as pd
import time
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
global df
df = pd.DataFrame(columns = ['time', 'number'])
global start_time
start_time = time.time()
df['time'] = [1]*40
df['number'] = [1]*40
global counter
counter = 0
while counter<40:
    df.iat[counter, 0] = round(((time.time()-start_time)*20))
    df.iat[counter, 1] = counter
    time.sleep(0.05)
    counter = counter+1
def get_data():
    global counter
    global start_time
    global df
    df.drop(range(10), axis = 0, inplace=True)
    df2 = pd.DataFrame(columns = ['time', 'number'])
    list1 = []
    list2 = []
    for item in range(10):
        time.sleep(random.randint(10,100)/1000)
        list1.append(round(((time.time()-start_time)*20)))
        list2.append(counter)
        counter = counter + 1
    df2['time'] = list1
    df2['number'] = list2
    df = df.append(df2, ignore_index = True)
    df.reset_index(inplace=True, drop = True)
    x_data = df['time']
    y_data = df['number']
    return x_data,y_data
def get_limits():
    global df
    x_min = min(df['time'])
    y_min = min(df['number'])
    x_max = max(df['time'])
    y_max = max(df['number'])
    return x_min, y_min, x_max, y_max

fig = plt.figure(figsize = (18,9))
ax1 = fig.add_subplot(1,1,1)
plt.title("Dynamic Axes")

def animate(i):
    x_data, y_data = get_data()
    x_min, y_min, x_max, y_max = get_limits()
    plt.xlim(x_min, x_max) #ax1.set_ylim(y_min, y_max)
    plt.ylim(y_min,y_max) #fig.gca().set_xlim(x_min,x_max)
    plt.plot(x_data,y_data)
animation = animation.FuncAnimation(fig, animate, interval = 50)
plt.show()
2021-11-22 21:33:56

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................