Python Matplotlib mut subplots und gemeinsamer x-Achse nur jedes 7 Label anzeigen

OP #7707544
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()
Angehängte Dateien:
#7707552
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()
#7707597
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()
OP #7707649
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 :)

#7707697
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()
Angehängte Dateien:
#7707912
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()
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren