Plot mit drei Achsen und zwei unterscheidlichen Plottypen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
uschmidt
User
Beiträge: 14
Registriert: Sonntag 9. April 2017, 15:00

Hallo zusammen,
in einem Plot würde ich gerne zwei verschiedene Variablen über eine Zeitreihe darstellen. Dabei soll eine Variable als Balken und die andere als Linie dargestellt werden. Bisher habe ichs aber leider nur hinbekommen, beide als Linie darzustellen.

Bisher sieht mein Diagramm so aus:

http://imgur.com/a/veIeC

Mein Code sieht wie folgt aus:

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt

dt=pd.read_csv('dt.csv')

x=dt.x
y1=dt.y1
y2=dt.y1

def two_scales(ax1, time, data1, data2, c1, c2):
    ax2 = ax1.twinx()

    ax1.plot(time, data1, color=c1) #Wenn ich dieser Stelle 'ax1.bar' eingebe, wird mir ein leerer Plot ausgegeben
    ax1.set_ylabel('y1')

    ax2.plot(time, data2, color=c2)
    ax2.set_ylabel('y2')
    return ax1, ax2

fig, ax = plt.subplots()
ax1, ax2 = two_scales(ax, x, y, z, 'r', 'b')

for tick in ax.get_xticklabels():
    tick.set_rotation(90)

plt.show()
Danke schon mal
Zuletzt geändert von Anonymous am Samstag 12. August 2017, 14:15, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

uschmidt hat geschrieben:Dabei soll eine Variable als Balken und die andere als Linie dargestellt werden.
Balken und Linien sind hier zu sehen, nur dürfte das wohl weniger Deinen Vorstellungen entsprechen:

viewtopic.php?t=29338
uschmidt
User
Beiträge: 14
Registriert: Sonntag 9. April 2017, 15:00

Nee, ich dachte vom Stil an sowas

https://goo.gl/images/a5AGkc
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Diese Variante habe ich bisher noch nicht gesehen, zumindest nicht mit Matplotlib. Bei Histogrammen hast Du zwar Varianten mit Balken und Linien aber halt nur eine Linie passend zu den Balken. Was Deinen Vorstellungen entspricht, da sah ich nur Beispiele mit Visual PowerPoint.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ist es in etwa das, was Dir von der Darstellung vorschwebt?

Frage mich nicht, was das bedeuten soll oder wie ich das gemacht habe, ich habe keine Ahnung, habe nur so lange etwas aus unterschiedlichen Beispielen kopiert und probiert, bis es von der Darstellung mit der Linie und Balken in etwa passen müsste.

Ist sicherlich noch sehr ungenau und der Code dürfte zu wünschen übrig lassen, doch den kannst Du Dir selbst nachbessern.

Bild

Code: Alles auswählen

import matplotlib.pyplot as plt

a_werte = [0.5, 3, 4, 12, 10, 12, 9, 10, 11]
y_werte = [0.5, 3, 10, 7, 5, 3, 4, 5, 6, 8]
n_wert  = len(y_werte)
x_werte = range(n_wert)

figur, axe_balken = plt.subplots()

axe_balken.plot(a_werte)
axe_balken.set_xlabel("x-Label", color="#CE6600")
axe_balken.set_ylabel("y-Label", color="#0000C0")
axe_balken.bar(x_werte, y_werte, 0.6, color="#CE6600")

axe_linie = axe_balken.twinx()
axe_linie.tick_params("y_werte", colors="#009000")

figur.tight_layout()
plt.show()
uschmidt
User
Beiträge: 14
Registriert: Sonntag 9. April 2017, 15:00

Danke, so in etwa hatte ich mir das vorgestellt. In deinem Beispiel ist die zweite y-Achse allerdings überflüssig, da beide Variablen die gleiche Skala benutzen. Das ist bei meinen Daten leider nicht möglich
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Na ja, bisher gefallen mir ja auch nur einige bunte Grafiken von Matplotlib, tiefgehender habe ich mich damit noch nicht beschäftigt. Liegt jetzt auf 2 y-Achsen verteilt, nur jetzt verschwindet die andere Linie nicht mehr. Bin mir aber sicher, dass Du dieses kleine restliche Problemchen noch lösen wirst, wenn Du Dich etwas mit der Dokumentation beschäftigst.

Bild

Code: Alles auswählen

import matplotlib.pyplot as plt

y1_werte = [0.5, 3, 6, 7, 5, 3, 4, 5, 6, 8]
n1_wert  = len(y1_werte)
x1_werte = range(n1_wert)

y2_werte = [0.5, 12, 15, 14, 10, 12, 9, 10, 14]
# Eine gemeinsame sollte für x genügen?
# n2_wert  = len(y2_werte)
# x2_werte = range(n2_wert)

figur, achse_balken = plt.subplots()

achse_balken.plot(y1_werte)
achse_balken.set_xlabel("x-Label", color="#ce6600")
achse_balken.set_ylabel("y-Label 1", color="#ce6600")
achse_balken.bar(x1_werte, y1_werte, 0.6, color="#ce6600")

achse_linie = achse_balken.twinx()
achse_linie.plot(y2_werte)
achse_linie.set_ylabel("y-Label 2", color="#0000C0")
achse_linie.tick_params(y2_werte)

figur.tight_layout()
plt.show()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Melewo: was bewirkt denn Ziele 14 bei Dir?
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ja, das war es, Zeile 14 war zu viel, nun ist alles klar.
Antworten