Update grafu – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Update grafu – Python – Fórum – Programujte.comUpdate grafu – Python – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

mfr
~ Anonymní uživatel
6 příspěvků
27. 1. 2022   #1
-
0
-

Ahoj,

čtu data ze serial portu do array. Rád bych měl tlačítko update, po jehož stisknutí chci načíst data do array a updatovat dva grafy. Nyní tam mám plot a show, tzn. se mi otevře okno s grafem a musím ho zavřít a pak se mi zobrazí druhé a po zavření se ukončí program.

Jak by šlo udělat, mít jedno tlačítko nahoře v okně a pod ním dva grafy. Po stisknuté tlačítka se provede funkce načtení dat a nové vykreslení obou grafů?

Díky moc za každý postřeh.

mfr

Nahlásit jako SPAM
IP: 85.163.82.–
gna
~ Anonymní uživatel
1691 příspěvků
27. 1. 2022   #2
-
0
-

   

import random
import matplotlib.pyplot as plt
from matplotlib.widgets import Button


def getdata():
    return (
        [random.random() for _ in range(100)],
        [random.random() for _ in range(100)]
    )

def update(event):
    set1, set2 = getdata()
    line1.set_ydata(set1)
    line2.set_ydata(set2)
    plt.draw()

fig, (ax1, ax2) = plt.subplots(2)

set1, set2 = getdata()
line1, = ax1.plot(set1)
line2, = ax2.plot(set2)

btnax = plt.axes([0.4, 0.9, 0.2, 0.1])
button = Button(btnax, 'Update')
button.on_clicked(update)

plt.show()
Nahlásit jako SPAM
IP: 213.211.51.–
mfr
~ Anonymní uživatel
6 příspěvků
28. 1. 2022   #3
-
0
-

#2 gna

Díky za pomoc, ale ještě bych se chtěl poradit s další věcí...

Můj kód je nyní:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button
import serial
import struct

ser = serial.Serial(port='COM4', baudrate=2000000)
SAMPLES=200
s = struct.Struct('<' + str(SAMPLES) + 'f')
unpacked_data1 = []

def serial_read():
    ser.reset_input_buffer()
    ser.write("r".encode())
    serial_data = ser.read(SAMPLES*4)
    unpacked_data = s.unpack(serial_data)
    unpacked_data1[1:SAMPLES] = unpacked_data[1:SAMPLES]
    ser.close

def getdata():
    serial_read()
    return (
        unpacked_data1
    )
    

def update(event):
    set1 = getdata()
    line1.set_ydata(set1)
    plt.draw()

fig, (ax1) = plt.subplots(1)

set1 = getdata()
line1, = ax1.plot(set1)


btnax = plt.axes([0.4, 0.9, 0.2, 0.1])
button = Button(btnax, 'Update')
button.on_clicked(update)

plt.show()

První vykreslení hodnot je ok, ale u druhého mi to píše ValueError: shape mismatch: objects cannot be broadcast to a single shape. Kde mám chybu?

A ještě druhý dotaz:

Kdybych chtěl v druhém okně vykreslit FFT, tak to udělám takto? 

x = np.linspace(0.0, SAMPLES*T, SAMPLES)
y = unpacked_data1
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), SAMPLES//2)
fig, ax2 = plt.subplots(2)
line 2 = ax.plot(xf, 2.0/SAMPLES * np.abs(yf[:SAMPLES//2]))
 

Díky moc!!

Nahlásit jako SPAM
IP: 85.163.82.–
gna
~ Anonymní uživatel
1691 příspěvků
28. 1. 2022   #4
-
0
-

List se indexuje od 0 a k ničemu ho nepotřebuješ. Na vracení hodnot z funkce je příkaz return. 

def getdata():
    ser.reset_input_buffer()
    ser.write(b"r")
    serial_data = ser.read(SAMPLES * 4)
    unpacked_data = s.unpack(serial_data)
    ser.close()
    return unpacked_data

To FFT máš skoro správně. Zkus to spustit a poopravuj, to co řve :)

Nahlásit jako SPAM
IP: 213.211.51.–
mfr
~ Anonymní uživatel
6 příspěvků
29. 1. 2022   #5
-
0
-

#4 gna
Díky a ještě jeden dotaz jestli mohu.

Nyní mám dva grafy pod sebou, jejich velikost je podle okna. To je super. Ale potřeboval bych horní graf zmenšit na šířku a dát vedle okno, kam bych si vypisoval hodnoty, které se přepíší když dám update. Něco jako na obrázku. Děkuju za všechny rady.

Připojen obrázek.

Nahlásit jako SPAM
IP: 85.163.82.–
gna
~ Anonymní uživatel
1691 příspěvků
30. 1. 2022   #6
-
0
-

Ty plochy si můžeš definovat jak chceš, já ani ty možnosti pořádně neznám. Toto mi připadá jednoduché:

# grid 2x10 a která políčka obsadit
ax1 = plt.subplot(2, 10, (1, 7))
ax2 = plt.subplot(2, 10, (11, 20))
Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý