pgfplots untereinander ausrichten (pgfplots-Profis hier?)

Tabellen und Grafiken erstellen und anordnen


pooz
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Fr 19. Feb 2010, 10:56

pgfplots untereinander ausrichten (pgfplots-Profis hier?)

Beitrag von pooz »

Hallo, liebe Leute,

ich möchte gerne zwei mit pgfplots erstellter Bilder der gleichen Breite untereinander bringen.

Das Problem ist, dass die Y-Achsenbeschriftungen bestehend aus ylabel mit unterschiedlichen Abständen zur Y-Achse stehen (aufgrund \pgfplotsset{compat=newest} ).

Das hat zur Folge, dass das eine Bild eine unterschiedliche Größe zum Anderen annimmt, obwohl der Plot ansich (sprich Funktionskurve Y über X) exakt gleich groß ist.

Insgesamt also sind beide Bilder zentriert, aber die Zeichnungen stehen nicht untereinander.

Hab auch schon
ylabel style={overlay},
yticklabel style={overlay},
probiert, aber klappt nicht.

Ich bitte um Hilfe!
Vielen Dank.

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Schiebung

Beitrag von localghost »

Du arbeitest doch in der Umgebung tikzpicture. Und in der kannst Du Inhalte durch Verschiebung beliebig positionieren. Du packst also die betreffende Umgebung axis in eine Umgebung scope und gibst dieser entsprechende Parameter mit. Das alles steht in der Anleitung von pgf/tikZ. Der Ursprung der Achsen eines Diagramms fällt übrigens mit dem Koordinatenursprung zusammen. Das kannst Du ganz leicht überprüfen, wenn Du das Bild mal mit einem Gitter unterlegst.


Thorsten
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

pooz
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Fr 19. Feb 2010, 10:56

Beitrag von pooz »

Richtig, ich befinde mich in der tikzpicture-Umgebung.

Allerdigns habe ich den Sinn und die Umsetzung von Scope aus der Anleitung nicht verstanden.

pgfplots bietet doch selbst von Haus aus die Möglichkeit, bestimmte pgf-elemente, in diesem Fall die Achsenbschirftung ylabel, aus einem Sichtbereich mittels des Stils overlay aus der Berechnung der Bildgröße herauszunehmen. Dadurch sollte die beiden Plots doch einen gemeinsamen Angelpunkt haben, wenn sie die gleiche größe besitzen.

Aber das funktioniert nicht.

Ich kriege auch kein Gitter mittles
\draw	(0,0) grid +(2,2)
hinter meine plots gelegt.
Vor \begin{axis} erhalte ich die Fehlermeldung, dass meine Achsen leer sind, und falls ich es danach einfüge, hört der compiler nicht mehr auf zu rechnen :-)

Ich bin leider noch immer etwas ratlos. :-(

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Geltungsbereich

Beitrag von localghost »

pooz hat geschrieben:[…] Allerdigns habe ich den Sinn und die Umsetzung von Scope aus der Anleitung nicht verstanden. […]
Der Begriff »scope« kann hier mit »Geltungsbereich« interpretiert werden. Alle Befehle innerhalb dieser Umgebung erhalten zusätzlich all die Eigenschaften, die der Umgebung als optionale Argumente mitgegeben werden können. Also kannst Du auch einen »shift« angeben. Die Beispiele in der Anleitung sollten dies ausreichend erklären.
pooz hat geschrieben:[…] pgfplots bietet doch selbst von Haus aus die Möglichkeit, bestimmte pgf-elemente, in diesem Fall die Achsenbschirftung ylabel, aus einem Sichtbereich mittels des Stils overlay aus der Berechnung der Bildgröße herauszunehmen. Dadurch sollte die beiden Plots doch einen gemeinsamen Angelpunkt haben, wenn sie die gleiche größe besitzen. […]
Ist mir jetzt nicht geläufig, ob man overlay in dieser Art verwenden kann. Daher kann ich dazu nichts sagen. Du solltest dir darüber im Klaren sein, dass ein Plot einen Knoten (node) darstellt. Daher erscheint mir es mir auch eher unwahrscheinlich, dass diese Methode erfolgreich sein könnte.
pooz hat geschrieben:[…] Ich kriege auch kein Gitter mittles
\draw	(0,0) grid +(2,2)
hinter meine plots gelegt.
Vor \begin{axis} erhalte ich die Fehlermeldung, dass meine Achsen leer sind, und falls ich es danach einfüge, hört der compiler nicht mehr auf zu rechnen […]
Nun ja, so ein Gitter würde ich gleich zu Beginn der Umgebung tikzpicture vor allen anderen Elementen zeichnen. Zumindest funktionierte das bei meinem letzten Versuch.
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

pooz
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Fr 19. Feb 2010, 10:56

Re: Geltungsbereich

Beitrag von pooz »

localghost hat geschrieben:...
Ist mir jetzt nicht geläufig, ob man overlay in dieser Art verwenden kann. Daher kann ich dazu nichts sagen. Du solltest dir darüber im Klaren sein, dass ein Plot einen Knoten (node) darstellt. Daher erscheint mir es mir auch eher unwahrscheinlich, dass diese Methode erfolgreich sein könnte....
Seite 205 des pgfmanuals v1.4 zeigt diese methode für genau den gesuchten Einsatzzweck. Leider klappt es bei mir nicht :-(

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Nachfragen

Beitrag von localghost »

pooz hat geschrieben: […] Seite 205 des pgfmanuals v1.4 zeigt diese methode für genau den gesuchten Einsatzzweck. Leider klappt es bei mir nicht […]
Und was gedenkst Du jetzt zu tun? Wie sieht deiner Meinung nach der nächste Scrhritt aus?
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

pooz
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Fr 19. Feb 2010, 10:56

Beitrag von pooz »

Hoffen, dass jemand Ähnliches umsetzen wollte und eine Lösung entweder mit dem overlay oder einer Alternativen gefunden hat. :-)

Meine Hoffnung rührt daher, dass ich nicht glaube, dass ich der einzige bin, der versucht hat 2 pgfplots untereinander an den gleichgroßen X-Achsen unabhängig ihrer ungleichen Y-Labels auszurichten. :wink:

EDIT:
Ich zeige gerne den Ausschnitt, meines einen pgfplot-codes. Das 2. Bild ist analog dazu aufgebaut.
\begin{tikzpicture}
\begin{axis}[%
%view={0}{90},
scale only axis,
ylabel style={overlay},
yticklabel style={overlay},
width={8cm},
height={3cm},
xmin=10, xmax=20,
ymin=0.1, ymax=0.2,
xlabel={spokk},
ylabel={mokk},
axis on top]
%...
Der Fehler sieht so aus, dass die Plots horizontal zueinander verschoben sind.

Danke und Grüße!!

Feuersaenger

Beitrag von Feuersaenger »

Hallo pooz,

danke fuer Deine private Anfrage an mich per Mail!

Gerne antworte ich Dir auch hier im Forum.

Zunaechst in Kuerze: Dein Ansatz wirkt korrekt, soweit wie ich es anhand der Codefragmente beurteilen kann. Das es nicht funktioniert, scheint ein Fehler zu sein. Bei mir funktioniert das mit overlay auch korrekt, genauso, wie Du es gemacht hast.

In dem pgfplots ChangeLog steht, dass in Version 1.3 noch ein Fehler bei overlay war, der ab 1.3.1 behoben ist. Vielleicht hilft ein einfaches upgrade des pgfplots pakets?

Da Du aber auch nach Alternativen gefragt hast, moechte ich Dir gerne eine solche schildern, die ich fuer weitreichender *und* einfacher halte. Dummerweise geht die dann und nur dann, wenn Du pgfplots 1.4.1 (das ist die aktuelle stable version) *und* pgf in einer Version, die neuer als Sommer 2010 ist, hast. Sprich: entweder die Entwicklerversion von pgf oder die (hoffentlich innerhalb der naechsten Tage) erscheinenden naechste stable von pgf.

Dieses feature ist im manual von pgfplots 1.4.1 beschrieben (vgl. http://pgfplots.sourceforge.net/pgfplots.pdf Abschnitt 4.18.6 Bounding box restrictions). Es funktioniert so:
Du schreibst ans das tikzpicture (nicht an die Axis environment)
\begin{tikzpicture][trim axis left] oder 'trim axis right' oder beides.
Dann wird die bounding box des pictures so beschnitten, dass alles jenseits des linken (bzw. rechten oder beider) Randes der *box* weggeschnitten wird.

Das hat quasi denselben Effekt wie das overlay zeug, nur dass Du es nicht explizit in jedem style setzen musst und dass es auch zu weit nach rechts hinausragende x (!) ticks beachtet.

Hinzukommt, dass dieses feature auch mit der Bildexternalisierung zurecht kommt, was mit overlay nicht moeglich ist.

Hier ist ein Minimalbeispiel:
\documentclass[a4paper]{article}

\usepackage{pgfplots}

\pgfplotsset{compat=1.3}

\begin{document}

\begin{figure}
	\centering
	\begin{tikzpicture}
		\begin{axis}[ylabel=$y$]
		\addplot {x};	
		\end{axis}
	\end{tikzpicture}

	\begin{tikzpicture}
		\begin{axis}[ylabel=$y$]
		\addplot {100*x};	
		\end{axis}
	\end{tikzpicture}

	\caption{Problematic: No horizontal alignment}
\end{figure}

\begin{figure}
	\centering
	\pgfplotsset{
		yticklabel style={overlay},
		ylabel style={overlay},
	}%
	\begin{tikzpicture}
		\begin{axis}[ylabel=$y$]
		\addplot {x};	
		\end{axis}
	\end{tikzpicture}

	\begin{tikzpicture}
		\begin{axis}[ylabel=$y$]
		\addplot {100*x};	
		\end{axis}
	\end{tikzpicture}

	\caption{Solution (1): overlay for $y$ descriptions}
\end{figure}

\begin{figure}
	\centering
	\begin{tikzpicture}[trim axis left,trim axis right]
		\begin{axis}[ylabel=$y$]
		\addplot {x};	
		\end{axis}
	\end{tikzpicture}

	\begin{tikzpicture}[trim axis left,trim axis right]
		\begin{axis}[ylabel=$y$]
		\addplot {100*x};	
		\end{axis}
	\end{tikzpicture}

	\caption{Solution (2): trim left/right feature (REQUIRES DEVELOPER VERSION OF PGF, watch out for new PGF versions)}
\end{figure}
\end{document}
Das resultierende pdf schicke ich Dir per Mail, weil ich das hier irgendwie nicht hochladen kann (vermutlich weil ich nur Gast bin).

Gruss

Christian

pooz
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Fr 19. Feb 2010, 10:56

Beitrag von pooz »

Hallo Christian,

herzlichen Dank für deine zügige und ausführliche Antwort.
Und sogar noch mit einem ausgezeichneten Minimalbeispiel :-)

Um so blamierender ist es für mich, dass ich es dennoch nicht hinbekomme :-(

Der Reihe nach:
Ich habe auf Version 1.4.1 aktualisiert und vorerst die overlay-Variante probiert. Dein Minimalbeispiel konnte ich (bis auf die Trim-Methode) erfolgreich darstellen. In deine Beispieldatei habe ich dann versucht meinen Code einzubinden und bin kläglich an der erfolgreichen Darstellung meiner Plots gescheitert. Ich muss dazu sagen, dass die Plots in extra Dateien ausgelagert sind und sie mit "input" einfügt wurden.

Folgende Variante habe ich druch probiert, und das Ergebnis sieht sehr merkwürdig aus (das erste Bild hat seine linke Y-Achse genau in der Mitte und ragt rechts über die Seite hinaus)

1)
\begin{figure}
	\centering
	\pgfplotsset{
      yticklabel style={overlay},
      ylabel style={overlay},
	}%

	\input{myPlot1.tikz}\\%
	\input{myPlot2.tikz}
	
\end{figure}
2) Alternativ habe ich die Overlay-Optionen in jede der beiden Dateien wie im Posting hier eingefügt.
\begin{figure}
%options included in each file
	\input{myPlot1.tikz}\\%
	\input{myPlot2.tikz}
	
\end{figure}
3) Spätestens jetzt hab ich Zweifel an meine Einfügemethode bekommen und es mit dem Subfigure-Paket eingebunden.
%(...)
\usepackage{subfigure}
%(...)
\begin{figure}
	\centering
	\pgfplotsset{
      yticklabel style={overlay},
      ylabel style={overlay},
	}%
	\subfigure[][]{
		\input{myPlot1.tikz}
	}\\
	\subfigure[][]{
		\input{myPlot2.tikz}
	}
\end{figure}
Wo könnte der Fehler stecken?
Oder würde es weniger Aufwand betreiben, sich an die Trim-Methode zu wagen?

Besten Dank und viele Grüße



EDIT:
Die von Christian Feuersaenger freundlicherweise zur Verfügung gestellte originale .PDF-Datei zu dem Minimalbeispiel hier habe ich angefügt.
Vielen Dank, es ist sehr anschaulich.
Pooz
Dateianhänge
P.pdf
(48.2 KiB) 894-mal heruntergeladen
Zuletzt geändert von pooz am Sa 23. Okt 2010, 20:01, insgesamt 1-mal geändert.

Feuersaenger

Beitrag von Feuersaenger »

Hallo Pooya,

ein tikzpicture wird ja immer zu einer Box, die dann entsprechend der LaTeX formatierungsanweisungen gesetzt wird. Vielleicht geht hier was schief?

In meinem Beispiel hatte ich ja \centering, dann ein tikzpicture, dann eine leere Zeile (d.h. einen neuen Paragraph) und dann das zweite.

Soweit ich mich erinnere, hat das einen anderen Effekt als '\\' .

Im Prinzip sollte das auslagern in externe Dateien gar keinen Unterschied machen, daran kann es eigentlich nicht liegen.

Mein Vorschlag: mach mal
\setlength{\fboxsep}{0pt}
\fbox{\input{....}}

damit siehst Du exakt, welche Bounding box der macht (wichtig ist hier das fboxsep, ich hoffe, es hiess auch so). Wenn die Bounding box korrekt ist, kann es sich nur im LaTeX formatierungen handeln (denn die Boxen sind ja dann korrekt).

Stell auch sicher, dass Du nach dem letzten tikzpicture einen neuen Paragraph hast. Sonst wirkt \centering nicht.

Wenn das auch nicht wirkt, kannst Du mir ja mal Deine komplette Datei mit allen input files schicken (per Mail z.B.) und ich probiere es komplett aus.

Mit liebem Gruss

Christian

Antworten