Эллипс неправильно масштабируется и вращается в среде осей pgfplot

Эллипс неправильно масштабируется и вращается в среде осей pgfplot

У меня возникли проблемы с рисованием эллипса в axisсреде pgfplots на основе главных осей, второстепенных осей и угла относительно оси x. Мне удалось нарисовать такой эллипс с помощью Tikz, однако поворот угла не учитывает должным образом соотношение сторон между осями. Под этим я подразумеваю, что если для фигуры с фиксированной шириной и высотой, с равным соотношением сторон, угол равен 45°, то увеличение диапазона оси x должно «сжать» эллипс (и увеличить угол). Итак, как мне повернуть эллипс относительно самой системы координат, а не только «экрана»? Спасибо!

МВЭ:

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{tikzpicture}
    \begin{axis} [
        name=plot_left,
        scale only axis,
        height=35mm,
        width=15mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \draw[draw=blue] (axis cs:1,1) ellipse [x radius=0.25, y radius=0.5, rotate=45];
    \end{axis}
    \begin{axis} [
        name=plot_right,
        at={(plot_left.north east)},
        anchor=north west,
        xshift=10mm,
        scale only axis,
        height=35mm,
        width=90mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \draw[draw=blue] (axis cs:1,1) ellipse [x radius=0.25, y radius=0.5, rotate=45];
    \end{axis}
\end{tikzpicture}

\end{document}

Выход:

эллипс

Желанный:

Чтобы прояснить ситуацию, вот что я ищу: что-то вроде решения Джаспера Хабихта , (axis cs:1,1) ellipse [x radius=0.25*\a, y radius=0.5*\b, rotate=45*\c]где \aи рассчитываются на основе соотношения сторон и ширины изображения.\b\c

желанный

решение1

Не уверен, что вы имеете в виду именно это, но вы можете вычислить угол поворота, разделив ширину и высоту на единицы измерения осей, а затем получить арктангенс, но я не уверен, действительно ли это приведет к правильному результату:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{tikzpicture}
    \begin{axis} [
        name=plot_left,
        scale only axis,
        height=35mm,
        width=15mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \pgfmathsetmacro{\a}{
            atan(
                (\pgfkeysvalueof{/pgfplots/width}/(\pgfkeysvalueof{/pgfplots/xmax}-\pgfkeysvalueof{/pgfplots/xmin}))/
                (\pgfkeysvalueof{/pgfplots/height}/(\pgfkeysvalueof{/pgfplots/ymax}-\pgfkeysvalueof{/pgfplots/ymin})))
        }
        \draw[draw=blue] (1,1) ellipse [x radius=0.25, y radius=0.5, rotate=\a];
    \end{axis}
    \begin{axis} [
        name=plot_right,
        at={(plot_left.north east)},
        anchor=north west,
        xshift=10mm,
        scale only axis,
        height=35mm,
        width=90mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \pgfmathsetmacro{\a}{
            atan(
                (\pgfkeysvalueof{/pgfplots/width}/(\pgfkeysvalueof{/pgfplots/xmax}-\pgfkeysvalueof{/pgfplots/xmin}))/
                (\pgfkeysvalueof{/pgfplots/height}/(\pgfkeysvalueof{/pgfplots/ymax}-\pgfkeysvalueof{/pgfplots/ymin})))
        }
        \draw[draw=blue] (1,1) ellipse [x radius=0.25, y radius=0.5, rotate=\a];
    \end{axis}
\end{tikzpicture}

\end{document}

введите описание изображения здесь


Лучший способ, вероятно, это каким-то образом вычислить параметрическую функцию эллипса и построить ее график. Это будет что-то вроде этого:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{tikzpicture}
    \begin{axis} [
        name=plot_left,
        scale only axis,
        height=35mm,
        width=15mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \addplot[domain=0:360, samples=200, blue](
            {cos(x)*sqrt(0.33/(sin(2*x)+2))+1},
            {sin(x)*sqrt(0.33/(sin(2*x)+2))+1}
        );
    \end{axis}
    \begin{axis} [
        name=plot_right,
        at={(plot_left.north east)},
        anchor=north west,
        xshift=10mm,
        scale only axis,
        height=35mm,
        width=90mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \addplot[domain=0:360, samples=200, blue](
            {cos(x)*sqrt(0.33/(sin(2*x)+2))+1},
            {sin(x)*sqrt(0.33/(sin(2*x)+2))+1}
        );
    \end{axis}
\end{tikzpicture}

\end{document}

введите описание изображения здесь

решение2

Я понял это благодаря предложению Джаспера Хабихта, а такжеэтотпост: оказывается, все не так сложно, как я думал.

Итак, с помощью приведенного ниже кода вы можете построить эллипс в pgfplotsсреде осей, указав центр x, y, а также большую, малую и угол относительно оси x.

МВЭ:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\newcommand{\addellipse}[5]{\addplot [domain=0:360, samples=50, draw=blue] ({(#3/2)*cos(x)*cos(#5) - (#4/2)*sin(x)*sin(#5) + #1}, {(#3/2)*cos(x)*sin(#5) + (#4/2)*sin(x)*cos(#5) + #2});}

\begin{document}

\begin{tikzpicture}
    \begin{axis} [
        name=plot_left,
        scale only axis,
        height=35mm,
        width=15mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \addellipse{1}{1}{1}{0.5}{45}
        );
    \end{axis}
    \begin{axis} [
        name=plot_right,
        at={(plot_left.north east)},
        anchor=north west,
        xshift=10mm,
        scale only axis,
        height=35mm,
        width=90mm,
        xmin=0,
        xmax=3,
        ymin=0,
        ymax=2,
    ]
        \addellipse{1}{1}{1}{0.5}{45}
        );
    \end{axis}
\end{tikzpicture}

\end{document}

Выход:

правильное_масштабирование

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