Сделать ограничивающую рамку 3D-фигуры более узкой

Сделать ограничивающую рамку 3D-фигуры более узкой

Я пытаюсь построить 3 фигуры с помощью pgfplots рядом друг с другом. Для этого я создал 3 мини-страницы с размером 0.3\textwidth, так что между ними есть немного места.

На каждой мини-странице я затем рисую следующую трубку (здесь в качестве MWE включена только одна трубка):

\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}

который по идее width=\textwidth,должен занимать всю ширину, но не занимает. Также заголовок "TDSL" находится очень высоко над рисунком, как будто там много пустого пространства, что делает сам рисунок меньше.

У меня вопрос, как сделать так, чтобы фигура имела указанную ширину?

решение1

Я думаю, вы неправильно поняли @user121799 (он же @marmot). Все работает как надо. Чтобы убедить вас, я добавил цвет фона оси и показываю результат ниже на первом изображении, которое является результатом следующего кода.

Когда вы уверены, что вам не нужно пространство по всем четырем направлениям, которые все еще будут в "рамке" оси, вы можете адаптировать график bounding box. Результат показан ниже на втором изображении. Красный прямоугольник нужен только для отладки, чтобы показать адаптированную ограничивающую рамку. Подробности того, что нужно сделать, см. в комментариях в коде.

Как вы можете видеть на втором изображении, «просто» адаптация ограничивающей рамки не увеличивает до axis. \textwidthТаким образом, вам придется скорректировать widthзначениевручнуютак что действительно используется полный \textwidth. Я также сделал прокомментированное предложение для подходящего значения в коде.

% 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}

Результат на первой странице:

изображение, показывающее результат первой страницы кода выше

Результат на второй странице:

изображение, показывающее результат второй страницы кода выше

Связанный контент