[Python] matplotlib grafiek perikelen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Maverick
  • Registratie: Oktober 2001
  • Laatst online: 24-07 18:06
Ik heb een aantal lists in Python welke ik zichtbaar wil maken in een grafiek. 1e list is de timestamps, de anderen zijn de datapunten.
Weggeschreven naar een bestand ziet de data er zo ongeveer uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Time    Pressure 1  Temperature 1   Pressure 2  Temperature 2   Pressure 3  Temperature 3   Pressure 4  Temperature 4   Pressure 5  Temperature 5   Pressure 6  Temperature 6
Fri Nov  6 11:13:49 2020    8.00    20.02   1.60    19.94   9.60    20.18   2.40    20.26   13.60   20.10   0.16    19.86
Fri Nov  6 11:13:50 2020    9.00    20.01   1.80    19.92   10.80   20.19   2.70    20.28   15.30   20.10   0.18    19.83
Fri Nov  6 11:13:51 2020    11.00   19.99   2.20    19.88   13.20   20.21   3.30    20.32   18.70   20.10   0.22    19.77
Fri Nov  6 11:13:52 2020    12.00   19.98   2.40    19.86   14.40   20.22   3.60    20.34   20.40   20.10   0.24    19.74
Fri Nov  6 11:13:53 2020    14.00   19.96   2.80    19.82   16.80   20.24   4.20    20.38   23.80   20.10   0.28    19.68
Fri Nov  6 11:13:54 2020    15.00   19.95   3.00    19.80   18.00   20.25   4.50    20.40   25.50   20.10   0.30    19.65
Fri Nov  6 11:13:56 2020    17.00   19.93   3.40    19.76   20.40   20.27   5.10    20.44   28.90   20.10   0.34    19.59
Fri Nov  6 11:13:57 2020    18.00   19.92   3.60    19.74   21.60   20.28   5.40    20.46   30.60   20.10   0.36    19.56
Fri Nov  6 11:13:58 2020    19.00   19.91   3.80    19.72   22.80   20.29   5.70    20.48   32.30   20.10   0.38    19.53
Fri Nov  6 11:13:59 2020    21.00   19.89   4.20    19.68   25.20   20.31   6.30    20.52   35.70   20.10   0.42    19.47
Fri Nov  6 11:14:00 2020    22.00   19.88   4.40    19.66   26.40   20.32   6.60    20.54   37.40   20.10   0.44    19.44
Fri Nov  6 11:14:01 2020    23.00   19.87   4.60    19.64   27.60   20.33   6.90    20.56   39.10   20.10   0.46    19.41
Fri Nov  6 11:14:02 2020    25.00   19.85   5.00    19.60   30.00   20.35   7.50    20.60   42.50   20.10   0.50    19.35
Fri Nov  6 11:14:03 2020    26.00   19.84   5.20    19.58   31.20   20.36   7.80    20.62   44.20   20.10   0.52    19.32
Fri Nov  6 11:14:04 2020    28.00   19.82   5.60    19.54   33.60   20.38   8.40    20.66   47.60   20.10   0.56    19.26
Fri Nov  6 11:14:05 2020    29.00   19.81   5.80    19.52   34.80   20.39   8.70    20.68   49.30   20.10   0.58    19.23
Fri Nov  6 11:14:06 2020    30.00   19.80   6.00    19.50   36.00   20.40   9.00    20.70   51.00   20.10   0.60    19.20
Fri Nov  6 11:14:07 2020    31.00   19.79   6.20    19.48   37.20   20.41   9.30    20.72   52.70   20.10   0.62    19.17
Fri Nov  6 11:14:08 2020    33.00   19.77   6.60    19.44   39.60   20.43   9.90    20.76   56.10   20.10   0.66    19.11
Fri Nov  6 11:14:09 2020    34.00   19.76   6.80    19.42   40.80   20.44   10.20   20.78   57.80   20.10   0.68    19.08
Fri Nov  6 11:14:10 2020    35.00   19.75   7.00    19.40   42.00   20.45   10.50   20.80   59.50   20.10   0.70    19.05
Fri Nov  6 11:14:12 2020    37.00   19.73   7.40    19.36   44.40   20.47   11.10   20.84   62.90   20.10   0.74    18.99
Fri Nov  6 11:14:13 2020    38.00   19.72   7.60    19.34   45.60   20.48   11.40   20.86   64.60   20.10   0.76    18.96
Fri Nov  6 11:14:14 2020    39.00   19.71   7.80    19.32   46.80   20.49   11.70   20.88   66.30   20.10   0.78    18.93
Fri Nov  6 11:14:15 2020    40.00   19.70   8.00    19.30   48.00   20.50   12.00   20.90   68.00   20.10   0.80    18.90
Fri Nov  6 11:14:16 2020    42.00   19.68   8.40    19.26   50.40   20.52   12.60   20.94   71.40   20.10   0.84    18.84
Fri Nov  6 11:14:17 2020    43.00   19.67   8.60    19.24   51.60   20.53   12.90   20.96   73.10   20.10   0.86    18.81
Fri Nov  6 11:14:19 2020    44.00   19.66   8.80    19.22   52.80   20.54   13.20   20.98   74.80   20.10   0.88    18.78
Fri Nov  6 11:14:20 2020    45.00   19.65   9.00    19.20   54.00   20.55   13.50   21.00   76.50   20.10   0.90    18.75
Fri Nov  6 11:14:21 2020    46.00   19.64   9.20    19.18   55.20   20.56   13.80   21.02   78.20   20.10   0.92    18.72
Fri Nov  6 11:14:23 2020    47.00   19.63   9.40    19.16   56.40   20.57   14.10   21.04   79.90   20.10   0.94    18.69
Fri Nov  6 11:14:24 2020    48.00   19.62   9.60    19.14   57.60   20.58   14.40   21.06   81.60   20.10   0.96    18.66
Fri Nov  6 11:14:25 2020    49.00   19.61   9.80    19.12   58.80   20.59   14.70   21.08   83.30   20.10   0.98    18.63
Fri Nov  6 11:14:27 2020    50.00   19.60   10.00   19.10   60.00   20.60   15.00   21.10   85.00   20.10   1.00    18.60
Fri Nov  6 11:14:31 2020    53.00   19.57   10.60   19.04   63.60   20.63   15.90   21.16   90.10   20.10   1.06    18.51


Ik gebruik de volgende code om deze grafiek op mijn programmavenster te toveren, ik heb al andere varianten gebruikt, maar deze vertonen hetzelfde fenomeen. Ik append iedere seconde data aan de list en roep dan de volgende functie aan om de grafiek te updaten

Python:
1
2
3
4
5
6
7
8
9
10
def Drawgraph():
    fig, ax = plt.subplots()  # Create a figure containing a single axes.
    ax.set(ylim=(0, 25))
    df=pd.DataFrame({'x': TimeStamps, 'y1': ListTemp1, 'y2': ListPres1, 'y3': ListPres2 })
    ax.plot( 'x', 'y1','y2', data=df, marker='o', markerfacecolor='blue', markersize=5, color='skyblue', linewidth=2)
        

    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.draw()
    canvas.get_tk_widget().grid(row=20, column=0, ipadx=40, ipady=20)


De grafiek ziet er als volgt uit:
Afbeeldingslocatie: https://tweakers.net/i/dFykCRAronbdiNXIym8xHHgRfPk=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/YQjuEcxmvKws88DphLSQcX0i.png?f=user_large

Zoals je kunt zien lopen allebei de lijnen linear omhoog, terwijl 1 van de 2 omlaag zou moeten lopen. Bij ieder nieuw datapunt dat er bij komt wordt de Y as gewijzigd, en beide lijnen doen dat ook nog eens individueel. Ik wil gewon dat mij y-as van 0 naar x loopt en datapunten zich daarnaar conformeren, ipv andersom. Dat lijkt me toch een heel logisch, maar toch krijg ik dat niet voor elkaar.
Wat doe ik verkeerd?

PSN: DutchTrickle PVoutput

Beste antwoord (via Maverick op 06-11-2020 13:51)


  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Hoe lees je de data in? Gezien het rare verloop van de Y-as lijkt het er op data als 'strings' interpreteert, en niet als int / float. Hetzelfde met de X-as: het lijkt alsof je strings hebt, en niet date/time objecten.

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Hoe lees je de data in? Gezien het rare verloop van de Y-as lijkt het er op data als 'strings' interpreteert, en niet als int / float. Hetzelfde met de X-as: het lijkt alsof je strings hebt, en niet date/time objecten.

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • Maverick
  • Registratie: Oktober 2001
  • Laatst online: 24-07 18:06
Daedalus schreef op vrijdag 6 november 2020 @ 11:46:
Hoe lees je de data in? Gezien het rare verloop van de Y-as lijkt het er op data als 'strings' interpreteert, en niet als int / float. Hetzelfde met de X-as: het lijkt alsof je strings hebt, en niet date/time objecten.
Ik lees de data in vanaf m'n arduino. Dat komt inderdaad binnen als een string over de seriële bus. Dus dat zou best wel eens een goede hint kunnen zijn. Ik zal eens kijken of ik de data om kan zetten voordat ik hem in m'n list gooi.

PSN: DutchTrickle PVoutput


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 25-07 17:37
Kijk eens naar de read_csv methode van pandas; dan heb je het meteen als Dataframe. Ook kun je daar meteen date parsing laten doen. Met het sep argument kun je aangeven wat het scheidingsteken van je databestand is.

Acties:
  • 0 Henk 'm!

  • Maverick
  • Registratie: Oktober 2001
  • Laatst online: 24-07 18:06
Afbeeldingslocatie: https://tweakers.net/i/dqe1pWfNSaMTC5tmkLCwIrwRpHA=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/eiJuvrQz9FYgHgjNhAtnCMhP.png?f=user_large

Gelukt. Ik gebruikte StringVar om de waarden te laten zien in tkinter, maar dat was dan weer niet handig hiervoor. Nu doet hij netjes wat ik zou verwachten.
Morrar schreef op vrijdag 6 november 2020 @ 13:30:
Kijk eens naar de read_csv methode van pandas; dan heb je het meteen als Dataframe. Ook kun je daar meteen date parsing laten doen. Met het sep argument kun je aangeven wat het scheidingsteken van je databestand is.
Ik lees de data niet in vanuit een csv. Dat was enkel een voorbeeld van hoe ik het wegschrijf. De data komt van sensoren op een Arduino.

[ Voor 40% gewijzigd door Maverick op 06-11-2020 13:53 ]

PSN: DutchTrickle PVoutput


Acties:
  • 0 Henk 'm!

  • Maverick
  • Registratie: Oktober 2001
  • Laatst online: 24-07 18:06
Ok, ik kom hier toch nog even terug. Ik wil deze grafiek om de x seconde updaten. Echter merk ik dat ik mijn geheugen vol begint te lopen. Ik neem aan dat ik iedere keer een nieuwe grafiek teken zonder de oude weg te gooien.
Ik heb al van alles geprobeerd, maar niets lijkt te werken.

- figuur sluiten vanuit matplotlib
- canvas destroyen in tkinter
- cobinatie van beiden
- garbage collector aanroepen

Dit is de code zoals ik hem nu samengesteld heb:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def Drawgraph():

    fig, ax = plt.subplots()  
    df=pd.DataFrame({'x': TimeStamps,
    'y1': flListPres1,'y2': flListTemp1,
    'y3': flListPres2,'y4': flListTemp2,
    'y5': flListPres3,'y6': flListTemp3,})

    ax.plot(df['x'], df['y1'], marker='o', markerfacecolor='blue', markersize=2, color='blue', linewidth=1)
    ax.plot(df['x'], df['y2'], marker='o', markerfacecolor='red', markersize=2, color='red', linewidth=1)
    
    ax.plot(df['x'], df['y3'], marker='o', markerfacecolor='green', markersize=2, color='green', linewidth=1)
    ax.plot(df['x'], df['y4'], marker='o', markerfacecolor='purple', markersize=2, color='purple', linewidth=1)

    ax.plot(df['x'], df['y5'], marker='o', markerfacecolor='yellow', markersize=2, color='yellow', linewidth=1)
    ax.plot(df['x'], df['y6'], marker='o', markerfacecolor='pink', markersize=2, color='pink', linewidth=1)


    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.get_tk_widget().grid(row=20, column=0, ipadx=40, ipady=20)
    plt.close('fig')
    canvas.get_tk_widget().destroy()
    gc.collect()
    print("Drawing graph")


Zo krijg ik dus nieteens een grafiek te zien, omdat ik de boel verwijder zodra ik hem teken, maar het geheugen blijft vollopen, dus dit is nog steeds niet voldoende. Als ik de functie "DrawGraph" niet aan roep heb ik dit niet, dus het ligt weldegelijk aan dit stukje code.

PSN: DutchTrickle PVoutput


Acties:
  • 0 Henk 'm!

  • Kraay89
  • Registratie: September 2012
  • Laatst online: 30-06 10:48
Matplotlib heeft een animation onderdeel. Klinkt als iets wat je misschien kan helpen om te doen wat je wil doen. Dit deel is specifiek bedoeld om iteratief nieuwe data aan je grafiek toe te voegen.

Acties:
  • 0 Henk 'm!

  • Maverick
  • Registratie: Oktober 2001
  • Laatst online: 24-07 18:06
Kraay89 schreef op maandag 9 november 2020 @ 12:05:
Matplotlib heeft een animation onderdeel. Klinkt als iets wat je misschien kan helpen om te doen wat je wil doen. Dit deel is specifiek bedoeld om iteratief nieuwe data aan je grafiek toe te voegen.
Die ben ik idd eerder tegengekomen, maar dat krijg ik niet aan het werk. Dat komt door de volgende regel die daarbij komt kijken:

Python:
1
ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), interval=25, blit=False)

Hierdoor wordt het lastig om mijn andere functies om de x seconde aan te roepen, en ook mijn tkinterface wil niet meer updaten. Ik kom er niet goed uit hoe ik dit op de juiste manier oplos.

PSN: DutchTrickle PVoutput


Acties:
  • 0 Henk 'm!

  • thlst
  • Registratie: Januari 2016
  • Niet online
Die gc.collect() doet niets met objecten met destructor bij python < 3.4
Pagina: 1