in einem Diagramm 2 x-Achsen

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.
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

Hallo im Forum,

ich wollte fragen ob es möglich ist in einem Diagramm 2 x-Achsen zu realisieren. Mit twinx ist es ja möglich eine weitere y-Achse einzufügen. Das gleiche wär jetzt für ne x-Achse auch nicht schlecht.

Bevor die Frage nach der Sinnigkeit kommt hier kurz eine Erklärung wie ich es nutzen möchte:
Ich habe einmal eine Kurve die z.B. von 13 Uhr bis um 15 Uhr aufgenommen ist und die Temperatur wiederspiegelt. Im gleichen Diagramm möchte ich jetzt eine Kurve die die Feuchtigkeit(oder ähnliches) anzeigt, allerdings fängt die x-Achse dieser Kurve bei 13.03 Uhr an. Ihr seht da ist ein Versatz, welcher mich eigentlich auch nicht weiter stört, das Diagramm soll mir ja nur die Trends der Kurve und eine gewisssen Zusammenhang zeigen.

Jetzt passiert es das wenn ich der 2 Kurve neue x-Werte gebe werden die scheinbar an die x-Werte der ersten Kurve drangehängt.

Vielleicht kann mir ja einer von euch helfen.
Vielen Dank schon mal.

MfG Nait
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Nait: Wo kommt denn dieses "twinx" her? Sollte es sich um Matplotlib handeln, so gibt es dort auch "twiny".

Deine Erklärung verstehe ich allerdings nicht: Du plottest zwei Zeitreihen (Temperatur und Feuchte), verschiebst aber die Feuchte um drei Minuten in die Vergangenheit. Die um 13 Uhr gezeigte Feuchte, wurde eigentlich um 13:03 gemessen. Gibt es dafür einen guten Grund?

Vielleicht zeigst du mal etwas Code.

Grüße
Gerrit
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

Sorry wenn meine Erklärung ein bisschen dürftig war.

Ich lese die Werte für die zugehörigen Kurven aus CSV Dateien aus. Erstellt wurden die CSV Dateien von einem Temperaturofen der ziemlich viele Werte für die Temperatur annimmt und eben ab 13 Uhr anfängt mitzuloggn. Und die Feuchtigkeit erst um 3 Minuten später und mit viel weniger Datenpunkten. So komme ich bei der Temperatur auf 4-5x größere Anzahl an Zeitwerten als bei der Feuchtigkeit.
Der Versatz von 3 Minuten stört mich aber an sich nicht. In der Darstellung soll nur ein gewisser Zusammenhang der 2 Kurven gezeigt werden.

Hier mal ein Teilstück des Codes den ich benutze:

Code: Alles auswählen

        #TimeAchse ist eine Methode in der die x Achsen erstellt werden, wobei Ausfall hier die Feuchtigkeit darstellt        
        self.timeAchseData = self.TimeAchse(self.data,typ = 'Ausfall')
        
        #self.timeKurve sind y-Werte die schon in vorigem Quelltext erstellt wurden
        self.plotCH_Zeit.plot(self.timeAchseData,self.timeKurve,'g',linewidth = 0.6)

        ofenKurve  = self.plotCH_Zeit.twinx()

        try:
            self.timeAchseOfen = self.TimeAchse(self.dataOfen,typ = 'Ofen')

            #self.ofenKurve ist die Temperatur die ebefnalls schon in vorhergegangenem Code erstellt
            #wurde   
            ofenKurve.plot(self.timeAchseOfen,self.ofenKurve,'r',linewidth = 0.8)
        except:
            reply = QtGui.QMessageBox.information(self, 'Message',"Info:\r\nEs sind keine Ofendaten vorhanden.",QtGui.QMessageBox.Ok)

        c = 0
        for b in range(len(self.timeKurve)):
            if self.timeKurve[b] > 0:                self.plotCH_Zeit.text(self.timeAchseData[b],self.timeKurve[b],'CH'+str(self.errorkanal[c]),ha='center',v 
                a = 'bottom',fontsize = '6',rotation = 90) 
                c = c+1
Ich hoffe es wird ein bisschen ersichtlich was ich tun möchte. Ach und du hast recht ich benutze Matplotlib zum plotten. Hatte ich vergessen zu erwähnen ;) Sorry nochmals.

Aber Danke erstmal für die promte Antwort, an die Tatsache das es ein twiny gibt hab ich noch gar nicht gedacht :D Vielleicht geht das so wie ich es mir Vorstell.

Danke
MfG Nait
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

in einem Diagramm 2 x-Achsen : twiny

Nur bin ich mir immer noch nicht sicher wieso du zwei x-Achsen haben willst. So etwas macht doch nur Sinn, wenn du verschiedene unabhänige Skalen hast (wie Temp. & Feuchtigkeit). Aber hier geht es doch nur um die Zeiteinheit und wieso du diese verschieben willst ist mir nicht ganz klar.

Und wenn ich zwei Kurven nacheinander plotte, dann werden die nicht 'aneinandergehängt', sondern 'übereinander gelegt'.
Beispiel:

Code: Alles auswählen

from matplotlib import pyplot as plt

plt.plot(range(10), range(10))
plt.plot(range(2,14)range(3,15))
plt.show()
Wie sehen den deine x- und y-Daten aus?
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

Also ich versuchs nochmals zu erklären. Hoffe ich bekomm das hin.

Ich verschiebe die Zeit nicht absichtlich, ich bekomme die Daten schon mit diesem Versatz.
Z.B. sehen die x Werte so aus:
Z[hh:mm:ss] | T[°C]
15:00:00|20
15:00:05|20.1
usw...

die y Werte sehen dann so aus:
Z[hh:mm:ss] | F[%]
15:03:00|50
15:03:07|50.1

An diesen Werten kann und will ich auch nichts änder, die werden so aus den CSV Dateien gelesen.
Jetzt wär es schön gewesen anstatt 2 Diagramme, einmal mit der Temperatur und der Feuchtigkeit, die zwei Kurven trotz unterschiedlicher x- und y-Achse in einem Diagramm anzuzeigen. Super wäre es jetzt wenn ich zu einer seperaten y-Achse auch eine seperate x-Achse anzeigen lassen könnte.

MfG Nait
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Nait: Ich sehe in deinen Daten keinen Grund für unterschiedliche x-Achsen. Im Gegenteil, das wäre meiner Meinung sogar schädlich. Der erste Feuchtewert (15:03:00) gehört IMHO in der Darstellung dorthin wo er gemessen worden ist. Nämlich 3 Minuten hinter den ersten Temperaturwert. Ich verstehe dich die ganze Zeit so, dass du diesen Feuchtewert gerne auf der x-Achse bei 15:00:00 dargestellt hättest. Meiner Meinung eine Verfälschung von Messwerten. Etwas was man tunlichst sein lassen sollte.
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

In meinem Diagramm erstell ich einmal eine x-Achse auf der Basis der Zeitwerte der Temperatur. Als y-Werte dienen mir die Temperaturwerte. Die Anzahl beider Werte geht so in die 10000.

Wenn ich das Plotte hab ich schön die Temperaturkurve.

Die x-Achse der Feuchtigkeit fäng aber erst 3 minuten später an, außerdem habe ich für die Feuchtigkeit auch nur ca. 1000 Messpunkte. Damit eben keine Verfälschung auftritt möchte ich die Feuchtigkeit anhand ihrer Zeitwerte und die Temperatur auf ihrer eignenen Zeitachse darstellen. Und das eben in einem Diagramm.

Der Grund für unterschiedliche x-Achsen ist der, dass es unterschiedliche x-Achsen sind! Und ich kann diese zwei Achsen auch nicht miteinander verbinden. Wenn es verwirrt kann man sich auch ein Beispiel vorstellen in dem einmal eine Kurve anhand der Zeit dargestellt wird und dann eine Zweite Kurve welche anstatt Zeitwerte als x-Achse eine Standard Zahlenreihenfolge(1,2,3,4...) benutzt. Aber nun einfach in einem Diagramm.

Ob dies Sinnig ist oder nicht, sei mal dahingestellt. Die Frage von mir: Ist das möglich? Wenn ja wie kann man das realisieren?

Danke schonmal. Hab mir schon gedacht das es kompliziert zum Erklären wird ;D

MFG Nait
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

@gkuhl: ich glaube er möchte 2 x-Achsen haben. Eine die von 15:00:00 - ?? geht für die Temparatur und eine die von 15:03:00 - ?? geht für die Feuchtigkeit. Also möchte er die Kurve nicht wirklich verschieben, aber das Diagram wird dann furchtbar schwierig zum Interpretieren werden. Super wäre natürlich wenn er zu einer sepearaten y-Achse seine x-Achse beibehalten könnte.

@Nait: Stehen deine Daten so in der CSV-Datei?

15:00:00|20
15:00:05|20.1
usw...

Wie genau liest du die dann aus? Wie sehen die aus wenn du sie an matplotlib übergibst?

Was du eigentlich machen solltest ist nicht eine neue x-Achse erstellen, sondern auf die x-Achse der ersten Kurve 'mappen'. Dann sind deine Kurven zwar leicht verschoben, aber dies entspricht ja auch deinen empirischen Daten.
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

Nein die sehen nicht so aus, das war Beispielhaft gemeint,

die Werte der Feuchtigkeit sehen so aus:
15.02.2011 11:22:23;24.2;25.0;-47.0;180.0;99.0;93.0;10.0;98.0;0.0;-90.0;190.0;0.0;0.0;100.0;30.0;4200.0;1;1;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;14701.4;0.0;999999.0;170577.0;30.0;60.0;

eingelesen durch den csv reader. Danach werden die aufbereitet(durch split, replace etc.) und dann hab ich einmal meine x-Werte(Datum,Zeit) und meine y-Werte (Feuchtigkeit).
Das funktioniert auch.

Die CSV Datei für die Temperatur sieht anders aus wird aber so aufbereitet das die quasi die gleiche Formatierung haben. Nur sind die Zeitachsen zueinander verschoben und die Anzahl an Werten eben auch.

Wenn ich den Tip mit dem mappen verstehe, sollte ich jetzt meine kleinere Zeitachse so erweitern das diese auf die längere Zeitachse passt. Mir ist aber nicht klar wie das gehen soll, schon allein deswegen weil die Timesteps der zwei Kurven unterschiedlich sind. In dem einem wird alle 0,5 sekunden und im anderem nur ca. alle 7 sekunden ein Messwert aufgenommen. Außerdem kann das in späteren Auswertungen sich von csv Datei zu csv Datei unterscheiden.

Falls es da aber ne gute Möglichkeit gibt, wär ich auch zufrieden dann bräuchte ich nur eine x-Achse, solange ich die 2 Achsen aber nciht verbinden kann wird ohne ne 2te x-Achse schwierig.
BlackJack

@Nait: Also ich würde die Sinnfrage nicht so einfach vom Tisch wischen. Wenn das zwei völlig unabhängige Datenreihen sind, sollten sie auch nicht im gleichen Diagramm abgebildet werden. Das hat keine Vorteile. Dadurch das beide Reihen in einem ähnlichen Zeitraum und am selben Ort erfasst wurden ist das in einem Diagramm verwirrend und lädt zu Fehlinterpretationen ein. Warum muss das also in ein Diagramm?
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Primär interessiert mich eigentlich welches Format deine Zeitstempel haben, wenn du sie an matplotlib übergibst.

Ich würde dir ja mal datetime.datetime ans Herz legen.

Dann könntest du das ca. so machen:

Code: Alles auswählen

from datetime import datetime

x = [datetime(2010,10,20), datetime(2011,10,20), datetime(2012,10,20)]
x2 = [datetime(2010,11,25), datetime(2012, 3, 18) ]
plt.plot(x,range(3))
plt.plot(x2,range(2))
plt.show()
Sollte dir dann die Achsenbeschriftung missfallen, dann kannst du einen eigenen FuncFormatter nutzen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Nait: Eine Frage musst du mir noch beantworten: Angenommen du hast zwei Zeiten (17:00 und 18:00 Uhr) an denen die Temperatur gemessen worden ist. Weiter hast du einen Feuchtewert der um 17:30 gemessen worden ist. Die beiden Temperaturwerte werden auf der ersten x-Achse bei den Beschriftungen für 17:00 und 18:00 geplottet. Wo soll jetzt der Feuchtewert, im Verhältnis zur ersten x-Achse (Temperaturachse), geplottet werden? Und wie lautet die Beschriftung der zweiten x-Achse (Feuchteachse), an der sich der Feuchtewert von 17:30 befindet?
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

@BlackJack:
Ich bette dieses Diagramm in eine GUI und in dieser hab ich nicht mehr Platz für ein weiteres Diagramm. Außerdem sollte es in einem Diagramm leichter sein die 2 Kurven relativ zu einander zu bewerten.

@Rekrul:
ich benutze das dateime.datetime,
hier mal meine Methode die die Zeitachse erstellt:

Code: Alles auswählen

def TimeAchse(self, data,typ):
        timeAchse = ['']*len(data)
        for i in range (len(data)):
            datebuffer = data[i][0]
            datebuffer = datebuffer.replace(' ','.')
            datebuffer = datebuffer.replace('/','.')
            datebuffer = datebuffer.replace(':','.')
            datebuffer = datebuffer.replace('s','.')
            datebuffer = datebuffer.split('.')
 
            if typ == 'Ofen':
                timeAchse[i] = datetime.datetime(int(datebuffer[2]),int(datebuffer[1]),int(datebuffer[0]),int(datebuffer[3]),
                                                int(datebuffer[4]),int(datebuffer[5]))
            elif typ == 'Ausfall':
                timeAchse[i] = datetime.datetime(int(datebuffer[2]),int(datebuffer[0]),int(datebuffer[1]),int(datebuffer[3]),
                                                int(datebuffer[4]),int(datebuffer[5]),int(datebuffer[6]))

        return timeAchse
Sorry ich kenn mich noch nicht so gut in Python aus, aber was ist ein FuncFormatter?

@gkuhl:
Die Beschriftung der x Achse wäre die Zeitachse der Feuchtigkeit, also wenn man eine 2te x-Achse erstellen könnte. Wenn das nicht geht, muss ich wohl mit dem mappen arbeiten. Wie auch immer ich das hinbekommen soll ;D

Danke
BlackJack

@Nait: Aber gerade das relativ zueinander Bewerten geht doch nicht wenn die Zeitpunkte der beiden Kurven nicht übereinstimmen. Eine solche Interpretation ist schlicht *falsch*.
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

@BlackJack:
Das kann man so nicht sagen. Stell dir vor du hast eine Kurve, Startpunkt ist bei x=1. Diese Kurve ist stetig steigend. Jetzt hast du eine andere Kurve Startpunkt x= 5.4 auch stetig steigend. Du würdest jetzt den Trend der 2 Kurven erkennen. Nämlich das beide die ganze zeit über steigen. Wenn du nun 2 x Achsen unter dem Diagramm hast kannst du auch zuordnen in welchem Zeitraum welche kurve eher gestiegen ist. Man würde also den Trend der Kurven relativ zueinander betrachten und kann dann selber interpretieren wie die Kurven zueinander stehen. Ich hoffe ich liege mit der Aussage nicht daneben und es wird klar was ich meine. Allerdings seh ich schon das es wohl nicht geht einem Diagramm 2 x- und 2 y-Achsen zuzuordnen.

Danke trotzdem.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

@BlackJack: wieso soll eine solche Interpretation schlicht *falsch* sein? Die Werte haben doch lediglicht eine andere Abtastfrequenz, liegen aber großteils im selben Zeitraum. Da lassen sich dennoch Korrelationen der Werte feststellen.

@Nait: Bist du dir sicher, dass du in deiner TimeAchse-Funktion ( :? ) nicht vielleicht einen Fehler hast und es daher bei dir so ausschaut, als würde matplotlib die Kurven 'aneinanderhängen'?
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

Das ist natürlich möglich. Aber da ich nicht weiß wie ich eine zweite x-Achse zusätzlich ur zweiten y-Achse einbaue, verschieben sich die Kurven. Das ist meien Vermutung. Wie twiny funktioniert versteh ich, auch wie twinx an sich funktioniert. Jedoch nicht wie ich die 2 kombinieren kann.

Kann da jemand nen kurzen Quellcode geben wie das aussehen muss?

Hier mal mein teil ncohmals:

Code: Alles auswählen

self.timeAchseData = self.TimeAchse(self.data,typ = 'Ausfall')
       
        #self.timeKurve sind y-Werte die schon in vorigem Quelltext erstellt wurden
        self.plotCH_Zeit.plot(self.timeAchseData,self.timeKurve,'g',linewidth = 0.6)

        ofenKurve  = self.plotCH_Zeit.twinx()

        try:
            self.timeAchseOfen = self.TimeAchse(self.dataOfen,typ = 'Ofen')

            #self.ofenKurve ist die Temperatur die ebefnalls schon in vorhergegangenem Code erstellt
            #wurde  
            ofenKurve.plot(self.timeAchseOfen,self.ofenKurve,'r',linewidth = 0.8)
        except:
            reply = QtGui.QMessageBox.information(self, 'Message',"Info:\r\nEs sind keine Ofendaten vorhanden.",QtGui.QMessageBox.Ok)
Wo müsste ich da twinx einbauen das es funktioniert? Ich habe schon damit rumgespielt jedoch bisher nur Fehlermedlungen bekommen.

Bin für jede Hilfe dankbar
BlackJack

@Rekrul: Wenn die beiden Zeiträume nahezu identisch sind, dann kann man die beiden Datenreihen mit *einer* Zeitachse darstellen. Also müssen sie ja schon so verschieden sein, dass man die beiden Kurven übereinander gelegt nicht mehr sinnvoll in einem Diagramm vergleichen kann. Und dann ist eine relative Interpretation falsch. Da kann man sich noch so sehr anstrengen, so eine Grafik suggeriert einfach einen falschen Zusammenhang.
Nait
User
Beiträge: 13
Registriert: Dienstag 26. April 2011, 10:53

@BlackJack:
Das stimmt so nicht, wie gesagt du kannst den Trend der zwei Kurven betrachten. Weiteres Beispiel:
Eine Firma produziert Bauklötze. Im jahr 2008 wurde allerdings nur sporadisch aufgenommen wie viele Klötze täglich gebaut wurden. In den Darauffolgenden Jahren wurden immer mehr Klötze produziert und aufgenommen. Jetzt sind die x-Achsen aller Jahre unterschiedlich, jedoch kann anhand jeder Kurve gesehen werden ob die Firma mehr Klötze Produziert oder weniger. Eben weil nur der Trend betrachtet wird. Das alles ist auch in einem Diagramm Darstellbar und solange klar ist zu welcher Kurve welche x-Achse gehört ist die Interpretation auch kein problem.
BlackJack

@Nait: Der Vergleich hinkt weil die Anzahl der Bauklötzchen ja die selbe Messgrösse ist *und* hier die beiden Zeiträume ganz klar disjunkt sind. Allerdings wäre es auch hier ein leichtes die Daten so darzustellen, dass sie tatsächlich relativ verglichen werden können. Also dass *eine* Skala mit einem Jahreszeitraum existiert und nur in der Legende die Jahreszahl steht. Dann kann man dort auch wieder die beiden Kurven direkt vergleichen und ablesen wie die Entwicklung denn zum Beispiel Mitte Juni in den beiden Jahren war.
Antworten