Diagramm (Kraft über Zeit)

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Diagramm (Kraft über Zeit)

von Besserwisser » Do 31. Mär 2016, 11:13

Achja: Eine nicht unbeträchtliche Zeit entfällt bei dem Ganzen natürlich auch auf die Verarbeitung der Originaldaten mit datatool. Wenn sich die Daten also nicht mehr ändern, ist es sinnvoll, diesen Schritt nicht mehr auszuführen. Auch das geht am einfachsten, indem man es auslagert. Man kann aber auch etwas wie (ungetestet!):
\IfFileExists{\jobname.csv}{%
  \typeout{Using already existing \jobname.cvs}
}{%
  \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)/5\relax}
  \DTLforeach[\NOT\equal{\Dauer}{\csname
  @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft}{%
  \edef\sDauer{\expandafter\SECONDSOF\Dauer:}%
  \typeout{\Dauer: \sDauer}%
  \immediate\write\plotfile{\sDauer:\mysep\Dauer\mysep\Kraft}%
  \immediate\closeout\plotfile
}
machen. Dann wird die cvs-Datei nur noch aus der dat-Datei erzeugt, wenn sie nicht bereits existiert. Nun muss man nur noch daran denken, dass man bei Änderungen an der dat-Datei auch die cvs-Datei löschen sollte.

von Besserwisser » Do 31. Mär 2016, 11:05

Noch mehr Geschwindigkeit geht nur mit einem gewissen Verlust an Komfort:

Wenn sich die Bilder nicht mehr ändern, kann man den Code dafür in eine eigene tex-Datei auslagern und die (jetzt ja bereits vorhandenen) externen Abbildungen direkt per \includegraphics laden.

Man kann auch generell die Plots in eine eigene tex-Datei auslagern. Mit standalone kann man dann sehr gut ein PDF erzeugen, bei dem jede Seite ein einzelner Plot ist. Die kann man dann per \includegraphics in de eigentliche Datei einbinden. Die Plots muss man dann nur (explizit) neu erzeugen, wenn sich daran etwas ändert.

von typenschild » Do 31. Mär 2016, 10:31

Hallo Danke,
klappt soweit!

Aber der Braucht immer noch ca. 80 Sekunden pro Bild (statt vorher ca. 4 Minuten)

Ich nehme an da kann man nicht mehr viel machen oder?

von Besserwisser » Di 29. Mär 2016, 09:08

Es werden alle geplottet aber mit einer Genauigkeit von 5s auf der Zeitachse. Bei einer Druckauflösung von 600dpi und einer Breite des Plots von 8" = 20,32 cm würde das genau der Druckgenauigkeit entsprechen. Bei kleineren Plots wäre also noch immer die Druckerauflösung der begrenzende Faktor.

Die Mathematik, die "Noch so einer" da anwendet, sollte auch für Nichtmathematiker nicht allzu schwer zu verstehen sein.

Auf die Werteachse hat die Rundung übrigens keinen Einfluss.

Die beste Beschleunigung bei vielen Plots erreicht man, wenn die Plots zunächst in Bilder umgewandelt werden. Das kann man mit der external Library bei pgfplots auch automatisieren. Siehe dazu die [d]pgfplots[/d]-Anleitung, derzeit Abschnitt 5.6.

von typenschild » Mo 28. Mär 2016, 22:15

Hallo noch so einer,

aber Datenpunkte an sich gehen hier jetzt nicht Verloren?
Auch wenn das so viele sind, ich brauche alle (bzgl Ausreißern) - Stichwort Messmittelfähigkeit.

Viele Grüße
typenschild

edit:
Ich hab da noch eine Frage:
Der Prozess dauert relativ lange. Da in meiner Bachelorarbeit mehrere Diagramme vorkommen wäre das doch Praktisch wenn man die Plots, ähnlich wie Definitionen in C ein und ausschalten könnte(#define und #ifdef). Gibts da was?

von Noch so einer » Do 24. Mär 2016, 20:21

Mal ernsthaft: Hast Du wirklich Messwerte im Sekundentakt in diesem Wertebereich? Das führt nämlich dazu, dass die Wert so dicht zusammenrücken, dass sie nicht mehr korrekt miteinander verbunden werden können und man letztlich auch nichts mehr erkennen kann.

Wie dem auch sei: Da man Sekundenabstände bei dem Messbereich ohnehin nicht mehr erkennen kann, kann man auch gleich beispielsweise auf eine Genauigkeit von 5 Sekunden runden. Damit wird man dann den Überlauf los:
\documentclass[paper=a4,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
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
06:59:12 21,40
\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)/5\relax}
\DTLforeach[\NOT\equal{\Dauer}{\csname
  @dtlstringnull\endcsname}]{dauerkraft}{\Dauer=Dauer,\Kraft=Kraft}{%
\edef\sDauer{\expandafter\SECONDSOF\Dauer:}%
\typeout{\Dauer: \sDauer}%
\immediate\write\plotfile{\expandafter\SECONDSOF\Dauer:\mysep\Dauer\mysep\Kraft}%
}
\immediate\closeout\plotfile
\pgfplotstableread{\jobname.csv}\sekundendauerkrafttable

\begin{document}

\begin{tikzpicture}
\begin{axis}[%
only marks,% Linien nicht verbinden
height=\textheight,
width=\textwidth,
xtick={0,360,...,5040},% Abstand der Label (in 5 Sekunden)
x tick label style={rotate=90,anchor=east},% Label vertikal setzen, falls
% mehr benötigt werden
xticklabels={00:00:00,00:30:00,01:00:00,01:30:00,02:00:00,02:30:00,03:00:00,03:30:00,04:00:00,04:30:00,05:00:00,05:30:00,06:00:00,06:30:00,07:00:00}
% xticklabel={\pgfkeys{/pgf/number format/.cd,fixed,precision=0}%
%             \pgfmathsetmacro\hours{floor(\tick/720)}%
%             \pgfmathsetmacro\minutes{floor(\tick/12)-\hours*60}%
%             \pgfmathsetmacro\seconds{\tick*5-\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}
Allerdings funktioniert dabei die berechneten Labels so nicht mehr (zu viele Rechenfehler). Deshalb habe ich stattdessen wieder explizite Labels verwendet. Die korrekte Berechnung habe ich als Kommentare trotzdem mit angegeben.

Achja: Bitte den Status aktuell halten!

von typenschild » Do 24. Mär 2016, 17:59

Hallo Besserwisser,
das hat sich schon erledigt.
Habe allerdings das nächste Problem
xtick={0,18000,...,25200},
Wenn ich das richtig sehe ist das ja die X-Achsenbeschriftung
Wenn ich jetzt 7 Stunden habe und gerne alle halbe Stunde eine Makierung will. Müsste das doch so wie oben sein oder?

Nun ja
auf jeden Fall bekomm ich dann ne deftige Fehlermeldung
Dimension too large. \end{axis}
Bis 10000 geht das noch, ab 15000 irgend wann nicht mehr. Ich glaube das ist das Resultat der umstrittenen Sekundenanzeige

Viele Grüße

von Besserwisser » Do 24. Mär 2016, 15:46

Und auf was bezieht sie sich dann? Man kann beliebig viele Plots mit Daten aus beliebig vielen Dateien verwenden. Also musst du schon etwas genauer sein, wo bei dir das Problem liegt: →Minimalbeispiel

von typenschild » Do 24. Mär 2016, 13:21

Sehr schön,
den Beitrag direkt vor mir konnte ich schon Prima anwenden.
Zwar geht das mit den filecontents nicht so ganz, brauch ich aber auch nicht weil ich die Daten ja nicht generieren muss.

So muss allerdings noch einen drauf legen.
Jetzt hab ich eine zweite oder dritte Messreihe. die sich aber nicht auf diese Zeit bezieht. Ist also in einer anderen Datei.

Wie ist das denn zu schaffen?


Vielen dank schonmal im vorraus,
hier sind ja echte Profis

von Noch so einer » Do 24. Mär 2016, 08:03

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.

Nach oben