PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots xmin berechnen



DaPhil
01-02-2013, 09:25
Hi,
ich möchte mittels pgfplots ein Diagramm aus einem Datensatz, der in einer Datei gespeichert ist, zeichnen lassen. Kann ich aus den Daten irgendwie die min/max Werte bekommen, so dass ich mir mein xmin/xmax/ymin/ymax ausrechnen kann? Ich möchte so z.B. vorgeben, dass zu jeder Seite 10% Platz gelassen werden soll...

Das hier habe ich anderswo gefunden, funktioniert aber nicht:


\documentclass[a4paper,10pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{gnuplottex}
\usepackage{pstricks}
\usepackage{graphicx}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\newcommand{\findmax}[1]{
\pgfplotsforeachungrouped \table in {#1} {%
\pgfplotstablevertcat{\concatenated}{\table}%
}%
\pgfplotstablesort[sort key={1},sort cmp={float >}]{\sorted}{\concatenated}%
\pgfplotstablegetelem{0}{1}\of{\sorted}%
\let\ymax=\pgfplotsretval%
}

\newcommand{\findmin}[1]{
\pgfplotsforeachungrouped \table in {#1} {%
\pgfplotstablevertcat{\concatenated}{\table}%
}%
\pgfplotstablesort[sort key={1},sort cmp={float <}]{\sorted}{\concatenated}%
\pgfplotstablegetelem{0}{1}\of{\sorted}%
\let\ymin=\pgfplotsretval%
}

\begin{document}

\findmax{dataA.dat}
\findmin{dataA.dat}

\begin{tikzpicture}
\begin{axis}
\addplot table[x index=1,y index=7] {dataA.dat};
\end{axis}
\end{tikzpicture}

\end{document}

Ich berechne hier schon gar nichts, weil vorher schon 100 Fehler kommen.

bobmalaria
01-02-2013, 11:48
hi,

bei 100 fehlern ist meist nur der erste wichtig.

kannst du auch noch einen auszug deiner datendatei bereitstellen?

ich sehe auch, dass du mit gnuplottex, pstricks und pgfplots drei verscheidene plottingprogramme verwendest. bist du gerade am testen oder verwendest du eine wilde mischung aus allen 3?

gruss

DaPhil
01-02-2013, 12:36
Hi,
ne ich habe ausprobiert womit ich meine Daten am besten plotten kann. Habe vorher mit pstricks probiert. Stellt mich aber nicht zufrieden. Hatte pgfplots vorher schon einmal ausprobiert und fand es damals auch unzureichend, es hat sich aber anscheinend sehr gut weiter entwickelt. Deshalb will ich es jetzt noch einmal ausprobieren. Datei im Anhang. Die Fehlermeldung lautet: Undefined control sequence \findmax{dataA.dat}

bobmalaria
01-02-2013, 14:15
hi,

du haettest das orginal verlinken koennen. ich vermute mal den code kommt hier her: http://tex.stackexchange.com/questions/24910/find-a-extremal-value-in-external-data-file-with-pgfplot

findmax und findmin durchsuchen immer die zweite spalte der tabelle (sort key=1) und finden dort maximum und minimum. ich glaube was du willst, ist das maximum und minimum von ganz bestimmten spalten, oder?

das macro an sich funktioniert bei mir ohne fehler und ich kann auch die werte ausgeben, eventuell musst du also mal deinen fehler hier mit angeben.

gruss

DaPhil
01-02-2013, 14:32
Habe den Fehler gefunden. Es lag wohl an einer veralteten Version von pgfplotstable. Nun funktioniert es, aber ich bekomme die Meldung capacity exceeded. Und ja ich müsste natürlich noch eine bestimmte Spalte dann durchsuchen lassen. Wollte erstmal das Beispiel überhaupt zum Laufen bringen.

bobmalaria
01-02-2013, 15:27
hi,

memory limit wir schnell erreicht, vor allem mit pdflatex. klar du liest auch mal eben 2x eine tabelle mit 7-8 spalten und 1000 zeilen ein! latex ist kein matlab und sehr langsam bei berechnungen.

ich wuerde mir diese werte anderswo berechnen wenn du sie zwingend haben willst. aber warum gibst du nicht bei enlargelimits einfach einen fixen wert ein und gut ist?

mit lualatex kannst du es immer noch kompilieren, das hat kein memory limit. dauert aber so ca 1-2min auf meinem rechner.

eventuell kannst du anstatt mit sort key={[index]#2} einen spaltenindex auswaehlen


\newcommand{\findmax}[2]{
\pgfplotsforeachungrouped \table in {#1} {%
\pgfplotstablevertcat{\concatenated}{\table}%
}%
\pgfplotstablesort[sort key={[index]#2},sort cmp={float >}]{\sorted}{\concatenated}%
\pgfplotstablegetelem{0}{1}\of{\sorted}%
\let\ymax=\pgfplotsretval%
}

aufruf dann \findmax{data.dat}{7}.

ausserdem musst du das kommando so abaendern das x und y maximalwerte gefunden werden. also muss das macro 4x ausgefuehrt werden. das duerfte lange lange dauern- zu lange.

daher mein tipp. spar dir diese berechnung und setze enlargelimits global. verwende die externalize library damit deine plots nur 1x und nicht bei jedem kompilieren neu gesetzt werden.

gruss

DaPhil
01-02-2013, 15:59
So, für das was ich machen möchte scheint das hier einfach


\begin{axis}[
enlarge x limits=0.05,
enlarge y limits=0.05,
]

zu funktionieren! Also brauche ich den ganzen Kram vorher gar nicht!

EDIT: Danke bobmalaria, sehe du schlägst das auch vor mit den enlarge limits!