Matplotlib'in eksenlerimi veri aralığına göre güncellemesini nasıl sağlayabilirim

0

Soru

Her yeniden çizim sırasında x ve y eksenlerini güncellemek istediğim canlı bir animasyonum var.

Bunu çözmek için aşağıdaki kodda yorum olarak bırakılan birden çok yol denedim

Şimdi sorunun, değişken ax ile ilgili olan satır döndürmekten kaynaklandığına inanıyorum, FuncAnimation ise değişken fig üzerinde hareket ediyor mu?

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

En iyi cevabı

0

Eksenleri aşağıdaki kodla dinamik olarak değiştirebildim.

Kullandığım temel farklılıklar plt.ylim ve plt.xlim xlim veya ylim şeklinin değiştirilmesinin aksine. O yanında çalışan ancak, ben de yorumladı kod eklendi. Ax1'in, şekle atanmış bir eksen olan bir alt nokta olduğuna inanıyorum. Böylece, ax1'i güncellemek eksenleri günceller. Bu aynı zamanda aşağıdakilerle de erişilebilir fig.gca(), beri figure.gca() şeklin eksenlerini döndürür.

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

Diğer dillerde

Bu sayfa diğer dillerde

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