PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tikz: Bereich zwischen zwei Funktionen färben



Minze
25-01-2013, 15:25
Da ich gerade die Muße habe, Probleme zu lösen, die mich lange Zeit begleiteten, kommt hier eine Frage zu tikz:

Ich möchte gern den Bereich zwischen zwei Funktionen färben, um ein Fehlerintervall zu visualisieren.
Meine Datentabelle beginnt so:

"Zeit" "Q" "Funten" "Foben" "KF=3.88" "KF=6" "Zeitgesamt"
0.00 23.57 22.95 24.20 23.84 25.65 1509.00
1.00 23.57 22.95 24.20 23.84 25.65 1510.00

Natürlich habe ich schon so einiges ausprobiert, 2 Beispiele seien hier genannt.

Clipfunktion, bekomme ich aber mit addplot nicht zum Laufen (http://tex.stackexchange.com/questions/45736/how-can-i-fill-the-area-where-the-boundary-is-given-by-functions)
Es gelingt mir nicht, den stack-Befehl auf eine Datentabelle umzubasteln (http://tex.stackexchange.com/questions/83503/fill-the-area-determined-by-two-pgfplots-graphs)


Was funktioniert, ist dieser Befehl:

\addplot [draw = red, fill = red] table [x="Zeit", y="Foben"] {./pumpe2.txt} \closedcycle;

Dann fällt der Plot allerdings schräg nach unten links ab, s. angehängtes pdf "pumpe2".
Ich habe daraufhin der Datentabelle eine weitere Messreihe hinzugefügt, mit gleichem x-Wert aber y=0, um die Kurve senkrecht nach unten zu zwingen, das funktioniert auch.
Subtrahiere ich nun den unteren Bereich, indem ich die untere Funktion weiß füllen lasse, entstehen aber hässliche Ränder, die auch die KOS-Achsen teilweise überdecken. Zu sehen ist das im pdf "pumpe3".

Der Quellcode dafür sieht so aus:

\addplot [draw = red, fill = red] table [x="Zeit", y="Foben"] {./pumpe2.txt} \closedcycle;

\addplot [draw = white, fill = white] table [x="Zeit", y="Funten"] {./pumpe2.txt} \closedcycle;

Was ich mir wünsche, ist ein Befehl im folgenden Sinne:
\addplot [red] table [x="Zeit", y1="Foben" - y2="Funten"] {./pumpe2.txt};

Hat da jemand einen Tipp für mich?

Minze
26-01-2013, 17:36
Ein Zusatz:

Auch dieses Beispiel (http://www.texample.net/tikz/examples/parabola-plot/) läuft bei mir ohne Probleme durch. Allerdings bekomm ich es nicht hin, \shade mit \addplot zu verbinden.

Minze
27-01-2013, 17:56
Da die Zeit nun so langsam drängt, muss es folgende, nicht sehr elegante, Lösung tun:


\documentclass[xcolor=dvipsnames]{beamer}%optionales Argument nötg für zusätzliche Farben
\usepackage{xcolor}%weitere Farben
\usepackage{tikz}
\usepackage[latin1]{inputenc}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

%%%%%%%%%%%%%%%% Bild auf Minimum beschneiden Beginn %%%%%%
\usepackage[active, tightpage]{preview}
\usepackage{ifthen}%ermöglicht wenn - dann
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{0pt}%keinen Rand lassen
%%%%%%%%%%%%%%%% Bild auf Minimum beschneiden Ende %%%%%%

\begin{document}
\begin{tikzpicture}
\centering
\begin{axis}[
xmin=0,
xmax=31,
xtick={0,5,...,30},
axis x line=bottom,
xtick align=outside,
xlabel = {Zeit [s]},
ymin=20,
ymax=35.5,
axis y line=left,
ytick align=outside,
ylabel= {Durchfluss US [m$^3$\,h$^{-1}$]},
height=12cm,
width = 20cm,
legend style = {at={(1,0.5)}}
]


% Bereich grün zeichnen
\addplot [draw = none, fill = green!20] table [x="t", y="Foben"] {./pumpe1.txt} \closedcycle;

% unten weiß drüberzeichnen
\addplot [draw = none, fill = white] table [x="t", y="Funten"] {./pumpe1.txt} \closedcycle;

% Grenzlinien des Bereichs nochmal nachziehen,
%damit vom Weißen überzeichnete Linien erscheinen
\addplot [draw = green, line width = 0.3mm] table [x="t", y="Foben"] {./pumpe1.txt};
\addplot [draw = green, line width = 0.3mm] table [x="t", y="Funten"] {./pumpe1.txt};

% Durchfluss zeichnen
\addplot [green, line width = 0.3mm] table [x="t", y="Q"] {./pumpe1.txt};
\end{axis}

%Achsen nochmal nachzeichnen, da sie sonst überdeckt werden
\begin{axis}[
xmin=0,
xmax=31,
xtick={0,5,...,30},
axis x line=bottom,
xtick align=outside,
xlabel = {Zeit [s]},
ymin=20,
ymax=35.5,
axis y line=left,
ytick align=outside,
ylabel= {Durchfluss US [m$^3$\,h$^{-1}$]},
height=12cm,
width = 20cm,
]\end{axis}
\end{tikzpicture}
\end{document}


Hier der Inhalt der Datentabelle:


"t" "Q" "v" "dv" "dQ" "Funten" "Foben" "korrekturunten" "korrekturoben"
1 25.17 1.23 0.0322 0.66 24.51 25.82 25.49 27.37
2 26.00 1.28 0.0330 0.67 25.32 26.67 26.33 28.27
3 27.88 1.37 0.0349 0.71 27.17 28.59 28.25 30.31
4 28.14 1.38 0.0351 0.72 27.43 28.86 28.52 30.59
5 28.21 1.38 0.0352 0.72 27.49 28.93 28.59 30.66
6 28.95 1.42 0.0359 0.73 28.22 29.68 29.34 31.46
7 28.46 1.40 0.0354 0.72 27.73 29.18 28.84 30.93
8 28.78 1.41 0.0357 0.73 28.05 29.51 29.17 31.28
9 28.47 1.40 0.0354 0.72 27.74 29.19 28.85 30.94
10 28.76 1.41 0.0357 0.73 28.03 29.49 29.15 31.26
11 28.89 1.42 0.0358 0.73 28.15 29.62 29.28 31.39
12 28.89 1.42 0.0359 0.73 28.16 29.62 29.28 31.40
13 28.77 1.41 0.0357 0.73 28.04 29.50 29.16 31.27
14 29.34 1.44 0.0363 0.74 28.60 30.08 29.74 31.88
15 29.31 1.44 0.0363 0.74 28.57 30.04 29.70 31.85
16 29.29 1.44 0.0362 0.74 28.55 30.03 29.69 31.83
17 28.25 1.39 0.0352 0.72 27.54 28.97 28.63 30.71
18 28.26 1.39 0.0352 0.72 27.54 28.98 28.64 30.72
19 28.43 1.40 0.0354 0.72 27.71 29.15 28.81 30.90
20 28.46 1.40 0.0354 0.72 27.74 29.18 28.84 30.93
21 28.22 1.38 0.0352 0.72 27.50 28.94 28.60 30.67
22 27.82 1.36 0.0348 0.71 27.11 28.53 28.19 30.24
23 27.84 1.37 0.0348 0.71 27.13 28.55 28.21 30.26
24 28.04 1.38 0.0350 0.71 27.33 28.76 28.42 30.48
25 28.50 1.40 0.0355 0.72 27.78 29.22 28.88 30.98
26 28.55 1.40 0.0355 0.72 27.83 29.28 28.94 31.03
27 29.15 1.43 0.0361 0.74 28.42 29.89 29.55 31.68
28 29.23 1.43 0.0362 0.74 28.50 29.97 29.63 31.77
29 27.86 1.37 0.0348 0.71 27.15 28.57 28.23 30.29


Der Anhang zeigt, wie das Ganze dann aussieht.

hakaze
28-01-2013, 13:10
Eigentlich ist es so (mit zweimal \closedcycle) genau richtig.

Du kannst höchstens noch das Neuzeichnen der Achsen einsparen, wenn du der ersten axis-Umgebung noch die Option "area style" (ohne Gänsefüßchen) mitgibst.

Minze
29-01-2013, 01:12
Ich hatte dann beim zweiten Diagramm natürlich gleich das nächste Problem:
Da sich die "Schläuche" dreier Kurven überlagerten, konnte ich sie nicht auf die oben genannte Weise zeichnen, da dann jeweils die etwas weiter unten liegenden Schläuche weiß überzeichnet wurden. Ich habe es dann so gelöst, dass die untere Grenze jedes Schlauchs umgekehrt in der Datentabelle erscheint, so dass tikz automatisch zurückläuft.
Das spart zwar das Weißzeichnen der unten liegenden Bereiche, erhöht aber den Aufwand bei der Erstellung der Datentabelle.