Begrenzungsrahmen der 3D-Figur enger machen

Begrenzungsrahmen der 3D-Figur enger machen

Ich versuche, mit pgfplots 3 Abbildungen nebeneinander darzustellen. Dazu habe ich 3 Miniseiten mit einer Breite von erstellt 0.3\textwidth, sodass zwischen ihnen etwas Platz ist.

In jeder Minipage zeichne ich dann folgende Röhre ein (hier als MWE ist nur eine einzige Röhre enthalten)

\documentclass{article}
\usepackage{pgfplots}
\usepackage[showframe]{geometry}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[%
        name=plot2,
        axis lines=middle, ticks=none,
        width=\textwidth,
        zmin=0, zmax=6,
        xmin=-3, xmax=3,
        ymin=-3, ymax=3,
        xlabel={$X_1$}, ylabel={$X_2$}, zlabel={$t$},
        title={TDSL}
        ]

        \addplot3[%
            opacity = 0.02,
            fill opacity=0.5,
        mesh/interior colormap name=hot,
        surf,
        colormap/hot,
        faceted color=black,
        z buffer = sort,
        samples = 20,
        variable = \u,
        variable y = \v,
        domain = 0:360,
        y domain = 0:5,
        ]
        ({cos(u)}, {sin(u)}, {v});
    \end{axis}
\end{tikzpicture}
\end{document}

das laut der Beschreibung width=\textwidth,die gesamte Breite einnehmen sollte, aber das tut es nicht. Außerdem steht der Titel „TDSL“ sehr weit oben über der Abbildung, als ob es viel Leerraum gäbe, wodurch die eigentliche Abbildung kleiner wird.

Meine Frage ist nun, wie ich der Figur die angegebene Breite verleihen kann.

Antwort1

Ich glaube, Sie verstehen @user121799 (alias @marmot) falsch. Alles funktioniert wie es soll. Um Sie zu überzeugen, habe ich eine Achsenhintergrundfarbe hinzugefügt und zeige das Ergebnis unten im ersten Bild, das das Ergebnis des folgenden Codes ist.

Wenn Sie sicher sind, dass Sie den Platz in allen vier Richtungen nicht benötigen, da dieser immer noch in der Achsenbox liegen würde, können Sie die bounding boxDarstellung anpassen. Ein Ergebnis wird unten im zweiten Bild angezeigt. Das rote Rechteck dient nur zu Debugzwecken, um die angepasste Begrenzungsbox anzuzeigen. Einzelheiten dazu finden Sie in den Kommentaren im Code.

Wie man im zweiten Bild sehen kann, vergrößert das "einfache" Anpassen des Begrenzungsrahmens den nicht axisauf den \textwidth. Man muss also den widthWert anpassenmanuelldamit wirklich das volle \textwidthausgenutzt wird. Einen kommentierten Vorschlag für einen geeigneten Wert habe ich ebenfalls im Code hinterlegt.

% used PGFPlots v1.16
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pgfplots}
    \pgfplotsset{
        % use this `compat` level or higher to position axis labels right
        compat=1.8,
        % for simplicity created a style of the original `axis` options
        my axis style/.style={
            width=\textwidth,
            axis lines=middle,
            ticks=none,
            zmin=0, zmax=6,
            xmin=-3, xmax=3,
            ymin=-3, ymax=3,
            xlabel={$X_1$}, ylabel={$X_2$}, zlabel={$t$},
            title={TDSL},
            % -----------------------------------------------------------------
            % (added an axis background color for debugging purposes)
            axis background/.style={
                fill=blue!25,
                opacity=0.5,
            },
            % -----------------------------------------------------------------
        },
        % for simplicity created a style for the `\addplot` command
        my plot style/.style={
            opacity=0.02,
            fill opacity=0.5,
            mesh/interior colormap name=hot,
            surf,
            faceted color=black,
            z buffer=sort,
            samples=20,
            variable=\u,
            variable y=\v,
            domain=0:360,
            y domain=0:5,
        },
        % a style to (almost) achieve what you want
        my advanced axis style/.style={
            my axis style,
%            % because the `width` doesn't know about "correcting" the bounding box
%            % you have to manually adjust the value to fit your needs (again)
%            width=1.5\textwidth,
            title style={
                % move title above z-axis (arrow)
                at={(axis top)},
                % give the title node a name
                % (which is later used to determine the bounding box of the plot)
                name=axis title,
            },
            % define some helper coordinates to determine the needed/wanted bounding box
            execute at end axis={
                \coordinate (axis left)   at (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0,0);
                \coordinate (axis right)  at (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0,0);
                \coordinate (axis top)    at (axis cs:0,0,\pgfkeysvalueof{/pgfplots/zmax});
                %
                \coordinate (axis bottom) at (axis cs:0,\pgfkeysvalueof{/pgfplots/ymin},0);
                \coordinate (axis lower left)  at (axis bottom -| axis left);
%                % for the top coordinate we need to account for the title
%                % unfortunately at this time the `(axis title)` coordinate is unavailable
%                \coordinate (axis upper right) at (axis title.north -| axis right);
            },
        },
    }
\begin{document}
\begin{tikzpicture}
    \begin{axis}[my axis style]
        \addplot3 [my plot style] ({cos(u)}, {sin(u)}, {v});
    \end{axis}
\end{tikzpicture}

\begin{tikzpicture}
    % don't calculate a bounding box yet
    \begin{pgfinterruptboundingbox}
        % use the modified/advanced axis style here
        \begin{axis}[my advanced axis style]
            \addplot3 [my plot style] ({cos(u)}, {sin(u)}, {v});
        \end{axis}
    \end{pgfinterruptboundingbox}

    % -------------------------------------------------------------------------
    % for debugging only
    \draw [red] (axis lower left) rectangle (axis title.north -| axis right);
    % -------------------------------------------------------------------------
    % now we can set the bounding box using the helper coordinates
    \useasboundingbox (axis lower left) rectangle (axis title.north -| axis right);
\end{tikzpicture}
\end{document}

Ergebnis der ersten Seite:

Bild, das das Ergebnis der ersten Seite des obigen Codes zeigt

Ergebnis der zweiten Seite:

Bild, das das Ergebnis der zweiten Seite des obigen Codes zeigt

verwandte Informationen