Ako urobiť matplotlib aktualizovať svoj osí založené na rozsah údajov

0

Otázka

Mám live animácie, ktoré by som chcel aktualizovať osi x a y pri každom zmenilo.

Snažil som sa niekoľko spôsobov, ako to vyriešiť, ktoré sú ponechané v ako poznámky kód nižšie

Verím, že teraz, že problém vzniká z návrate linka, ktorá je spojená s pohyblivou ax, zatiaľ čo FuncAnimation koná v premennej obr?

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

Najlepšiu odpoveď

0

Bol som schopný získať osiach, aby sa menia dynamicky s kód nižšie.

Kľúčové rozdiely sú, že som použil plt.ylim a plt.xlimako protipól k zmene obrázok xlim alebo ylim. Avšak, jej Som sa tiež pridal sa vyjadril kód vedľa tých, ktoré tiež pracovať. Verím, že ax1 je subplot, ktoré je osí pripísané na obr. Teda, aktualizácia ax1, aktualizácie osi. To môže byť tiež prístup s fig.gca(),, pretože figure.gca() vráti osi obrázok.

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

V iných jazykoch

Táto stránka je v iných jazykoch

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