Come fare matplotlib aggiornare il mio assi basato sulla serie di dati

0

Domanda

Ho un live di animazione che vorrei aggiornare il x e l'asse y nel corso di ogni aggiornamento.

Ive ha provato diversi modi per risolvere questo problema, che sono di sinistra come commenti nel codice riportato di seguito

Credo che ora il problema nasce dal ritorno della linea, che è correlata alla variabile ax, mentre il FuncAnimation agisce sulla variabile di fico?

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

Migliore risposta

0

Sono stato in grado di ottenere gli assi di cambiare in modo dinamico con il codice riportato di seguito.

Le differenze principali sono che ho usato plt.ylim e plt.xlim, invece di cambiare la figura xlim o ylim. Tuttavia, la sua Ive ha anche aggiunto codice commentato accanto a quelli, che anche il lavoro. Credo ax1 è una sottotrama, che è un sistema di assi assegnati a fig. Così, l'aggiornamento ax1, aggiornamenti assi. Questo può anche essere accesso con fig.gca()poiché figure.gca() restituisce gli assi della figura.

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

In altre lingue

Questa pagina è in altre lingue

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