PGFplots: Surface-Plots mit Überschneidung

Tabellen und Grafiken erstellen und anordnen


Solmath

PGFplots: Surface-Plots mit Überschneidung

Beitrag von Solmath »

Hallo zusammen,

weiß jemand ob es möglich ist, dass sich zwei mit "surf" erstellte Ebenen innerhalb eines PGF-Plots überschneiden?

Ich hätte gerne, dass im unteren Beispiel die graue Ebene nicht komplett von der gelben überdeckt wird, sondern dass die graue von der x-Achse bis zur gelben Ebene über liegt.

Es handelt sich um einen Export aus Matlab, wo es auch korrekt dargestellt wird. Die Notlösung wäre ein Export als PDF, was ich aber eigentlich vermeiden möchte.

Viele Grüße,
Thomas
\documentclass{minimal}
\usepackage{pgfplots}
\begin{document}
	\begin{tikzpicture}
		\begin{axis}[%
			view={-45}{30},
			scale only axis,
			xmin=10, xmax=30,
			ymin=0, ymax=50,
			zmin=0, zmax=15000,
		]
		\addplot3[%
			surf,
			opacity=0.5,
			colormap/blackwhite,
		]
		coordinates{ 
			(10,0,2000)(10,50,2000)
			
			(30,0,2000)(30,50,2000)
		};
		\addplot3[%
			surf,
			opacity=0.7,
		]
		coordinates{ 
			(10,0,0)(10,50,8000)
			
			(30,0,0)(30,50,14000)
		};
		\end{axis}
	\end{tikzpicture}%
\end{document}

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hallo Thomas,

das kann PGFPlots nicht alleine.

Unterstuetzung fuer derlei ist zunaechst auch nicht geplant.

Eventuell kannst Du fuer solche Aufgaben ein Dritttool zuhilfe nehmen, dass das Berechnen von Schnittgeraden und das uebereinandersortieren uebernimmt.

Wenn Du das aus Matlab importierst, koennte auch das \addplot3 graphics feature eine interessante alternative sein (d.h. Du importierst eine 2d projektion als Bild und pgfplots macht ne 3d Achse drueber - das geht).

Mit liebem Gruss

Christian

Solmath
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Fr 21. Sep 2012, 13:57

Beitrag von Solmath »

Hallo Christian,

vielen Dank für die schnelle Antwort, ich dachte mir schon sowas.

Das \addplot3 graphics-Feature sieht in der Tat sehr vielversprechend aus. Allerdings habe ich Probleme bei der Umsetzung.

Ich habe versucht nach der Anleitung mit der Matlab-Funktion aus dem Manual vorzugehen, allerdings erhalte ich kein sinnvolles Ergebnis (siehe Beispiel, das Bild habe ich angehängt).

Außerdem habe ich festgestellt, dass die Punktdichte des Bildes für die Darstellung eine Rolle spielt. Die Grafik sieht mit einem 600dpi-PNG anders aus als mit 400dpi.

Mir ist auch nicht ganz klar, wieso die Koordinaten in der Matlab-Funktion noch mit 72.27/dpi skaliert werden, während im Manual einfach die gemessenen Pixel-Abstände aus GIMP verwendet werden. Für die Berechnung der Transformationsmatrix sollten die Absolutwerte doch egal sein.

Viele Grüße,
Thomas
\begin{tikzpicture}
\begin{axis}[
grid=both,minor tick num=1,
xlabel=$x$,ylabel=$y$,
]
\addplot3 graphics[
points={
(10,0,0) => (217.5628,34.6294)
(30,0,0) => (380.1703,92.5959)
(30,51.0352,14236.0599) => (217.5628,283.8103)
(10,51.0352,8728.2982) => (54.9553,174.6525)
}] {Beispiel.png};
\end{axis}
\end{tikzpicture}
Dateianhänge
Beispiel.png
Beispiel.png (120 KiB) 2842 mal betrachtet

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hallo Thomas,

die Punkte im 2d bild sind nicht muessen ein 1:1 mapping zwischen 3d Koordinaten und Bildkoordinaten erlauben. Darum sind die Absolutwerte durchaus wichtig... und die unterscheiden sich je nach Bildaufloesung. Darum muesstest Du beim Wechsel der Aufloesung auch diese Werte aktualisieren.

Beachte auch, dass man nicht einfach "pixel werte" nehmen kann - es muessen "point" werte sein (vermutlich optimalerweise typografische points). Immerhin muss das TeX nachher in der Lage sein, irgendwelche Punkte an Bildkoordinaten zu setzen.

Und da kommt dann auch irgendwo so ein Faktor wie 72 rein.

Verifiziere nochmal, dass Deine Angaben zu "points" genau zu dem Bild passen (mit pt units im gimp, falls Du es manuell machst). Wenn es dann immer noch nicht klappt, kann ich nochmal reingucken...

Mit liebem Gruss

Christian

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

mit folgendem klappts.

Ich habe gerade etwas debug info in meinen code eingebaut, sodass ich grob erkennen konnte, welche punkte Du gewaehlt hast.

Damit konnte ich dies hier ausmessen. Es sah so aus, als haettest Du zuerst die Puntke gemessen und danach den Weissen Rand des Bildes weggeschnitten.
\documentclass[a4paper]{article}

\usepackage{pgfplots}


\pgfplotsset{compat=1.6}


\begin{document}

\begin{tikzpicture}
\begin{axis}[
grid=both,minor tick num=1,
xlabel=$x$,ylabel=$y$,
clip=false,
]
\addplot3 graphics[
points={
(10,0,0) => (163,0)
(30,0,0) => (325,58)
(10,51.0352,8728.2982) => (0,140)
(30,51.0352,14236.0599) => (162,249)
}] {Beispiel.png};
\end{axis}
\end{tikzpicture}

\end{document}

Solmath
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Fr 21. Sep 2012, 13:57

Beitrag von Solmath »

Hallo Christian,

das Problem war tatsächlich, dass ich dachte "Pixel" und "Points" wären äquivalent. Über GIMP habe ich dann bei Messung in pt beinahe die gleichen Werte erhalten wie Du.

Die ursprünglichen Punkte hatte ich über die Matlab-Funktion aus dem Manual erhalten (pgfplotscsconversion). Damit ist bei der Bestimmung der "weiße Rand" natürlich noch vorhanden. Kann sein, dass ich die manuelle und "automatische" Methode da etwas vermischt habe.

Dank Deiner Anmerkungen funktioniert es jetzt jedenfalls und ich bin mal wieder ziemlich begeistert von dem Paket.

Danke und viele Grüße,
Thomas

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hi Thomas,

freut mich, dass das hilft und danke fuer das Lob!

Ich habe den Thread als anlass genommen, einen neuen switch
\addplot3 graphics[ debug=visual, .... ] ....
zu machen. Dann sieht man vielleicht auch was mehr.

Mit liebem Gruss

Christian

Antworten