Legende unter mehreren plots

Tabellen und Grafiken erstellen und anordnen


Cap
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mi 15. Apr 2015, 16:27

Legende unter mehreren plots

Beitrag von Cap »

Hallo zusammen,

ich habe folgendes Problem:

Ich abe mehrere pgf plots in einer figure, wie der angefügte screenshot zeigt. Ich füge sie mit hilfe des befehls subcaptiobox ein. Hier der entsprechende Code:
\begin{figure}[htbp]
	\centering
		\subcaptionbox{300pF\label{fig:300pF}}
			{\input{sweep_300pF.tex}}
		\subcaptionbox{47pF\label{fig:47pF}}
			{\input{sweep_47pF.tex}}\\[30pt]
		\subcaptionbox{20pF\label{fig:20pF}}
			{\input{sweep_20pF.tex}}
		\subcaptionbox{6.2pF\label{fig:6.2pF}}
			{\input{sweep_6.2pF.tex}}\\[30pt]
		\subcaptionbox{2.7pF\label{fig:2.7pF}}
			{\input{sweep_2.7pF.tex}}
		\subcaptionbox{1.0pF\label{fig:1.0pF}}
			{\input{sweep_1.0pF.tex}}
	\caption{Frequency sweeps over each path}
	\label{fig:single_paths}
\end{figure}
Hier der Code eines der pgf plots:
\begin{tikzpicture}
	\begin{axis}[
     width=0.475\textwidth, height=6cm,    
     grid = major,
     grid style={dashed, gray!30},
     xmin=0,     % start the diagram at this x-coordinate
     xmax=4,    % end   the diagram at this x-coordinate
     ymin=-3,     % start the diagram at this y-coordinate
     ymax= 3,   % end   the diagram at this y-coordinate
     ytick={-3, -2, -1, 0, 1, 2, 3},
     axis background/.style={fill=white},
     ylabel=Voltage {[}V{]},
     xlabel=Frequency {[}MHz{]},
     tick align=outside]
		\addplot [color = blue]   table[y index = 1]{IMG/sweep_300pF.txt};
		\addplot [color = red]    table[y index = 2]{IMG/sweep_300pF.txt};
		\addplot [color = green]  table[y index = 3]{IMG/sweep_300pF.txt};						
 	\end{axis} 
\end{tikzpicture}
Mein problem jetzt: wie man auf dem Screenshot sieht, sind in allen 6 plots die selben Farben, die auch für die gleichen Messpunkte stehen. Dementsprechend würde ich gerne eine gemeinsame, langezogene Legende über der Bildunterschrift "Figure 3.8: Frequency sweep over each path" machen (also sie soll von links nach rechts über die komplette seite gehen und es soll ein Strich in der entsprechenden Farbe sein und rechts oder links daneben dann die zugehörige bezeichnung, daneben das nächste und nochmal daneben das dritte, hoffe es ist verständlich wie ich meine :? ). Leider habe ich keine Ahnung wie ich das hin bekomme, ich konnte bisher nur findne, wie in die Legende INNERHALB eines plots verschiebe. Aber das bringt mir ja nichts, ich will ja nicht in jeder subfigure eine Legende haben.

Kann mir jemand von euch helfen udn sagen wie das geht?
Dateianhänge
screenshot.JPG
screenshot.JPG (73.69 KiB) 3605 mal betrachtet

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Das ist ein Crosspost. Hier wie auch auf tex.sx fehlt ein Minimalbeispiel.

In der Dokumentation von [d]pgfplots[/d] findet sich aber im Unterabschnitt Legends Outside of an Axis ein Beispiel, dass vermutlich zu Deinem Problem passt. In der Doku zur derzeit aktuellen Version 1.12 findest Du es auf Seite 216.

Gruß
Elke

Cap
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mi 15. Apr 2015, 16:27

Beitrag von Cap »

Hey,

ich wollte mich erst mal für den Hinweis bedanken, mit dem befehl aus der von dir genannten Dokumentation funktioniert das wirklich!

Allerdings bekomme ich, obwohl es funktioniert leider noch eine Fehlermeldung, obwohl es den richtigen output erzeugt. Die Fehlermeldung würde ich allerdings natürlich trotzdem gerne wegbringen. Jetzt wollte ich ein Minimalbeispiel erstellen, aber irgendwie läuft das Minimalbeispiel bei mir leider nicht. Ich bekomme es einfach nicht hin. Darum Poste ich erst nochmal so wie zuvor den Code - auch wenn es kein Minimalbeispiel ist. Vielleicht kann mir dann irgendjmd helfen.

Also in meinem Hauptdokument füge ich wie zuvor die unterschiedlichen Grafiken ein, nur diesmal wie in dem genannten Dokument zusätzlich mit der Referenz auf die Legende
\begin{figure}[htbp]
	\centering
		\subcaptionbox{300pF\label{fig:300pF}}
			{\input{sweep_300pF.tex}}
		\subcaptionbox{47pF\label{fig:47pF}}
			{\input{sweep_47pF.tex}}\\[30pt]
		\subcaptionbox{20pF\label{fig:20pF}}
			{\input{sweep_20pF.tex}}
		\subcaptionbox{6.2pF\label{fig:6.2pF}}
			{\input{sweep_6.2pF.tex}}\\[30pt]
		\subcaptionbox{2.7pF\label{fig:2.7pF}}
			{\input{sweep_2.7pF.tex}}
		\subcaptionbox{1.0pF\label{fig:1.0pF}}
			{\input{sweep_1.0pF.tex}}
		\ref{sweep}
	\caption{Frequency sweeps over each path}
	\label{fig:single_paths}
\end{figure}
In der ersten eingefügten Datei erstelle ich die Legendeneinträge und verpasse Ihnen den Verweis, so wie in dem genannten Dokument angegeben:
\begin{tikzpicture}
	\begin{axis}[
		 legend columns=4,
	   legend entries={\centering sweep1;,sweep2;,sweep3},
		 legend to name=sweep,
     width=0.475\textwidth, height=6cm,     % size of the image
     grid = major,
     grid style={dashed, gray!30},
     %xmode=log,log basis x=10,
     %ymode=log,log basis y=10,
     xmin=0,     % start the diagram at this x-coordinate
     xmax=4,    % end   the diagram at this x-coordinate
     ymin=-3,     % start the diagram at this y-coordinate
     ymax= 3,   % end   the diagram at this y-coordinate
     %pgfplots/xtick={0,5,...,60}, % make steps of length 5
 		ytick={-3, -2, -1, 0, 1, 2, 3},
     %extra x ticks={23},
     %extra y ticks={0.507297},
     axis background/.style={fill=white},
     ylabel=Voltage {[}V{]},
     xlabel=Frequency {[}MHz{]},
     tick align=outside]
		\addplot [color = blue]   table[y index = 1]{IMG/sweep_300pF.txt};
		\addplot [color = red]    table[y index = 2]{IMG/sweep_300pF.txt};
		\addplot [color = green]  table[y index = 3]{IMG/sweep_300pF.txt};						
 	\end{axis} 
\end{tikzpicture}
So funktioniert es wie gesagt, alledings pro Grafik, wo ich das so mache, bekomme ich eine Fehlermeldung die ich gerne noch weghaben würde. Nochmal sorry dafür, dass ich zu unfähig bin ein Minimalbeispiel zu erstellen. Aber ich schreibe gerade die Abschlussarbeit für mein Studium und wir haben da eine Vorlage bekommen. Bisher bin ich damit ganz gut klar gekommen und auch so Sachen wie das mit den \subcaptionbox und so zeug habe ich selber rausgefunden, mich eingelesen und eingefügt, lief immer alles. Nur als ich jetzt ein neues Dokument für das Minimalbeispiel erstellen wollte bin ich arg ins schleudern geraten. Da ich morgen aber meine Abgabe habe wollte ich nicht noch mehr Zeit darauf verwenden, ein Minimalbeispiel zu erstellen, das hat mich heute vormittag schon einige Stunden gekostet und ich habe es nicht geschafft dass es läuft. Ich hoffe mir kann auch so jemand weiterhelfen.

Cap
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mi 15. Apr 2015, 16:27

Beitrag von Cap »

Achja die Fehlermeldung wäre vielleicht noch interessant:

!Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "Diplomarbeit-figure_crossref0'(expected one of .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled system calls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also named 'write 18' or something like that. Or maybe the command simply failed? Error messages can be found in 'Diplomarbeit-figure_crossref0.log'. If you continue now, I'll try to typeset the picture.
See the tikz package documentation for explanation.


Dieses -shell-escape habe ich bei den Ausgabenprofilen bereits lange eingefügt, da ja sonst die pgf-plots generell nicht funktioniert hätten.

Wenn noch irgendwelche Infos benötigt werden bitte einfach fragen. Und bitte entschuldigt, dass ich es nicht geschafft habe, ein Minimalbeispiel zu erzeugen. Ich hoffe es geht auch so.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Vielleicht hilft Dir eine der Antworten auf die Frage Labels an pgfplots

Gruß
Elke

Cap
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mi 15. Apr 2015, 16:27

Beitrag von Cap »

Jetzt habe ich es endlich geschafft, das Minimalbeispiel zum laufen zu bringen, und auch hier kommt die Fehlermeldung, wie bei meinem Hauptdokument

Hier das Minimalbeispiel, ich hoffe mir kann nun geholfen werden ;)
\documentclass[
   pdftex,a4paper,11pt,oneside,fleqn,
   bibliography=totoc,listof=totoc,
   headlines=2.1,headsepline,
   numbers=noenddot
]{scrreprt}

   \usepackage[a4paper,left=3.2cm,right=2.2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}
   \usepackage[pdftex]{graphicx}         
   \usepackage{color}                        
   \usepackage{siunitx}
	 \usepackage{subcaption}
   \usepackage{pgfplots}
   \usepgfplotslibrary{external}
   \tikzexternalize[/tikz]


\begin{document}      

\begin{figure}[H]
	\centering
	
		\subcaptionbox{Five Paths on Bread Board\label{fig:sweep_5}}
			{      
				\begin{tikzpicture}
         \begin{axis}[
				legend columns=-1,					                                                  %start Legendeneinträge
				legend entries={Sensor 1;,Sensor 2;,Sensor 3;,Sensor 4;,Sensor 5},
				legend to name=sensor,			                                                                     %ende Legendeneinträge
        width=156mm, height=6.5cm, 
        grid = major,
        grid style={dashed, gray!30},
        xmin=-6,    
        xmax=6,   
        ymin=-6,    
        ymax= 8,  
        axis background/.style={fill=white},
        ylabel=Voltage {[}V{]},
        xlabel=Time {[}\SI{}{\us}{]},
        tick align=outside]
						\addplot{x};
						\addplot{x+1};
						\addplot{x+2};
						\addplot{x+3};
						\addplot{x+4};
         \end{axis}
      \end{tikzpicture}   }\\[15pt]
			
		\subcaptionbox{Six Paths\label{fig:sweep_6}}
			{     
				\begin{tikzpicture}
         \begin{axis}[
        width=156mm, height=6.5cm,     
        grid = major,
        grid style={dashed, gray!30},
        xmin=-6,  
        xmax=6,  
        ymin=-6,   
        ymax= 8,  
        axis background/.style={fill=white},
        ylabel=Voltage {[}V{]},
        xlabel=Time {[}\SI{}{\us}{]},
        tick align=outside]
						\addplot{x^2};
						\addplot{(x+1)^2};
						\addplot{(x+2)^2};
						\addplot{(x+3)^2};
						\addplot{(x+4)^2};
         \end{axis}
      \end{tikzpicture} 		}\\
	\ref{sensor}	 				                                             %Legende einfügen
	\caption{Sweeps over Setups}
	\label{fig:sweep_paths}
\end{figure}
 
\end{document} 

Noch so einer

Beitrag von Noch so einer »

Ich bekomme bei dem Beispiel mit LaTeX 2015/01/01:
! LaTeX Error: Unknown float option `H'.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.20 \begin{figure}[H]
Das liegt daran, dass figure normalerweise keine Option H kennt. Wenn du nicht willst, dass die Abbildung gleitet, dann verwende einfach keine Gleitumgebung!

Wenn ich einfach das unsinnige [H] weglasse, dann wird ein Fehler für das IMHO unsinnige \ref{sensor} zwischen dem Ende der zweiten \subcaptionbox und der \caption-Anweisung gemeldet. Lasse ich das ebenfalls weg, funktioniert alles:
\documentclass[
a4paper,11pt,oneside,fleqn,
bibliography=totoc,listof=totoc,
headlines=2.1,headsepline,
numbers=noenddot
]{scrreprt}

\usepackage[a4paper,left=3.2cm,right=2.2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}
\usepackage{graphicx} % Grafiken einbinden
\usepackage{color} % Farben ermöglichen
\usepackage{siunitx}
\usepackage{subcaption}
\usepackage{pgfplots}
\usepgfplotslibrary{external}
\tikzexternalize[/tikz]

\usepackage{etoolbox}

\begin{document}

\begin{figure}
\centering

\subcaptionbox{Five Paths on Bread Board\label{fig:sweep_5}}
{
\begin{tikzpicture}
\begin{axis}[
legend columns=-1, %start Legendeneinträge
legend entries={Sensor 1;,Sensor 2;,Sensor 3;,Sensor 4;,Sensor 5},
legend to name=sensor, %ende Legendeneinträge
width=156mm, height=6.5cm,
grid = major,
grid style={dashed, gray!30},
xmin=-6,
xmax=6,
ymin=-6,
ymax= 8,
axis background/.style={fill=white},
ylabel=Voltage {[}V{]},
xlabel=Time {[}\SI{}{\us}{]},
tick align=outside]
\addplot{x};
\addplot{x+1};
\addplot{x+2};
\addplot{x+3};
\addplot{x+4};
\end{axis}
\end{tikzpicture}
}\\[15pt]

\subcaptionbox{Six Paths\label{fig:sweep_6}}
{
\begin{tikzpicture}
\begin{axis}[
width=156mm, height=6.5cm,
grid = major,
grid style={dashed, gray!30},
xmin=-6,
xmax=6,
ymin=-6,
ymax= 8,
axis background/.style={fill=white},
ylabel=Voltage {[}V{]},
xlabel=Time {[}\SI{}{\us}{]},
tick align=outside]
\addplot{x^2};
\addplot{(x+1)^2};
\addplot{(x+2)^2};
\addplot{(x+3)^2};
\addplot{(x+4)^2};
\end{axis}
\end{tikzpicture}
}\\
\caption{Sweeps over Setups}
\label{fig:sweep_paths}
\end{figure}

\end{document}

Cap
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mi 15. Apr 2015, 16:27

Beitrag von Cap »

Wenn ich einfach das unsinnige [H] weglasse, dann wird ein Fehler für das IMHO unsinnige \ref{sensor} zwischen dem Ende der zweiten \subcaptionbox und der \caption-Anweisung gemeldet. Lasse ich das ebenfalls weg, funktioniert alles:
Aber genau dieses \ref{sensor} brauche ich doch, damit ich den Legendeneintrag außerhalb der beiden Plots, bekomme. So wie im Thread beschrieben. Das [H] erzeugt bei mir keine Fehlermeldung. Sondern eben nur dieses [ref{sensor}]. Und diese Fehlermeldung möchte ich eben wegbekommen. Aber den Legendeneintrag unterhalb der beiden Plots beibehalten. Es funktioniert auch soweit, nur eben dass diese Fehlermeldung kommt.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Die Fehlermeldung bekommst Du, weil die Externalisierung der Legende fehl schlägt.

Wenn Du die Legende nicht externalisiert brauchst, dann setze
\tikzset{external/export next=false}
direkt vor
\ref{sensor}
Falls Du die Legende auch als separates Bild brauchst, dann verwende meinen Vorschlag aus dem angegebenen Link.

Gruß
Elke

saputello
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 98
Registriert: Do 15. Jan 2015, 08:49

Beitrag von saputello »

Überlege Dir einfach mal, wie das mit dem \ref bei Externalisierung funktionieren soll. Die Fehlermeldung in test-figure_crossref0.log:
! Package tikz Error: Sorry, image externalization failed: the resulting image 
was EMPTY. I tried to externalize 'test-figure_crossref0', but it seems there i
s no such image in the document!?  
   You are currently using 'mode=convert with system call'. This problem can ha
ppen if the image (or one of the images preceeding it) was declared inside of a
 \label{} (i.e. in the .aux file): 'convert with system call' has no access to 
the main aux file.
   Possible solutions in this case:
   (a) Try using 'mode=list and make',
   (b) Issue the externalization command 'pdflatex -shell-escape -halt-on-error
 -interaction=batchmode -jobname "test-figure_crossref0" "\def\tikzexternalreal
job{test}\input{test}"' *manually* (also check the preceeding externalized imag
es, perhaps the file name sequence is not correct).
   Repeat: the resulting image was EMPTY, your attention is required .

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.79 \end{document}
sagt ja auch, dass Externalisierung mit einer Tikz-Grafik in einem Label so nicht funktioniert. Die Abbildungen werden ja nicht mehr im eigentlichen Dokument verarbeitet, sondern als (virtuelles) eigenes Dokument übersetzt. Also sind alle Information nur dort vorhanden und ggf. der dortigen aux-Datei vorhanden.

Wenn man aber, wie in der Fehlermeldung angegeben mit mode=list and make arbeitet:
\documentclass[
a4paper,11pt,oneside,fleqn,
bibliography=totoc,listof=totoc,
headlines=2.1,headsepline,
numbers=noenddot
]{scrreprt}

\usepackage[a4paper,left=3.2cm,right=2.2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}
\usepackage{graphicx} % Grafiken einbinden
\usepackage{color} % Farben ermöglichen
\usepackage{siunitx}
\usepackage{subcaption}
\usepackage{pgfplots}
\usepgfplotslibrary{external}
\tikzexternalize[mode=list and make]

\usepackage{etoolbox}

\begin{document}

\begin{figure}
\centering

\subcaptionbox{Five Paths on Bread Board\label{fig:sweep_5}}
{
\begin{tikzpicture}
\begin{axis}[
legend columns=-1, %start Legendeneinträge
legend entries={Sensor 1;,Sensor 2;,Sensor 3;,Sensor 4;,Sensor 5},
legend to name=sensor, %ende Legendeneinträge
width=156mm, height=6.5cm,
grid = major,
grid style={dashed, gray!30},
xmin=-6,
xmax=6,
ymin=-6,
ymax= 8,
axis background/.style={fill=white},
ylabel=Voltage {[}V{]},
xlabel=Time {[}\SI{}{\us}{]},
tick align=outside]
\addplot{x};
\addplot{x+1};
\addplot{x+2};
\addplot{x+3};
\addplot{x+4};
\end{axis}
\end{tikzpicture}
}\\[15pt]

\subcaptionbox{Six Paths\label{fig:sweep_6}}
{
\begin{tikzpicture}
\begin{axis}[
width=156mm, height=6.5cm,
grid = major,
grid style={dashed, gray!30},
xmin=-6,
xmax=6,
ymin=-6,
ymax= 8,
axis background/.style={fill=white},
ylabel=Voltage {[}V{]},
xlabel=Time {[}\SI{}{\us}{]},
tick align=outside]
\addplot{x^2};
\addplot{(x+1)^2};
\addplot{(x+2)^2};
\addplot{(x+3)^2};
\addplot{(x+4)^2};
\end{axis}
\end{tikzpicture}
}\\
\ref{sensor}
\caption{Sweeps over Setups}
\label{fig:sweep_paths}
\end{figure}

\end{document}
Und nach dem ersten pdflatex-Lauf make -f foo.makefile aufruft, dann einen weiteren pdflatex-Lauf macht, dann bekommt man auch tatsächlich was man will:

Bild

Und auch wenn du es nicht glauben magst: [H] ist falsch und war es schon immer! Vor LaTeX 2015/01/01 hat LaTeX das schlicht ignoriert, solange man nicht fixltx2e geladen hat, seit LaTeX 2015/01/01 wird es in der Voreinstellung als Fehler gemeldet.
Dateianhänge
test1.png
test1.png (49.31 KiB) 3505 mal betrachtet

Antworten