pgfplots untereinander ausrichten (pgfplots-Profis hier?)

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: pgfplots untereinander ausrichten (pgfplots-Profis hier?)

von pooz » Mo 25. Okt 2010, 22:30

Hi Christian,

recht herzlichen Dank!
Das hört sich ausgezeichnet an. Ich konnte es zwar noch nicht ausprobieren, aber ich bin mir sicher, dass ich mit deiner Hilfe das umsetzen kann, was ich vor hatte.

Ich werde es aber bald testen!

Ich bedanke mich für deine detaillierte Hilfestellungen!
Beste Grüße

:D

von Gast » Mo 25. Okt 2010, 22:21

Hallo Pooya,

zu Deiner ersten Frage: Du kannst den Teil mit
\pgfplotsset{
  ylabel style={overlay},
  yticklabel style={overlay},
}
im Prinzip in die praeambel schreiben - dann gilt das fuer das gesamte Dokument.Alternativ kannst Du mit
\pgfplotsset{
   mein overlay style/.style={
    ylabel style={overlay},
    yticklabel style={overlay},
  }
}
in der praeambel einen neuen Style definieren. Den kannst Du dann an jede Achse, die das betrifft, von Hand uebergeben.

Das sollte gut klappen. Einziger NAchteil: wenn man die x Beschriftung nach links oder rechts rausguckt, verschiebt sich doch wieder was.
Ich habe in meiner Arbeit das trim-zeug (beispiel in vorigem post) dafuer verwendet, das ist kann die Aufgabe meiner Meinung nach verlaesslicher (und klappt auch noch, wenn man die external lib verwendet). Ich wuerde - falls moeglich - eher die trim sachen empfehlen.


Zu dem 'compat=newest': dieses Feature erlaubt es, neue Sachen zu schreiben, die sehr sinnvoll sind, aber u.U. inkompatibel zu altem sind. Nimm am besten "compat=1.3" oder "compat=1.4" -- dann bleibt Dein .tex file immer kompilierbar, selbst wenn in version 1.23 mal was anders wird ;-)
Aber zu Deiner eigentlichen Frage: die Plazierung der Labels ist m.E. eine Geschmacksfrage. Entscheide, wie es Dir besser gefaellt. Und: ja, man kann das auch separat fuer plots steuern:
\begin{axis}[ylabel absolute, ylabel=bla]
oder
\begin{axis}[ylabel near ticks, ylabel=bla]
Das "compat" zeug hat folgende Bewandnis: fuer "compat=pre 1.3" wird "ylabel absolute" als default genommen und sonst "ylabel near ticks". Mit anderen Worten: Du kannst auch
\pgfplotsset{compat=newest, ylabel absolute}
setzen, dann hast Du sowohl die aktuellsten Features als *auch* die absolute Positioninerung.

Was das Deine Frage?

Mit liebem Gruss

Christian

von pooz » Sa 23. Okt 2010, 19:55

Hi Christian,

genau das wars!

Vielen Dank für deinen Hinweis und den Trick mit \fbox.
Damit hab ich feststellen können, dass ich versehentlich in dem oberen Bild eine "Optionsleiche" in den letzten Zeilen rum liegen hatte.
Dort befand sich der Rest von all meinen vorherigen Lösungsansätzen:
\pgfresetboundingbox
Nach Entfernung klappt alles wunderbar!

Danke dafür!

Da fällt mir noch eine Frage ein:
Nach welcher Syntax kann ich deine in der Figure-Umgebung angegebene Overlay-Option allgemein gültig machen, sodass es alle Bilder gleichzeitig betrifft? Ich möchte damit erreichen, dass die Bilder an ihrer X-Achse zentriert werden. Aktuell ist es so, dass das Y-Label mit einbgezogen wird und es optisch so wirkt, als wäre es nach rechts verschoben.
Wenn das allerdings nicht zu empfehlen ist, lass ich es sein :-)


Und eine aller letzte Frage: empfiehlst du die Option: \pgfplotsset{compat=newest} ?
Wenn ich das auskommentiert lasse, dann habe ich den Vorteil, dass sogar die Y-Labels untereinander ausgerichtet sind.

Aber bei Einzelplots sieht das nach viel Platzverbrauch aus.
Kann ich das individuell schalten? Das hieße, vor "Doppelbildern" schalte ich es aus, um die Y-Labels ebenfalls ausgerichtet zu lassen, vor Einzelplots schalte ich es wieder an.

Vielen Dank und Gruß!

von Feuersaenger » Fr 22. Okt 2010, 17:06

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

von pooz » Fr 22. Okt 2010, 13:32

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) 895-mal heruntergeladen

von Feuersaenger » Fr 22. Okt 2010, 11:23

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

von pooz » Do 14. Okt 2010, 02:10

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!!

Nachfragen

von localghost » Di 12. Okt 2010, 22:11

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?

Re: Geltungsbereich

von pooz » Di 12. Okt 2010, 21:03

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 :-(

Geltungsbereich

von localghost » Mo 11. Okt 2010, 21:29

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.

Nach oben