Diagramm (Kraft über Zeit)

Tabellen und Grafiken erstellen und anordnen


typenschild
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mi 16. Mär 2016, 12:28

Diagramm (Kraft über Zeit)

Beitrag von typenschild »

Moin Leute,
ich versuch die ganze Zeit ein Diagramm mit pgfplots zumachen.

Daten Liegen so vor:
Dauer      Kraft
00:00:01    15
00:00:25    15,6
00:01:20    15,3
Wichtig wäre das Stunden Minuten und Sekunden auf der X-Achse dargestellt werden können.

Die Zeiten sind alle Unregelmäßig.

Kann mir jemand Weiterhelfen?

Viele Grüße aus dem Harz
Zuletzt geändert von typenschild am Do 24. Mär 2016, 13:22, insgesamt 1-mal geändert.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Diagramm (Kraft über Zeit

Beitrag von Bartman »

typenschild hat geschrieben:ich versuch die ganze Zeit ein Diagramm mit pgfplots zumachen.
Dann zeige den Lesern Deines Beitrags in Form eines Beispiels, was Du bisher erreicht hast.

typenschild
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mi 16. Mär 2016, 12:28

Beitrag von typenschild »

Noch garnichts,
ich hab mehrere Stunden verschiedene Sachen getestet ohne erfolg
unter anderem auch diesem

http://golatex.de/x-achse-im-format-mmss-0-t13492.html


das kann irgendwie nicht sein das ma sowas in excel in 5 minuten hinbekommt und hier nach Stunden es immer noch nicht klappt.

Nach meiner erkenntnis funktioniert
date coordinates in=x,
bei sekunden nicht....

Kann aber doch auch nicht sein das unter den tausenden LaTex nutzern das Problem noch keiner hatte....

Viele Grüße

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

Beitrag von esdd »

Der folgende Vorschlag basiert auf der Antwort http://tex.stackexchange.com/a/249944 von Christian Feuersänger auf eine ähnliche Frage auf tex.sx:

\begin{filecontents*}{data.dat}
Dauer      Kraft 
 00:00:01    15 
 00:00:25    15,6 
 00:01:20    15,3 
\end{filecontents*}

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usepgfplotslibrary{dateplot}

\def\transformtime#1:#2:#3!{
%    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
    \pgfmathparse{#1*3600-\pgfkeysvalueof{/pgfplots/timeplot zero}*3600+#2*60+#3}
%    \pgfkeys{/pgf/fpu=false}
}

\pgfplotsset{
    timeplot zero/.initial=0,
    timeplot/.style={
        x coord trafo/.code={\expandafter\transformtime##1!},
        x coord inv trafo/.code={%
%            \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed,}
            \pgfmathsetmacro\hours{floor(##1/3600)+\pgfkeysvalueof{/pgfplots/timeplot zero}}
            \pgfmathsetmacro\minutes{floor((##1-(\hours - \pgfkeysvalueof{/pgfplots/timeplot zero})*3600)/60)}
            \pgfmathsetmacro\seconds{##1-floor((##1)/60)*60}
            \def\pgfmathresult{%
              \pgfmathparse{ifthenelse(  \hours<10,0,)}\pgfmathresult\pgfmathprintnumber{\hours}:%
              \pgfmathparse{ifthenelse(\minutes<10,0,)}\pgfmathresult\pgfmathprintnumber{\minutes}:%
              \pgfmathparse{ifthenelse(\seconds<10,0,)}\pgfmathresult\pgfmathprintnumber{\seconds}%
            }
%            \pgfkeys{/pgf/fpu=false}
        },
    scaled x ticks=false,
    xticklabel=\tick,
    x tick label style={rotate=90}
    }
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    timeplot, timeplot zero=0, xtick=data,
]
\addplot table[/pgf/number format/read comma as period] {data.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Bild
Dateianhänge
gl_plotmitsekunden.png
gl_plotmitsekunden.png (10.01 KiB) 1981 mal betrachtet

Noch so einer

Beitrag von Noch so einer »

Man kann auch das Paket datatool verwenden, um die Daten in ein Format umzuschreiben, mit dem pgfplots direkt etwas anfangen kann:
\documentclass[paper=landscape,DIV=40]{scrartcl}
\usepackage{datatool,longtable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{dateplot}
\pgfplotsset{/pgf/number format/use comma,
/pgf/number format/read comma as period}

\begin{filecontents*}{\jobname.dat}
Dauer      Kraft
00:00:01    15
00:00:25    15,6
00:01:20    15,3
\end{filecontents*}

\newcommand*{\mysep}{ }
\DTLsetseparator{ }
\DTLloaddb[noheader,keys={Dauer,Kraft},omitlines=1]{dauerkraft}{\jobname.dat}
\newwrite\plotfile
\immediate\openout\plotfile \jobname.csv
\immediate\write\plotfile{Sekunden\mysep Dauer\mysep Kraft}
\newcommand*\SECONDSOF{}
\def\SECONDSOF#1:#2:#3:{\the\numexpr 3600*#1+60*#2+#3\relax}
\DTLforeach[\NOT\equal{\Dauer}{\csname @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft}{%
  \immediate\write\plotfile{\expandafter\SECONDSOF\Dauer:\mysep\Dauer\mysep\Kraft}%
}
\immediate\closeout\plotfile
\pgfplotstableread{\jobname.csv}\sekundendauerkrafttable

\begin{document}
\begin{tikzpicture}
  \begin{axis}[%
    height=\textheight,
    width=\textwidth,
    xtick=data,
%    x tick label style={rotate=90,anchor=east},
    xticklabels from table={\sekundendauerkrafttable}{Dauer},
    ]%
    \addplot table[x=Sekunden,y=Kraft,xtick=Dauer] {\sekundendauerkrafttable};
  \end{axis}
\end{tikzpicture}
\end{document}

typenschild
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mi 16. Mär 2016, 12:28

Beitrag von typenschild »

Danke erst mal für die Zahlreichen Antworten.
Leider funktioniert das aber noch nicht so richtig.

Es kommt ein Interessanter Fehler wenn die Dauer 00:01:09 Beträgt
bei 00:01:10 kommt der Fehler nicht
Dauer Kraft
00:00:01 21,490365
00:00:17 21,4798313333
00:00:34 21,4662983333
00:00:52 21,4617970000
00:01:09 21,4557646667 <-- Diese Zeile Verursacht den Fehler
00:01:26 21,4482323333
00:01:44 21,4407003333
Natürlich mit Tabs getrennt, sieht man hier nicht richitg
Fehlermeldung:
! Package PGF Math Error: Digit `=' invalid for base 8 (in '00*3600-0*3600+01*6
0+09').

See the PGF Math package documentation for explanation.
Type H <return> for immediate help.
...

l.41 ...r format/read comma as period] {data.dat};


\let
Und da hätte ich noch was:
-Es liegen ca 1700 Zeilen vor bei einer Versuchsdauer von etwa 7 Stunden (ja über die Sinnhaftigkeit von Sekunden kann man sich Streiten)
Kann man das etwas passender Skalieren bzw die Achsenbeschriftung auf jede Stunde bzw jede halbe Stunde stellen?

-Desweitern wollt ich mehrere Messwerte in dieser Datei speichern, diese Beziehen sich alles auf die gleiche Zeit sollen jedoch in Unterschiedliche Diagramme.
Ist das auch möglich?

Viele Grüße

Noch so einer

Beitrag von Noch so einer »

Ich kann das Problem bei Anpassung des Datensatzes aus meinem Beispiel nicht nachvollziehen. Hier noch mit Demonstration wie man selbst bestimmen kann, in welchem Abstand die Labels gesetzt werden:
\documentclass[paper=landscape,DIV=40]{scrartcl}
\usepackage{datatool,longtable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{dateplot}
\pgfplotsset{/pgf/number format/use comma,
/pgf/number format/read comma as period}

\begin{filecontents*}{\jobname.dat}
Dauer Kraft
00:00:01 21,490365
00:00:17 21,4798313333
00:00:34 21,4662983333
00:00:52 21,4617970000
00:01:09 21,4557646667
00:01:26 21,4482323333
00:01:44 21,4407003333
\end{filecontents*}

\newcommand*{\mysep}{ }
\DTLsetseparator{ }
\DTLloaddb[noheader,keys={Dauer,Kraft},omitlines=1]{dauerkraft}{\jobname.dat}
\newwrite\plotfile
\immediate\openout\plotfile \jobname.csv
\immediate\write\plotfile{Sekunden\mysep Dauer\mysep Kraft}
\newcommand*\SECONDSOF{}
\def\SECONDSOF#1:#2:#3:{\the\numexpr 3600*#1+60*#2+#3\relax}
\DTLforeach[\NOT\equal{\Dauer}{\csname @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft}{%
\immediate\write\plotfile{\expandafter\SECONDSOF\Dauer:\mysep\Dauer\mysep\Kraft}%
}
\immediate\closeout\plotfile
\pgfplotstableread{\jobname.csv}\sekundendauerkrafttable

\begin{document}
\begin{tikzpicture}
\begin{axis}[%
height=\textheight,
width=\textwidth,
xtick={0,30,...,120},
% x tick label style={rotate=90,anchor=east},
xticklabels={00:00:00,00:00:30,00:01:00,00:30:00,00:02:00}
]%
\addplot table[x=Sekunden,y=Kraft,xtick=Dauer] {\sekundendauerkrafttable};
\end{axis}
\end{tikzpicture}
\end{document}
Bitte die Optionen xtick und xticklabel zum besseren Verständnis in der [d]pgfplots[/d]-Anleitung nachlesen!

Besserwisser

Beitrag von Besserwisser »

Mehrere Messwerte in einer Datei sind kein Problem. Dazu gibst du die zusätzlichen Messwerte als zusätzliche Spalten an. Du gibst dann beim Plotten einfach wie im Beispiel von Noch so einer gezeigt an, welche Spalte für die x-Koordinate und welche für die y-Koordinate maßgeblich ist.

Noch so einer

Beitrag von Noch so einer »

Statt die xtickslabels in meinem Beispiel explizit anzugeben, kann man diese natürlich auch wie in esdd's Beispiel berechnen:
\documentclass[paper=landscape,DIV=40]{scrartcl}
\usepackage{datatool,longtable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{dateplot}
\pgfplotsset{/pgf/number format/use comma,
/pgf/number format/read comma as period}

\begin{filecontents*}{\jobname.dat}
Dauer Kraft
00:00:01 21,490365
00:00:17 21,4798313333
00:00:34 21,4662983333
00:00:52 21,4617970000
00:01:09 21,4557646667
00:01:26 21,4482323333
00:01:44 21,4407003333
\end{filecontents*}

\newcommand*{\mysep}{ }
\DTLsetseparator{ }
\DTLloaddb[noheader,keys={Dauer,Kraft},omitlines=1]{dauerkraft}{\jobname.dat}
\newwrite\plotfile
\immediate\openout\plotfile \jobname.csv
\immediate\write\plotfile{Sekunden\mysep Dauer\mysep Kraft}
\newcommand*\SECONDSOF{}
\def\SECONDSOF#1:#2:#3:{\the\numexpr 3600*#1+60*#2+#3\relax}
\DTLforeach[\NOT\equal{\Dauer}{\csname @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft}{%
\immediate\write\plotfile{\expandafter\SECONDSOF\Dauer:\mysep\Dauer\mysep\Kraft}%
}
\immediate\closeout\plotfile
\pgfplotstableread{\jobname.csv}\sekundendauerkrafttable

\begin{document}
\begin{tikzpicture}
\begin{axis}[%
height=\textheight,
width=\textwidth,
xtick={0,30,...,120},% Abstand der Label (in Sekunden)
% x tick label style={rotate=90,anchor=east},% Label vertikal setzen, falls mehr benötigt werden
xticklabel={\pgfkeys{/pgf/number format/.cd,fixed,precision=0}%
            \pgfmathsetmacro\hours{floor(\tick/3600)}%
            \pgfmathsetmacro\minutes{floor(\tick/60)-\hours*60}%
            \pgfmathsetmacro\seconds{\tick-\minutes*60-\hours*3600}%
            \pgfmathparse{ifthenelse(\hours<10,0,)}\pgfmathresult\pgfmathprintnumber{\hours}:%
            \pgfmathparse{ifthenelse(\minutes<10,0,)}\pgfmathresult\pgfmathprintnumber{\minutes}:%
            \pgfmathparse{ifthenelse(\seconds<10,0,)}\pgfmathresult\pgfmathprintnumber{\seconds}}
]%
\addplot table[x=Sekunden,y=Kraft,xtick=Dauer] {\sekundendauerkrafttable};
\end{axis}
\end{tikzpicture}
\end{document}

Noch so einer

Beitrag von Noch so einer »

Und hier mal noch gezeigt, wie das mit mehreren Messreihen in einer Datei geht, bei denen sich die Messwerte alle auf dieselben Zeitpunkte beziehen:
\documentclass[paper=landscape,DIV=40]{scrartcl}
\usepackage{datatool,longtable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{dateplot}
\pgfplotsset{/pgf/number format/use comma,
/pgf/number format/read comma as period}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.dat}
Dauer Kraft Weg
00:00:01 21,490365 12,0
00:00:17 21,4798313333 12,04
00:00:34 21,4662983333 12,06
00:00:52 21,4617970000 12,10
00:01:09 21,4557646667 12,11
00:01:26 21,4482323333 12,15
00:01:44 21,4407003333 12,19
\end{filecontents*}

\newcommand*{\mysep}{ }
\DTLsetseparator{ }
\DTLloaddb[noheader,keys={Dauer,Kraft,Weg},omitlines=1]{dauerkraft}{\jobname.dat}
\newwrite\plotfile
\immediate\openout\plotfile \jobname.csv
\immediate\write\plotfile{Sekunden\mysep Dauer\mysep Kraft\mysep Weg}
\newcommand*\SECONDSOF{}
\def\SECONDSOF#1:#2:#3:{\the\numexpr 3600*#1+60*#2+#3\relax}
\DTLforeach[\NOT\equal{\Dauer}{\csname @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft,\Weg=Weg}{%
\immediate\write\plotfile{\expandafter\SECONDSOF\Dauer:\mysep\Dauer\mysep\Kraft\mysep\Weg}%
}
\immediate\closeout\plotfile
\pgfplotstableread{\jobname.csv}\sekundendauerkrafttable

\begin{document}
\begin{tikzpicture}
\begin{axis}[%
height=\textheight,
width=\textwidth,
xtick={0,30,...,120},
% x tick label style={rotate=90,anchor=east},
xticklabel={\pgfkeys{/pgf/number format/.cd,fixed,precision=0}%
            \pgfmathsetmacro\hours{floor(\tick/3600)}%
            \pgfmathsetmacro\minutes{floor(\tick/60)-\hours*60}%
            \pgfmathsetmacro\seconds{\tick-\minutes*60-\hours*3600}%
            \pgfmathparse{ifthenelse(\hours<10,0,)}\pgfmathresult\pgfmathprintnumber{\hours}:%
            \pgfmathparse{ifthenelse(\minutes<10,0,)}\pgfmathresult\pgfmathprintnumber{\minutes}:%
            \pgfmathparse{ifthenelse(\seconds<10,0,)}\pgfmathresult\pgfmathprintnumber{\seconds}}
]%
\addplot table[x=Sekunden,y=Kraft] {\sekundendauerkrafttable};% für y die Kraft-Spalte verwenden
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[%
height=\textheight,
width=\textwidth,
xtick={0,30,...,120},
% x tick label style={rotate=90,anchor=east},
xticklabel={\pgfkeys{/pgf/number format/.cd,fixed,precision=0}%
            \pgfmathsetmacro\hours{floor(\tick/3600)}%
            \pgfmathsetmacro\minutes{floor(\tick/60)-\hours*60}%
            \pgfmathsetmacro\seconds{\tick-\minutes*60-\hours*3600}%
            \pgfmathparse{ifthenelse(\hours<10,0,)}\pgfmathresult\pgfmathprintnumber{\hours}:%
            \pgfmathparse{ifthenelse(\minutes<10,0,)}\pgfmathresult\pgfmathprintnumber{\minutes}:%
            \pgfmathparse{ifthenelse(\seconds<10,0,)}\pgfmathresult\pgfmathprintnumber{\seconds}}
]%
\addplot table[x=Sekunden,y=Weg] {\sekundendauerkrafttable};% für y die Weg-Spalte verwenden
\end{axis}
\end{tikzpicture}
\end{document}
Die beiden Diagramme unterscheiden sich lediglich in der Auswahl der y-Spalte bei \addplot table.

Antworten