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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.