Wie (richtig) Werten und Zeitangaben plotten?

Tabellen und Grafiken erstellen und anordnen


Tobias85
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: So 1. Jan 2012, 23:39

Wie (richtig) Werten und Zeitangaben plotten?

Beitrag von Tobias85 »

Hallo zusammen,

ich bin nun bei einem weiteren Problem, wie plotte ich Datumswerte richtig? Ich habe hier im Forum einen Thread dazu gefunden, allerdings ohne vollständiger Lösung. Das Minimalbeispiel erzeugt einen Plot mit einer senkrechten Linie, dabei bin ich der Meinung die Grenzen richtig angegeben zu haben. Auch erscheint eine Warnung: "Axis range for axis x is approximately empty; enlarging it [...]", gebe ich allerdings die Achsenbeschriftung an, erhalte ich einen Fehler, dass das Datumsformat nicht stimmt (Paragraph ended before \pgfcalendar@datetojulian was complete). Der Plan ist eigentlich, den Graphen über die Breite laufen zu lassen und die Beschriftung der X Achse nur alle 30 Min (für das Bsp alle 5 Sek) zu erzeugen, damit sich nichts überschneidet. Könnt ihr mir helfen?
\documentclass{article} 
\usepackage{tikz} 
\usepackage{pgfplots} 
\usepackage{verbatim}
\usepgfplotslibrary{dateplot} 
%\pgfplotsset{compat=1.3, axis line style={ultra thin}, tick style={ultra thin,black}, major tick length={0.1cm}, minor tick length={0.06cm}} 
\pgfplotsset{compat=newest, major tick length={0.1cm}}
\begin{document} 
  %\thispagestyle {empty} 
  \begin{tikzpicture} 
    \begin{axis}[ 
        date coordinates in=x, 
        xticklabel={\hour:\minute:\second}, 
        %x tick label style={align=center}, 
        %xtick={0:00:05,0:00:10,0:00:15}
        xmin={01-01-2015 00:00:00}, 
        xmax={01-01-2015 00:00:01},
        xlabel={Zeit [h:mm]},
        ylabel={RAM [KB]},
      ] 
      \addplot table[col sep=comma,x=zeit,y=ram]{test.txt};
    \end{axis} 
  \end{tikzpicture} 
\end{document} 
 
 
Von folgenden Werten:
zeit,ram
01-01-2015 0:00:00,48668
01-01-2015 0:00:06,50552
01-01-2015 0:00:11,52108
01-01-2015 0:00:16,58488
01-01-2015 0:00:21,59000
01-01-2015 0:00:26,59000
01-01-2015 0:00:31,60156
01-01-2015 0:00:36,60396
01-01-2015 0:00:42,61888
...
Vielen Dank, Tobias


PS: wie kann ich die Grafik direkt anzeigen lassen?

EDIT: danke :)
Bild
Dateianhänge
Bildschirmfoto 2015-02-08 um 13.12.09.png
Bildschirmfoto 2015-02-08 um 13.12.09.png (23.37 KiB) 4702 mal betrachtet
Zuletzt geändert von Tobias85 am Mo 9. Feb 2015, 12:14, insgesamt 2-mal geändert.

Stamm-

Ein Anfang

Beitrag von Stamm- »

Der hier gezeigten gekürzten Liste mit den Werten ist zu entnehmen, dass da noch sehr viele weitere Werte dranhängen, vielleicht von einem ganzen Jahr. Wie man Datum und Zeit als Marken an der Abzisse (x-Achse) in ein Diagramm mit »pgfplots« aufnehmen kann, weiß ich nicht genau. Über ein solches Format habe ich in der Anleitung zu diesem Paket nichts gefunden.

Vielleicht hilft die Angabe der Option xtick=data für die Umgebung axis. Aber nur dann , wenn ein Umweg über die Nachbereitung des Datensatzes eingeschlagen wird. Dazu zählt dann die Löschung des Datums, so dass nur die Zeit übrig bleibt. Ich denke, dass das mit einer Tabellenkalkulation (Gnumeric, LibreOffice Calc) möglich ist. Dabei könnten Datum, Zeit und Messwert in eine Tabelle mit drei Spalten importiert, die Spalte mit dem Datum gelöscht und der Datensatz als Datei mit reinem Text (*.csv, *.dat, *.txt) exportiert werden.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Nach dem Laden der Bibliothek dateplot und der Angabe des Stils date coordinates in=x für die axis Umgebung, gilt entsprechend der Doku von pgfplots
Input coordinates may be of the form
<year>-<month>-<day>
or they may contain times as
<year>-<month>-<day> <hour>:<minute>.
In Deinem Datensatz müsste deshalb das Datum anders angegeben werden, statt 01-01-2015 müsste dort 2015-01-01 stehen. Führende Nullen können auch weggelassen werden, d.h. es wäre auch 2015-1-1 möglich.

Die Angabe von Sekunden ist dagegen nicht vorgesehen. Wenn Du 2015-01-01 00:01:30 angibst, werden die 30 Sekunden einfach ignoriert. Allerdings wäre es möglich die Minuten als Dezimalzahl darzustellen, d.h. letztere Zeit durch 2015-01-01 00:01.50.

Hier ist deshalb ein Beispiel mit einem anderen Datensatz
\begin{filecontents*}{test1.txt}
zeit,ram 
 2015-01-01 00:00,48668 
 2015-01-01 00:01,50552 
 2015-01-01 00:03,52108 
 2015-01-01 00:04,58488 
 2015-01-01 00:08,59000 
 2015-01-01 00:09,59000 
 2015-01-01 00:10,60156 
 2015-01-01 00:11,60396 
 2015-01-01 00:15,61888 
\end{filecontents*}

\documentclass[margin=10pt]{standalone} 
\usepackage{pgfplots} 
\usepgfplotslibrary{dateplot} 
\pgfplotsset{compat=newest, major tick length={0.1cm}} 
\begin{document} 
   \begin{tikzpicture} 
     \begin{axis}[ 
         date coordinates in=x,
         xticklabel={\Hour:\minute},
         xmin={2015-01-01 00:00}, 
         xmax={2015-01-01 00:20},
         xlabel={Zeit [h:mm]}, 
         ylabel={RAM [KB]}, 
       ] 
       \addplot table[col sep=comma,x=zeit,y=ram]{test1.txt}; 
     \end{axis} 
   \end{tikzpicture} 
\end{document} 
Aus Deinem xlabel habe ich geschlussfolgert, dass Du die Stunden einstellig angeben willst und deshalb beim xticklabel \Hour statt \hour verwendet.

Bild

Falls der dargestellte Zeitbereich sehr eng ist, d.h. zum Beispiel nur 10 Minuten beträgt, kann es sein, dass Du einen !Dimension too large Fehler bekommst. Dann hilft es date ZERO sinnvoll festzulegen, z.B. date Zero=2015-01-01.

Gruß
Elke

PS: Bilder kannst Du anzeigen lassen, in dem Du auf den Img Button klickst, die URL des hochgeladenen Bildes einfügst und noch einmal auf den Img Button klickst.
Dateianhänge
gl_dateplot.png
gl_dateplot.png (13.11 KiB) 3259 mal betrachtet
Zuletzt geändert von esdd am Mo 9. Feb 2015, 14:21, insgesamt 1-mal geändert.

Tobias85
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: So 1. Jan 2012, 23:39

Beitrag von Tobias85 »

Sehr schön, vielen Dank euch beiden!
Was mich wundert, wieso steht die 23 direkt unter der rechten Kante? Die Messungen laufen über 24h, deine Vermutung war also absolut richtig ;)

Es gibt noch zwei Dinge die ich nicht hinbekomme bezüglich "extra x/y tick style". Links die 1930 etwas kleiner darzustellen (normal oder minor kennt er nicht) und mein Versuch die 2h als 2:03 darzustellen gelang mir auch nicht. Hast du dazu noch einen Tipp?
\documentclass[margin=10pt]{standalone} 
\usepackage{pgfplots} 
\usepgfplotslibrary{dateplot} 
\pgfplotsset{compat=newest, major tick length={0.1cm}} 
\begin{document} 
   \begin{tikzpicture} 
     \begin{axis}[ 
         date coordinates in=x, 
         xticklabel={\Hour}, 
         xmin={2015-01-01 00:00}, 
         xmax={2015-01-02 00:01}, 
         xlabel={Zeit [h]}, 
         ylabel={RAM [MB]},
         %extra x tick style={\Hour:\minute},
         extra x ticks={2015-01-01 2:03},
         extra y ticks={1930},
         %extra y tick style={normal},
         y tick label style={/pgf/number format/1000 sep=},
       ] 
       \addplot table[mark=none,col sep=comma,x=zeit,y=ram]{mrsh_ram.csv}; 
     \end{axis} 
   \end{tikzpicture}
\end{document}
Bild

Vielen lieben Dank, Tobias
Dateianhänge
Bildschirmfoto 2015-02-09 um 09.27.04.png
Bildschirmfoto 2015-02-09 um 09.27.04.png (34.76 KiB) 3250 mal betrachtet

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Wie Du die zusätzlichen Ticklabel beschriften und diese Beschriftung formatieren kannst, steht eigentlich in der Doku. Hier ist jetzt trotzdem ein Beispiel. Allerdings habe ich jetzt keine Lust, mir Daten auszudenken, die zu Deiner Abbildung passen und verwende deshalb meine vorherigen. Aus dem gleichen Grund kann ich auch das Problem mit der 23 nicht reproduzieren.
\begin{filecontents*}{test1.txt} 
 zeit,ram 
  2015-01-01 00:00,48668 
  2015-01-01 00:01,50552 
  2015-01-01 00:03,52108 
  2015-01-01 00:04,58488 
  2015-01-01 00:08,59000 
  2015-01-01 00:09,59000 
  2015-01-01 00:10,60156 
  2015-01-01 00:11,60396 
  2015-01-01 00:15,61888 
\end{filecontents*} 

\documentclass[margin=10pt]{standalone} 
\usepackage{pgfplots} 
\usepgfplotslibrary{dateplot} 
\pgfplotsset{compat=newest, major tick length={0.1cm}} 
\begin{document} 
    \begin{tikzpicture} 
      \begin{axis}[ 
          date coordinates in=x, 
          xticklabel={\Minute},% nur Minuten und ohne führende Nullen
          xmin={2015-01-01 00:00}, 
          xmax={2015-01-01 00:20}, 
          xlabel={Zeit [h:mm]}, 
          ylabel={RAM [KB]},
%%%%
          extra y ticks={59500},
          extra y tick style={ticklabel style={font=\tiny,yshift=-.5mm}},
          extra x ticks={2015-1-1 0:03},
          extra x tick label={\Hour:\minute},
          extra x tick style={ticklabel style={rotate=90,anchor=east,font=\tiny}},
%%%%
        ] 
        \addplot table[mark=none,col sep=comma,x=zeit,y=ram]{test1.txt}; 
      \end{axis} 
    \end{tikzpicture} 
\end{document}
Gruß
Elke

PS: Schau Dir bitte an, was der Status "Rückfrage" bedeutet.

Tobias85
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: So 1. Jan 2012, 23:39

Beitrag von Tobias85 »

Vielen Dank esdd. Entschuldige bitte, dass ich keine Daten angehangen habe -ich verstehe, dass das ist wenig hilfreich ist.
Eine letzte Frage habe ich allerdings noch. Hast du eine Idee, wieso die 2:02 links von der 2 stehen? Die Markierung ist genau dort, ab wo das Maximum erreicht ist, aber ds sollte doch zwischen 2 und 3 stehen oder? :?
Das Problem mit der 23 tritt nun auch mit der 12 auf - allerdings nehme ich zur Not die 8, soviel passiert da nun nicht :)
\documentclass[margin=10pt]{standalone} 
\usepackage{pgfplots} 
\usepgfplotslibrary{dateplot} 
\pgfplotsset{compat=newest, major tick length={0.1cm}} 
\begin{document} 
    \begin{tikzpicture} 
      \begin{axis}[ 
          date coordinates in=x, 
          xticklabel={\Hour},% nur Minuten und ohne führende Nullen 
          xmin={2015-01-01 00:00}, 
          xmax={2015-01-01 12:00}, 
          xlabel={Zeit [h]}, 
          ylabel={RAM [MB]}, 
          y tick label style={/pgf/number format/1000 sep=},
           extra y ticks={1930},
           extra y tick style={ticklabel style={font=\tiny,yshift=-.5mm}},
          extra x ticks={2015-1-1 02:02}, 
          extra x tick label={\Hour:\minute}, 
          extra x tick style={ticklabel style={rotate=90,anchor=east,font=\tiny}},
        ] 
        \addplot table[mark=none,col sep=comma,x=zeit,y=ram]{ram.txt}; 
      \end{axis} 
    \end{tikzpicture} 
\end{document}
Bild

PS: ich habe auf "offen" gesetzt :wink:
Dateianhänge
ram.txt
Gesamte Testdaten
(71.35 KiB) 446-mal heruntergeladen
Screenshot
Screenshot
Bildschirmfoto 2015-02-09 um 15.49.30.png (29.57 KiB) 3219 mal betrachtet

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Mir fehlt jetzt gerade die Zeit zum Testen, aber auch wenn Dir da nur die 2 als Stunde angezeigt wird, muss der Tick nicht bei 02:00 sein: Der Wert an der Stelle kann zwischen 02:00 und 02:59 liegen. Das erklärt auch die 23 in dem anderen Fall.

Gib die gewünschten xtick explizit vor, damit sie wirklich bei den vollen Stunden liegen:
xtick={2015-01-01 2:00,2015-01-01 4:00}
Gruß
Elke

Tobias85
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: So 1. Jan 2012, 23:39

Beitrag von Tobias85 »

1000 Dank, jetzt ist es so wie es soll! :D

Antworten