Seite 1 von 2

Graphen (Tikzpictures) gruppieren

Verfasst: Fr 15. Nov 2019, 17:12
von DEVV
Hey Leute,

ich habe 4 Graphen von denen jeweils 2 nebeinenader geplottet werden sollen. Dabei besitzen alle Graphen die selbe X-Achsenbeschriftung, haben aber alle eine andere Y-Achsenbeschriftung.

Nun habe ich 2 mal diese 4 Graphen. Einmal für normalverteilte Daten und einmal für gleichverteilte Daten (genaueres ist hier nicht wichtig).

Deswegen würde ich diese 4 Graphen gerne gruppieren und eine Überschrift drüber schreiben: "Gleichverteilte Daten" oder ähnliches.

Wenn ich das bei allen Graphen als Title setze, dann passen die nicht mehr nebeneinander. Deswegen würde ich es gerne als Überschrift drüber schreiben.

Was fallen euch da für Lösungen ein?

Hier einmal ein Bild vom Status Quo: (siehe Anhang)


Grüße
K

Verfasst: Fr 15. Nov 2019, 17:15
von Johannes_B
Vermutlich einfach als Text setzen. Du brauchst doch nichts spezielles dafür?

Verfasst: Fr 15. Nov 2019, 17:43
von DEVV
Stimmt. Manchmal kann es so simpel sein ^^. Hab ein center Block an den Anfang der Figure gesetzt und die Überschrift in nen textbf gesetzt.

Hab auch irgendwie drauf spekuliert, dass jemand mit etwas Ahnung um die Ecke kommt und mir irgendeine Lösung, die ich nicht beherrsche an den Kopf wirft (wie groupplots oder so).

Aller Anfang ist …

Verfasst: Fr 15. Nov 2019, 18:35
von Ratgeber
DEVV hat geschrieben:[…] Hab auch irgendwie drauf spekuliert, dass jemand mit etwas Ahnung um die Ecke kommt und mir irgendeine Lösung, die ich nicht beherrsche an den Kopf wirft (wie groupplots oder so).
Wenn man etwas nicht beherrscht, dann liest man halt zunächst darüber und meldet sich gegebenenfalls mit einem Minimalbeispiel, um auftretende Probleme zu klären. Aber genau das bedurfte bei Dir ja bisher immer einer expliziten Aufforderung durch potentielle Helfer. Die Bibliothek `groupplots` von »pgfplots« ist in dessen Anleitung gut dokumentiert. Eine andere Möglichkeit, die Graphen in einer Art Matrix zu setzen, wäre durch »subcaption« (aus dem Bündel »caption«) gegeben.

Re: Aller Anfang ist …

Verfasst: Fr 15. Nov 2019, 19:11
von DEVV
Ratgeber hat geschrieben: Wenn man etwas nicht beherrscht, dann liest man halt zunächst darüber
Dem kann ich prinzipiell zustimmen. Allerdings gibt es Situationen, in denen die Wissenquelle zu umfangreich ist (wie bei groupplots z.B.) und dann baue ich lieber auf Erfahrung von Leuten, die das Paket schonmal verwendet haben und theoretisch wissen, was man damit anstellen kann, als ein Handbuch zu lesen.
Ratgeber hat geschrieben: Aber genau das bedurfte bei Dir ja bisher immer einer expliziten Aufforderung durch potentielle Helfer.
Immer ein Minimalbeispiel zu liefern ist auch nicht die Allzweckwaffe.
z.B. sehe ich keinen Sinn in einem Minimalbeispiel wenn:
1. Ich es nicht bauen kann, weil ich nicht weiß welche Eigenschaften meiner Vorlage Einflüsse auf den Effekt haben, den ich beobachte.
2. Man kein minimalbeispiel bennötigt um mir zu helfen (wie hier z.B.).

Wen es aus Prinzip stört, dass ich in solchen Fällen kein Minimalbeispiel liefer, der braucht mir halt nicht helfen. Dann sind wir alle glücklich und evtl. ist ja jemand trotzdem so nett und hilft mir ...
Ratgeber hat geschrieben: Die Bibliothek `groupplots` von »pgfplots« ist in dessen Anleitung gut dokumentiert.
Auch hier wieder sehe ich ein Forum als "Forum" indem man sich mit anderen Leuten mit ggf. mehr Erfahrung auszutauscht, ohne eine Anleitung lesen zu müssen. Von daher finde ich diesen Beitrag schon legitim. Ich habe ein Problem, beschreibe es, liefer ein Foto vom Ist-Zustand in der PDF und jeder, der eine Idee hat, wie man mein Problem lösen kann, kann mir helfen.

Verfasst: Fr 15. Nov 2019, 19:54
von DEVV
So ich habe mir jetzt ohne viel Ahnung folgende Konfiguration zusammengesucht im Internet.
Allerdings sind die titles der nächsten Zeilen in den X-Achsenbeschriftungen der Zeilen zuvor.
Außerdem würde ich gerne die Y-Achsen-Beschriftung (Zahlen) auf beiden Seiten haben. Zusätzlich habe ich nicht gefunden, wie ich die Legende jetzt anzeigen lassen kann. Der Originale Graph sah vor, dass die 4 Kurven aus Graph 1 labels bekommen. Wenn ich das jetzt allerdings einfüge, hat der erste Graph eine eigene Legende.

Hokus Pokus:
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{amsmath,amsfonts,amssymb}
\usepackage{fullpage}
\usepackage{verbatim}

\usepackage{tikz,pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.6}
\usetikzlibrary{pgfplots.groupplots}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

	\begin{tikzpicture}[smooth]
		\begin{groupplot}[group style={group size=2 by 2}, grid=both, grid style=dashed]
			\nextgroupplot[title={\textbf{Durchsatz:} Erzeugung}, ylabel={Durchsatz [Mebibyte / Sekunde]}, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}]
	 		\addplot coordinates { (25.0,27.2706) (26.0,27.6152) (27.0,27.0114) (28.0,25.4822) (29.0,23.6201) (30.0,18.3911) };
			\addplot coordinates { (25.0,19.4066) (26.0,21.0439) (27.0,24.2483) (28.0,25.7858) (29.0,25.2643) (30.0,23.2176) (31.0,21.5053) };
			\addplot coordinates { (25.0,25.8846) (26.0,25.6254) (27.0,24.5522) (28.0,23.8694) (29.0,22.3375) (30.0,18.2088) };
			\addplot coordinates { (25.0,20.732) (26.0,22.2468) (27.0,25.0059) (28.0,26.3556) (29.0,24.6092) (30.0,22.1791) (31.0,20.697) };
			
			\nextgroupplot[title={\textbf{Durchsatz:} Vorgängeranfrage}, yticklabel pos=right, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Durchsatz [Millionen Anfragen / Sekunde]}]

			\nextgroupplot[title={\textbf{Speicherplatz: } Nach Erzeugung}, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Speicherverbrauch [Gigabyte]}]

			\nextgroupplot[title={\textbf{Speicherplatz: } Während Erzeugung}, yticklabel pos=right, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Speicherverbrauch [Gigabyte]}]
			
			\legend{\(\sigma_r\),  \(\sigma_\phi\)}        
		\end{groupplot}
	\end{tikzpicture}

\end{document}


Verfasst: Fr 15. Nov 2019, 20:29
von Bartman
Du bekommst die Beschriftung für die x-Achsen auch, wenn Du die Option xlabel und deren Zuweisung den Optionen der Umgebung groupplot hinzufügst. Sie muss dann nicht mehr jedem \nextgroupplot-Befehl mitgegeben werden.
DEVV hat geschrieben:Allerdings sind die titles der nächsten Zeilen in den X-Achsenbeschriftungen der Zeilen zuvor.


Benutze die Option vertical sep.

Verfasst: Fr 15. Nov 2019, 21:17
von DEVV
Okay ich hab die Option nicht im "group style" verwendet, sondern in den groupplot-Optionen.

€dit:
Weiß jemand wie ich die Breite der Plots oben so setze, dass das Tikzpicture nicht breiter als die Textbreite wird? Ich habe gerade das Problem, dass die Abbildung breiter als der Text ist.

Verfasst: Fr 15. Nov 2019, 23:46
von Bartman
Dein Beispiel erzeugt für den ersten Graph keine Legende. Dafür müsste der von Dir verwendete Befehl vor dem zweiten \nextgroupplot-Befehl stehen.

Du kannst mit einem Querverweis eine gemeinsame Legende erreichen:
\documentclass{article}

%\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{fullpage}
\usepackage{pgfplots}
\usepackage{showframe}

\pgfplotsset{compat=1.16}
\usepgfplotslibrary{groupplots}

\begin{document}
\begin{figure}[htbp]
\centering
\textbf{normalverteilte Daten}\par\medskip
\begin{tikzpicture}[smooth]
	\begin{groupplot}[
		group style={
			group size=2 by 2, 
			vertical sep=2cm
		},
		grid=both, 
		grid style=dashed,
		xlabel={Elemente in der Datenstruktur [$\log_2(n)$]},
		width=.48\linewidth
	]
	\nextgroupplot[
		title={\textbf{Durchsatz:} Erzeugung}, 
		ylabel={Durchsatz [Mebibyte / Sekunde]},
		legend to name=named,% <- eingefügt
		legend columns=-1,
		legend entries={$\sigma_r$,$\sigma_\phi$}% Alternative zu \legend 
	]
	\addplot coordinates { 
		(25.0,27.2706) (26.0,27.6152) (27.0,27.0114) (28.0,25.4822) (29.0,23.6201) (30.0,18.3911) 
	};
	\addplot coordinates { 
		(25.0,19.4066) (26.0,21.0439) (27.0,24.2483) (28.0,25.7858) (29.0,25.2643) (30.0,23.2176) (31.0,21.5053) 
	};
	\addplot coordinates { 
		(25.0,25.8846) (26.0,25.6254) (27.0,24.5522) (28.0,23.8694) (29.0,22.3375) (30.0,18.2088) 
	};
	\addplot coordinates { 
		(25.0,20.732) (26.0,22.2468) (27.0,25.0059) (28.0,26.3556) (29.0,24.6092) (30.0,22.1791) (31.0,20.697) 
	};
	\nextgroupplot[
		title={\textbf{Durchsatz:} Vorgängeranfrage}, 
		yticklabel pos=right, 
		ylabel={Durchsatz [Millionen Anfragen / Sekunde]}
	]
	\nextgroupplot[
		title={\textbf{Speicherplatz:} Nach Erzeugung}, 
		ylabel={Speicherverbrauch [Gigabyte]}
	]
	\nextgroupplot[
		title={\textbf{Speicherplatz:} Während Erzeugung}, 
		yticklabel pos=right, 
		ylabel={Speicherverbrauch [Gigabyte]}
	]
	\end{groupplot}
	\path (group c1r2.south east) -- node [below=1cm] {\ref{named}} (group c2r2.south west);% <- eingefügt
\end{tikzpicture}
\end{figure}
\end{document}

Verfasst: Sa 16. Nov 2019, 00:11
von DEVV
Das mit der Legende habe ich bereits gelöst. Interessant wäre noch
€dit:
Weiß jemand wie ich die Breite der Plots oben so setze, dass das Tikzpicture nicht breiter als die Textbreite wird? Ich habe gerade das Problem, dass die Abbildung breiter als der Text ist.
Hier einmal die aktuelle Version:
% -*- mode: latex; mode: flyspell; ispell-local-dictionary: "en_US"; coding: utf-8; fill-column: 80 -*-

\documentclass[a4paper,11pt,twoside,ngerman,color]{book}

\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{amsmath,amsfonts,amssymb}
\usepackage{fullpage}
\usepackage{verbatim}

\usepackage{tikz,pgfplots}
\usepgfplotslibrary{groupplots}
\usetikzlibrary{snakes,shapes,arrows,matrix,positioning}
\pgfplotsset{compat=1.6}
\usetikzlibrary{pgfplots.groupplots}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\begin{figure}
	\begin{center}
		\begin{tikzpicture}
		\begin{groupplot}[group style={group name=myplot, group size=2 by 2, vertical sep=64pt, horizontal sep=12pt}, grid=both, grid style=dashed]
		\nextgroupplot[title={\textbf{Durchsatz:} Erzeugung}, ylabel={Durchsatz [Mebibyte / Sekunde]}, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}]
		
		\addplot coordinates { (25.0,27.2706) (26.0,27.6152) (27.0,27.0114) (28.0,25.4822) (29.0,23.6201) (30.0,18.3911) }; \label{plots:plot1}
		\addplot coordinates { (25.0,19.4066) (26.0,21.0439) (27.0,24.2483) (28.0,25.7858) (29.0,25.2643) (30.0,23.2176) (31.0,21.5053) }; \label{plots:plot2}
		\addplot coordinates { (25.0,25.8846) (26.0,25.6254) (27.0,24.5522) (28.0,23.8694) (29.0,22.3375) (30.0,18.2088) }; \label{plots:plot3}
		\addplot coordinates { (25.0,20.732) (26.0,22.2468) (27.0,25.0059) (28.0,26.3556) (29.0,24.6092) (30.0,22.1791) (31.0,20.697) }; \label{plots:plot4}
		\nextgroupplot[title={\textbf{Durchsatz:} Vorgängeranfrage}, yticklabel pos=right, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Durchsatz [Millionen Anfragen / Sekunde]}]
		\addplot coordinates { (25.0,2.197) (26.0,2.06646) (27.0,1.97961) (28.0,1.8256) (29.0,1.56041) (30.0,0.776778) };
		\addplot coordinates { (25.0,3.15803) (26.0,2.24898) (27.0,2.12293) (28.0,1.98624) };
		\addplot coordinates { (25.0,2.14384) (26.0,2.06185) (27.0,1.98044) (28.0,1.8621) (29.0,1.75767) (30.0,0.845749) };
		\addplot coordinates { (25.0,3.00063) (26.0,2.43515) (27.0,2.11192) (28.0,2.04601) (31.0,0.887256) };
		
		\nextgroupplot[title={\textbf{Speicherplatz:} Nach Erzeugung}, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Speicherverbrauch [Gigabyte]}]
		
		\addplot coordinates { (25.0,1.83424) (26.0,3.78422) (27.0,8.48936) (28.0,19.8347) (29.0,46.6281) (30.0,121.489) (31.0,254.124) };
		\addplot coordinates { (25.0,3.06541) (26.0,5.35606) (27.0,8.42623) (28.0,15.1457) (29.0,31.0536) (30.0,68.7423) (31.0,153.308) };
		\addplot coordinates { (25.0,1.80516) (26.0,3.71904) (27.0,8.28671) (28.0,19.1333) (29.0,44.2815) (30.0,114.652) (31.0,238.808) };
		\addplot coordinates { (25.0,2.82335) (26.0,4.98529) (27.0,8.04859) (28.0,14.6836) (29.0,30.0445) (30.0,65.7417) (31.0,143.733) };
		
		\nextgroupplot[title={\textbf{Speicherplatz:} Während Erzeugung}, yticklabel pos=right, xlabel={Elemente in der Datenstruktur [$\log_2(n)$]}, ylabel={Speicherverbrauch [Gigabyte]}]
		
		\addplot coordinates { (25.0,1.83424) (26.0,3.78422) (27.0,8.48936) (28.0,19.8347) (29.0,46.6281) (30.0,121.489) (31.0,254.124) };
		\addplot coordinates { (25.0,3.06541) (26.0,5.35606) (27.0,8.42623) (28.0,15.1457) (29.0,31.0536) (30.0,68.7423) (31.0,153.308) };
		\addplot coordinates { (25.0,1.80516) (26.0,3.71904) (27.0,8.28671) (28.0,19.1333) (29.0,44.2815) (30.0,114.652) (31.0,238.808) };
		\addplot coordinates { (25.0,2.82335) (26.0,4.98529) (27.0,8.04859) (28.0,14.6836) (29.0,30.0445) (30.0,65.7417) (31.0,143.733) };
		
		\end{groupplot}
		\path (myplot c1r1.outer north west)% plot in column 1 row 1
		-- node[anchor=south,rotate=90] {Gleichverteilung}% label midway
		(myplot c1r2.outer south west)% plot in column 1 row 4
		;
		
		%Legend
		\path (myplot c1r1.north west|-current bounding box.north)--
		coordinate(legendpos)
		(myplot c2r1.north east|-current bounding box.north);
		\matrix[
		matrix of nodes,
		anchor=south,
		draw,
		inner sep=0.2em,
		draw
		]at([yshift=1ex]legendpos)
		{
			\ref{plots:plot1}& 1&[5pt]
			\ref{plots:plot2}&2&[5pt]
			\ref{plots:plot3}& 3&[5pt]
			\ref{plots:plot4}& 4\\
		};
		\end{tikzpicture}
		
		\caption{...}
		\label{plot:uniform_hm_u40}
	\end{center}
\end{figure}


\end{document}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%