Seite 1 von 1

QAPF-Diagramm mittels PGFplots und ternaryaxis?

Verfasst: Fr 11. Okt 2013, 23:52
von elmar.a
Guten Abend,

ich versuche mich momentan im Erstellen eines QAPF Diagrammes mittels PGFplots. Dabei handelt es sich um ein doppeltes Dreiecksdiagramm, wie hier zu sehen: Wikipedia -- Streckeisendiagramm.

Mein Ansatz sieht wie folgt aus:

\documentclass[11pt]{scrartcl}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[eulergreek]{sansmath}

\pgfplotsset{
	compat=newest,
	every axis plot post/.append style={black,mark=none},
	}
\usepgfplotslibrary{ternary}
\usetikzlibrary{
	pgfplots.ternary,
	calc,
	arrows,
	}

\begin{document}

\begin{tikzpicture}[font=\sffamily]
	\begin{ternaryaxis}[
			xtick=\empty,
			ytick=\empty,
			ztick=\empty,
			]
	\addplot3 table {
			0.2 0.8 0
			0.2 0 0.8
			};
	\addplot3 table {
			0.6 0.14 0.26
			0 0.35 0.65
			};
	\end{ternaryaxis}

	\begin{ternaryaxis}[
			yshift=-35.8ex,
			xtick=\empty,
			ytick=\empty,
			ztick=\empty,
			grid=none,
			rotate=180,
			]
	\addplot3[solid] table {
			0.1 0.9 0
			0.1 0 0.9
			};
	\addplot3[solid] table {
			0 0.65 0.35
			0.1 0.585 0.315
			};
	\end{ternaryaxis}
\end{tikzpicture}


\end{document}
Ich habe also zwei ternary plots erstellt, den zweiten manuell gedreht und verschoben. Geht das auch einfacher? Gibt es eine Möglichkeit einen doppeltes Dreiecksdiagramm direkt zu erstellen?

Außerdem: Wie im Beispiel gezeigt, wird das Feld "Basalt, Andesit" (Mitte, ganz rechts) nicht von der X-Achse des oberen Diagrammes bzw. der Y?-Achse des unteren Diagramms durchschnitten. Kann dies per PGFplots erreicht werden?

Vielen Dank im Voraus,
elmar.a

Einfach zeichnen

Verfasst: Sa 12. Okt 2013, 09:35
von localghost
elmar.a hat geschrieben:[…] Kann dies per PGFplots erreicht werden? […]
Ich denke nicht. Das Diagramm mit PGF/TikZ zu zeichnen erscheint mir deutlich einfacher.


Thorsten

Verfasst: Sa 12. Okt 2013, 11:09
von elmar.a
Ich denke nicht. Das Diagramm mit PGF/TikZ zu zeichnen erscheint mir deutlich einfacher.
Ist es bei einem gezeichneten Diagramm noch möglich Daten/Messwerte einzuspeisen und zu plotten (ohne diese auf die TikZ-Koordinaten umzurechnen-9??
Diese sind in der Form 'Anteil Q oder F/Anteil A/ Anteil P' vorhanden, z.B.
	\addplot3[mark=*,only marks] table {
			Q A P
			0.9 0.1 0
			0.1 0.5 0.4
			0 0.5 0.5
			0 0.1 0.9
			};
(ggf. einfach im obigen Beispiel einfügen)...

Verfasst: Sa 12. Okt 2013, 12:17
von feuersaenger
Hi,

ich denke Du hast zwei Optionen: entweder "rotate around" oder "yscale=-1".

Tatsaechlich weiss ich nicht so ganz genau, wie es sein soll... das solltest Du mal ausprobieren.

"rotate around" rotiert um 180 grad, also genau was Du auch gemacht hast - allerdings habe ich das Zentrum der rotation so spezifiziert, dass Dein yshift wegfaellt. Nachteil ist (wie Du schon bemerkt hast), dass die tick label dann durcheinanderkommen. In meinem Fall habe ich die rotation in einen tikz scope untergebracht, damit das *gesamte* Dreieck (inklusive labels) rotiert wird (das vermeidet etwas unordnung scheinbar). Kann sein, dass hier pgfplots was verbessert werden sollte...

Die Alternative yscale=-1 ist eine Spiegelung und erscheint fast noch einfacher - und ist vermutlich auch das, was Du willst, denn Du moechtest doch vermutlich, dass die Ecken noch zu denselben Quantitaeten gehoeren, oder? Sonst wuerden die ja auch vertauscht. In dem Fall koenntest Du auch einfach die tick label wieder richten, indem die nochmal gespiegelt werden, siehe mein Beispiel.

Beachte, dass dies deshalb zu einem anderen Ergebnis fuehrt! Du muesstest also gut pruefen.

Hier ist beides drin; Du muesstest ein bisschen rumprobieren, was Du brauchst:
\documentclass{standalone}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[eulergreek]{sansmath}

\pgfplotsset{
   compat=newest,
   every axis plot post/.append style={black,mark=none},
   }
\usepgfplotslibrary{ternary}
\usetikzlibrary{
   pgfplots.ternary,
   calc,
   arrows,
   }

\begin{document}

\begin{tikzpicture}[font=\sffamily]
   \begin{ternaryaxis}[
     %    xtick=\empty,
      %   ytick=\empty,
       %  ztick=\empty,
         ]
   \addplot3 table {
         0.2 0.8 0
         0.2 0 0.8
         };
   \addplot3 table {
         0.6 0.14 0.26
         0 0.35 0.65
         };
	\node[fill,circle] (rotateaxis) at (axis cs:0,0.5,0.5) {};
   \end{ternaryaxis}

	\begin{scope}[
   %	rotate around={180:(rotateaxis)},
		yscale=-1,
		/pgfplots/ticklabel style={yscale=-1},
	]

   \begin{ternaryaxis}[
%         xtick=\empty,
 %        ytick=\empty,
  %       ztick=\empty,
   %      grid=none,
         ]
   \addplot3[solid] table {
         0.1 0.9 0
         0.1 0 0.9
         };
   \addplot3[solid] table {
         0 0.65 0.35
         0.1 0.585 0.315
         };
   \end{ternaryaxis}
	\end{scope}
\end{tikzpicture}

\end{document} 
Mit liebem Gruss

Christian

Verfasst: So 13. Okt 2013, 09:45
von elmar.a
Danke, Christian,

der workaround mit yscale=-1 gefällt mir gut; in dem Moment können x-Werte entweder Q oder F repräsentieren, y und z sind jeweils A bzw. P!

Meine (vorläufige?) Lösung sieht wie folgt aus:
\documentclass{standalone}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[eulergreek]{sansmath}

\pgfplotsset{
   compat=newest,
   every axis plot post/.append style={black,mark=none},
   }
\usepgfplotslibrary{ternary}
\usetikzlibrary{
   pgfplots.ternary,
   calc,
   arrows,
   }

\begin{document} 

\begin{tikzpicture}[font=\sffamily]
   \begin{ternaryaxis}[
	ytick=\empty,
        ztick=\empty,
        ]

        \addplot3[only marks] table {
	Q A P
	0.1 0.1 0.8
	};

   \end{ternaryaxis}

   \begin{scope}[
      yscale=-1,
      /pgfplots/ticklabel style={yscale=-1},
      ] 
   \begin{ternaryaxis}[
        ytick=\empty,
        ztick=\empty,
        clip=false,
        ] 
		 
        \addplot3[only marks] table {
        F A P
        0.1 0.1 0.8
	};

	\node[yscale=-1] at (0.5,0.95) {F};

   \end{ternaryaxis}
   \end{scope}
\end{tikzpicture} 
\nodes müssen bei der Version allerdings ebenfalls noch einmal gedreht bzw. gespiegelt werden, andernfalls stehen sie Kopf.

Falls noch jmd. etwas für die "unterbrochene" Achse in dem Beispielplot einfällt wäre ich sehr dankbar! Mir würde momentan nur in den Sinn kommen eine weiße Box drüberzulegen... wobei das definitiv nicht die schönste Lösung ist!!!??

Gruß,
Elmar