Forum: PC-Programmierung Python Matplotlib mut subplots und gemeinsamer x-Achse nur jedes 7 Label anzeigen


von Chandler B. (chandler)


Angehängte Dateien:

Lesenswert?

Hallo,
ich lasse mir mit python daten in subplots anzeigen. (siehe figure_1)
Dazu habe ich 8 Messungen am Tag über einen längeren Zeitraum gemacht 
(wird auch noch weiter gemessen). Diese werden in einer .csv gespeichert 
von wo ich mir die jetzt raus hole. Damit das weniger daten werden, habe 
ich dann schon für jeden Tag den Durchschnitt berechnet und lasse mir 
diesen dann anzegeigen.
Leider sind die Datums immer nohc sehr zusammengequetscht und ich würde 
mir gerne nur jeden 7. Tag mit einem Label anzeigen lassen.
Da komme ich aber absolut nicht weiter :/
1
        time = []
2
        speed = []
3
        energyWin = []
4
        energyLoose = []
5
        
6
        ... ... ...
7
        ... ... ...
8
9
        fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
10
        plt.setp(plt.xticks()[1], rotation=70, ha='right', visible=True)
11
        ax1.plot(time, speed)
12
        ax1.set_title('speed [m/s]')
13
        ax2.plot(time, energyWin)
14
        ax2.set_title('energy win [J]')
15
        ax3.plot(time, energyLoose)
16
        ax3.set_title('energy loose [J]')
17
        plt.show()

von Norbert (der_norbert)


Lesenswert?

Ohne es mit subplots zu testen:
1
#!/usr/bin/python3
2
# -*- coding: UTF-8 -*-
3
# vim:fileencoding=UTF-8:ts=4
4
5
from math import sin,radians
6
from matplotlib import pyplot as plt
7
8
x = [i for i in range(0, 360+1, 45)]
9
y = [sin(radians(i)) for i in range(360+1)]
10
11
plt.grid()
12
plt.xticks(x)
13
plt.plot(y)
14
plt.tight_layout()
15
plt.show()

: Bearbeitet durch User
von Tymn (werwolf92)


Lesenswert?

Ich hätte es so gemacht:
1
fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
2
ax1.plot(time, speed)
3
ax1.set_title('speed [m/s]')
4
ax2.plot(time, energyWin)
5
ax2.set_title('energy win [J]')
6
ax3.plot(time, energyLoose)
7
ax3.set_title('energy loose [J]')
8
tick_indices = range(0, len(time), 7)
9
tick_labels = [time[i].strftime('%Y-%m-%d') for i in tick_indices]
10
plt.xticks(ticks=[time[i] for i in tick_indices], labels=tick_labels, rotation=70, ha='right')
11
plt.show()

von Chandler B. (chandler)


Lesenswert?

Tymn schrieb:
> Ich hätte es so gemacht:
> fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
> ax1.plot(time, speed)
> ax1.set_title('speed [m/s]')
> ax2.plot(time, energyWin)
> ax2.set_title('energy win [J]')
> ax3.plot(time, energyLoose)
> ax3.set_title('energy loose [J]')
> tick_indices = range(0, len(time), 7)
> tick_labels = [time[i].strftime('%Y-%m-%d') for i in tick_indices]
> plt.xticks(ticks=[time[i] for i in tick_indices], labels=tick_labels,
> rotation=70, ha='right')
> plt.show()

das sieht schon viel übersichtlicher aus. danke dir.
Wenn jetzt noch die kleinen striche da wären (für jeden x-tick), wäre es 
noch etwas übersichtlicher. Aber so kann man es schonmal sehr gut lesen 
und ich kann da mal etwas weiter rumprobieren.

Danke dir :)

von Norbert (der_norbert)


Angehängte Dateien:

Lesenswert?

Chandler B. schrieb:
> Wenn jetzt noch die kleinen striche da wären (für jeden x-tick), wäre es
> noch etwas übersichtlicher.
1
#!/usr/bin/python3
2
# -*- coding: UTF-8 -*-
3
# vim:fileencoding=UTF-8:ts=4
4
5
from math import sin, cos, radians
6
from matplotlib import pyplot as plt
7
8
x = [i for i in range(0, 360+1, 1)]
9
xtpos = [i for i in range(0, 360+1, 5)]
10
xtlbl = [f'{i}°' if (i%15) == 0 else ''  for i in range(0, 360+1, 5)]
11
y1 = [sin(radians(i)) for i in range(360+1)]
12
y2 = [cos(radians(i)) for i in range(360+1)]
13
y3 = [sin(radians(i))*cos(radians(i)) for i in range(360+1)]
14
15
plt.xkcd()
16
fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
17
fig.set_size_inches((14.4, 9.0))
18
plt.xticks(xtpos, xtlbl)
19
plt.setp(plt.xticks()[1], rotation=45, ha='right', visible=True)
20
21
ax1.grid(color='r', linestyle='-', linewidth=2)
22
ax1.plot(y1)
23
ax1.set_title('something')
24
ax2.grid(color='g', linestyle='-', linewidth=2)
25
ax2.plot(y2)
26
ax2.set_title('something else')
27
ax3.grid(color='b', linestyle='-', linewidth=2)
28
ax3.plot(y3)
29
ax3.set_title('something times something else')
30
31
plt.tight_layout()
32
plt.show()

von Tymn (werwolf92)


Angehängte Dateien:

Lesenswert?

Chandler B. schrieb:
> das sieht schon viel übersichtlicher aus. danke dir.
> Wenn jetzt noch die kleinen striche da wären (für jeden x-tick), wäre es
> noch etwas übersichtlicher. Aber so kann man es schonmal sehr gut lesen
> und ich kann da mal etwas weiter rumprobieren.
>
> Danke dir :)

Irgendwas ist ja immer :D

Brauchst nur das hinzufügen :)
1
minor_tick_indices = range(0, len(time), 1)  # macht jeden tag
2
# minor_tick_indices = range(0, len(time), 3)  # hier jeden dritten tag
3
4
ax3.set_xticks([time[i] for i in minor_tick_indices], minor=True)

Im ganzen dann so:
1
fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
2
ax1.plot(time, speed)
3
ax1.set_title('speed [m/s]')
4
ax2.plot(time, energyWin)
5
ax2.set_title('energy win [J]')
6
ax3.plot(time, energyLoose)
7
ax3.set_title('energy loose [J]')
8
tick_indices = range(0, len(time), 7)
9
tick_labels = [time[i].strftime('%Y-%m-%d') for i in tick_indices]
10
plt.xticks(ticks=[time[i] for i in tick_indices], labels=tick_labels, rotation=70, ha='right')
11
minor_tick_indices = range(0, len(time), 1)  # Jeder Tag
12
ax3.set_xticks([time[i] for i in minor_tick_indices], minor=True)
13
plt.show()

: Bearbeitet durch User
von Chandler B. (chandler)


Lesenswert?

Tymn schrieb:
> Irgendwas ist ja immer :D
>
> Brauchst nur das hinzufügen :)

Das ist super. das funktioniert gar nicht mal so schlecht ;).
Ne, das ist genau das was ich gesucht habe :)

Ich danke dir :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.