Diagramm (Kraft über Zeit)
-
- Forum-Newbie
- Beiträge: 7
- Registriert: Mi 16. Mär 2016, 12:28
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
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
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
-
- Forum-Newbie
- Beiträge: 7
- Registriert: Mi 16. Mär 2016, 12:28
Hallo Besserwisser,
das hat sich schon erledigt.
Habe allerdings das nächste Problem
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
Viele Grüße
das hat sich schon erledigt.
Habe allerdings das nächste Problem
Wenn ich das richtig sehe ist das ja die X-Achsenbeschriftungxtick={0,18000,...,25200},
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
Bis 10000 geht das noch, ab 15000 irgend wann nicht mehr. Ich glaube das ist das Resultat der umstrittenen SekundenanzeigeDimension too large. \end{axis}
Viele Grüße
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:
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!
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}
Achja: Bitte den Status aktuell halten!
-
- Forum-Newbie
- Beiträge: 7
- Registriert: Mi 16. Mär 2016, 12:28
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?
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?
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.
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.
-
- Forum-Newbie
- Beiträge: 7
- Registriert: Mi 16. Mär 2016, 12:28
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.
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.
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!):
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.
\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 }