Seite 1 von 2

tikz - Flächen zwischen Kurven

Verfasst: Mo 14. Dez 2009, 21:21
von Myri
Hallo an alle,

ich habe kommenden Freitag einen Abgabetermin und bereits seit 3 Tagen mit einem Problem zu kämpfen, dass ich für ein sehr kleines hielt und darum erst so spät anging.

Momentan sehen alle meine Graphen in etwa so aus wie in der obigen Abbildung meines Minimalbeispiels.

Sämtliche Kurven wurden mit gnuplot geplottet und bestimmte Bereiche zwischen ihnen müssen markiert werden. Da aber alle Graphen aufwärts entlang der x-Koordinaten (ein domain 4:1 statt 1:4 ändert daran natürlich nichts...) geplottet werden, sind die shade-, fill- usw. Befehle nutzlos.

Ich hoffe inständig, dass jemand eine Idee hat, da ich bereits dabei bin, die table-Files von Hand zu ändern (mit absteigend sortierten x-Koordinaten), was natürlich totaler Blödsinn ist, da ich diesen Vorgang bei jeder Änderung wiederholen müsste und von mir ein funktionsfähiges tex-File verlangt wird (das auch die table-Files korrekt erstellt).

Bitte bitte Hilfe!

\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage{tikz}


\begin{document}

\textbf{So siehts aus:}\\

\begin{tikzpicture}[scale=2]
	\draw
		plot [id=a,domain=1:4] function{5-x*0.2} node[right]{endet hier...}
		plot [id=b,domain=4:1] function{3-x*0.1} node[right]{endet hier...};
	
	\shade[top color=red!10,bottom color=blue!10]
		plot [id=a,domain=1:4] function{5-x*0.2} --
		plot [id=b,domain=4:1] function{3-x*0.1};	
		
\end{tikzpicture}\\


\textbf{Und so soll es aussehen:}\\

\begin{tikzpicture}[scale=2]
	\draw
		plot [id=a,domain=1:4] function{5-x*0.2} node[right]{endet hier...}
		plot [id=b,domain=4:1] function{3-x*0.1} node[right]{endet hier...};
			
	\shade[top color=red!10,bottom color=blue!10]
		(1,4.8) -- (4,4.2) --
		(4,2.6) -- (1,2.9);
				
\end{tikzpicture}

\end{document}
[/b]

Verfasst: Mo 14. Dez 2009, 21:26
von Myri
P.S.: Im Code meines Minimalbeispiels wurde an einer Stelle aus "8" und ")" ein dämlicher Smilie gemacht.

Verfasst: Mo 14. Dez 2009, 21:52
von bloodworks
Seh ich das richtig dass du das mit dem x in dem ersten Plot meinst? Für shade musst du auch einen komplett geschlossenen Pfad angeben. Du musst also von den Enden der KUrven ein Lot fällen. Weisch wenn du
\shade[top color=red!10,bottom color=blue!10]
     plot [id=a,domain=1:4] function{5-x*0.2}-- (4,2.6)   -- plot [id=b,domain=1:4] function{3-x*0.1}--(1,2.9) ;  
machst dann tut das ja

Verfasst: Mo 14. Dez 2009, 22:10
von Myri
Vielen Dank für die schnelle Antwort!

Mir ist bewusst, wie shade funktioniert. Um die Problematik klar zu machen, habe ich in den Anhang mein lauffähiges Minimalbeispiel gepackt.

Ersetzt man nun das test.b.table-File durch das test.b.table_neu (also letzteres einfach in das erstere umbennen), funktioniert das shading genau so, wie ich es benötige.

(Dabei sitze ich übrigens seit einigen Stunden: ich ändere die Reihenfolge in den table-Dateien meiner Arbeit (nach x absteigend).)

Verfasst: Mo 14. Dez 2009, 22:26
von bloodworks
Ich kann leider heut abend nimmer drüber schaun. Morgen aber.

Verfasst: Mo 14. Dez 2009, 22:27
von Myri
P.S.:

Meiner Ansicht nach kann es nur zwei Lösungen geben:
- gnuplot irgendwie sagen, die table-Files nach absteigendem x anzulegen
- tikz sagen, bestimmte table-Files "rückwärts" einzulesen (domain 4:1 bringt natürlich nichts in meinem Beispiel, denn der Bereich wird dennoch von x=1 nach x=4 ausgelesen)

Sehe nämlich grade, dass mit den table-Files, die ich bereits entsprechend bearbeitet habe, alles wunderbar und genau so funktioniert, wie ich es brauche.

Leider ist diese Handarbeit im Endeffekt KEINE Lösung, da man von mir ein lauffähiges TeX-File verlangt. Lässt man LaTeX aber komplett durchlaufen, werden ja auch die table-Files wieder neu erstellt...

Verfasst: Mo 14. Dez 2009, 22:28
von Myri
In jedem Fall vielen Dank, bloodworks!

Verfasst: Mo 14. Dez 2009, 22:32
von cliffhanger
Schau doch mal die Doku von pgfplots an, speziell Abschnitt 4.5 "Closing Plots".

Pgfplots setzt auf tikz auf und ist speziell zum Plotten von Funktionen und Messwerten entwickelt.

Verfasst: Mo 14. Dez 2009, 22:55
von Myri
Leider muss man ja auch mit pgfplots auf gnuplot zurückgreifen, sobald man eine Funktion hat, die "etwas" komplizierter ist.

Und die gestapelten Graphen unter 4.5 helfen leider auch nicht weiter...

Dennoch danke für den Hinweis!

Verfasst: Di 15. Dez 2009, 03:29
von Myri
Problem gelöst!

Bloodworks meinte quasi, dass ich ja nur noch die Eckpunkte bräuchte für einen kompletten Pfad. Ich wusste jedoch, dass man über LaTeX mit gnuplot (und das benötige ich in meinen Fällen zur Berechnung der Eckpunkte) keine einzelnen Punkte, sondern nur Funktionen mit mind. 2 Punkten berechnen kann, die noch dazu nebeneinander liegen müssen (dadurch wird der Pfad nicht perfekt, sondern immer etwas verzerrt)...

...AUSSER, man benutzt die Option parametric! Dann sind auch Punkte übereinander (im Bsp. unten mit einem Abstand von 0.001) möglich!

Wahrscheinlich habe ich mich so verwirrend ausgedrückt, dass man gar nicht genau verstehen kann, was ich eigentlich wollte. Dennoch folgt das jetzt endlich funktionierende Minimalbeispiel (bitte als test.tex speichern):
\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage{tikz}


\begin{document}

\newcommand{\FunktionOben}[1]{(5-#1*0.2)}
\newcommand{\FunktionUnten}[1]{(3-#1*0.1)}

\newcommand{\vonX}{1}
\newcommand{\bisX}{4}

\begin{tikzpicture}[scale=2]
	
	\draw
		plot [id=a,domain=\vonX:\bisX] function{\FunktionOben{x}}
		plot [id=b,domain=\vonX:\bisX] function{\FunktionUnten{x}};
			
	\shade[top color=red!10,bottom color=blue!10]
		plot [parametric,domain=(\FunktionUnten{\vonX}):(\FunktionUnten{\vonX}+0.001),id=untenlinks] function{\vonX,t} --
		plot file {test.a.table} --
		plot file {test.b.table} --
		plot [parametric,domain=(\FunktionOben{\bisX}):(\FunktionOben{\bisX}-0.001),id=ObenRechts] function{\bisX,t};		

\end{tikzpicture}

\end{document}