PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots: werteabhängige Formatierung



borose
16-01-2010, 14:10
Hallo,

ich habe folgendes Minimalbeispiel:


\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}

\addplot [mark=square*, mark size = 2pt, only marks, mark options={black, fill=black!100}]
table [x=a,y=b] {data.csv};

\end{axis}
\end{tikzpicture}
\end{document}

Die Datei data..csv hat folgenden Inhalt (gekürzt):


a b c d e
181.13 59.87 Tab. 20 0
241.51 58.87 Tab. 20 0
60.38 52.54 Tab. 20 5.1
60.38 53.46 Tab. 20 9.1
60.38 54.28 Tab. 20 9.1
60.38 49.89 Tab. 20 9.1
60.38 47.68 Tab. 20 9.1
120.76 55.47 Tab. 20 5.1
120.76 56.01 Tab. 20 9.1
120.76 56.01 Tab. 20 9.1
120.76 54.00 Tab. 20 15
250.00 58.29 CIP 19.1 13
250.00 56.78 CIP 18.9 13

Nun zu meinem eigentlichen Anliegen:

Ich möchte die Formatierung der "marks" in Abhängigkeit der gelesenen Werte ändern. konkret folgendes

Wenn in Spalte c "Tab." steht, soll mark=*
Wenn in Spalte c "CIP" steht, soll mark=square*

Die Größe hängt von Spalte d ab: mark size = 0.1pt* Wert aus Spalte d

Die Farbe hängt von Spalte e ab: fill = black!(100/15* Wert aus Spalte e

meine bisherige Idee war es, dies in eine foreach-Schleife einzubinden, und dann mit if-Abfragen zu hantieren, allerdings muss ich die Daten dafür "händisch" ändern ... kann man die foreach-Schleife mit Daten aus einer externen Datei (Tabelle) füttern?

Andere Vorschläge?


Vielen Dank im Voraus!

borose
18-01-2010, 08:40
Hmm, beim direkten einlesen gibts wajrscheinlich keine Möglichkeit.

Allerdings klappt es mit einer foreach-Schleife auch nicht. Ich weiß nicht warum. Kann man in den optionalen Argumenten von \addplot keine Befehle einfügen? Weiß hier icht weiter.


\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{calc}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}

\foreach \x/\y/\Art/\durchmesser/\PHM in {
181.13/59.87/Tab./20/0,
241.51/58.87/Tab./20/0,
60.38/52.54/Tab./20/5.1,
60.38/53.46/Tab./20/9.1,
60.38/54.28/Tab./20/9.1,
60.38/49.89/Tab./20/9.1,
60.38/47.68/Tab./20/9.1,
120.76/55.47/Tab./20/5.1,
120.76/56.01/Tab./20/15,
250/58.29/CIP/19.1/13,
250/56.78/CIP/18.9/13}
{\addplot [mark size = 0.1pt*\durchmesser ,only marks, black, mark=*] coordinates {(\x,\y)};}
\end{axis}
\end{tikzpicture}
\end{document}

borose
19-01-2010, 08:43
Ich glaube die foreach-Schleife macht Probleme in der axis-Umgebung, da sie da nicht richtig funktioniert. Das ist sehr ärgerlich. Ich bin nach wie vor an einer Hilfestellung interessiert, wie man es mit einer forech-Schleife direkt machen kann, habe aber mein Problem aber anderweitig gelöst. Falls jemand mal ein ähnliches Problem hat: Die addplot-Anweisung separat kreieren und dann per \input in das eigentliche Dokument einfügen.


\documentclass{scrartcl}
\usepackage{ifthen}
\usepackage{tikz}

\newwrite\addplotsfile
\immediate\openout\addplotsfile=addplotsfile.tex

\newtoks\argtoks\argtoks={\addplot}

\newcommand{\addtobatchfile}[5]{\immediate\write\addplotsfile{\the\argtoks [mark size = 0.1pt*#3 ,only marks, black, mark=#4, mark options={fill=black!#5}] coordinates {(#1,#2)};}}

\newcommand*{\markform}{}
\newcommand*{\marksize}{}
\newcommand*{\markfillfarbe}{}


\begin{document}


\foreach \x/\y/\Art/\durchmesser/\PHM in {
0/23.51/1/20/0,
0/36.99/1/20/0,
181.13/59.87/1/20/0,
250/58.29/2/19.1/15,
250/56.78/2/18.9/13}
{
\ifthenelse{\Art=1}
{\def\markform{*}}
{\ifthenelse
{\Art=2}
{\def\markform{square*}}}

\pgfmathparse{100/15*\PHM}
\edef\markfillfarbe{\pgfmathresult}

\addtobatchfile{\x}{\y}{\durchmesser}{\markform}{\ markfillfarbe}
}

\end{document}

voss
19-01-2010, 08:53
Ich glaube die foreach-Schleife macht Probleme in der axis-Umgebung, da sie da nicht richtig funktioniert. Das ist sehr ärgerlich. Ich bin nach wie vor an einer Hilfestellung interessiert, wie man es mit einer forech-Schleife direkt machen kann, habe aber mein Problem aber anderweitig gelöst. Falls jemand mal ein ähnliches Problem hat: Die addplot-Anweisung separat kreieren und dann per \input in das eigentliche Dokument einfügen.


oder PSTricks benutzen, da lässt sich alles nachträglich erweitern und bearbeiten ... :)

Herbert

borose
19-01-2010, 09:31
Hallo Herbert,

ich freue mich über die Antwort :)

Wäre denn das oben genannte Problem mit PSTricks ohne weiteres durchführbar? Ohne viel Code schreiben zu müssen? D.h. ich möchte nicht anfangen, die x ticks selber einzuzeichnen ... Wie gesagt, wenn das oben genannte machbar wär, würde ich mich auf jeden Fall mal mit PStricks beschäftigen!


Grüße!

voss
19-01-2010, 12:52
Wäre denn das oben genannte Problem mit PSTricks ohne weiteres durchführbar? Ohne viel Code schreiben zu müssen? D.h. ich möchte nicht anfangen, die x ticks selber einzuzeichnen ... Wie gesagt, wenn das oben genannte machbar wär, würde ich mich auf jeden Fall mal mit PStricks beschäftigen!


Ich habe wohl erst am Wochenende Zeit, den Beweis anzutreten ...
http://tug.org/PSTricks/main.cgi?file=pst-plot/DataExamples
gleich oben sind zwei Beispiele, die mit speziellen Datensätzen
arbeiten.

Herbert