
Estou tendo problemas para desenhar uma elipse em um axis
ambiente pgfplots com base nos eixos principais, eixos menores e ângulo em relação ao eixo x. Consegui desenhar essa elipse usando o Tikz, porém, a rotação do ângulo não respeita adequadamente a proporção entre os eixos. O que quero dizer com isso é que se, para uma figura com largura e altura fixas, com proporção de aspecto igual, o ângulo for 45°, então aumentar o alcance do eixo x deve "comprimir" a elipse (e aumentar o ângulo) . Então, como faço para girar a elipse no próprio sistema de coordenadas, não apenas na "tela"? Obrigado!
MWE:
\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}
Saída:
Desejado:
Para esclarecer, é isso que estou procurando: algo parecido com a solução de Jasper Habicht (axis cs:1,1) ellipse [x radius=0.25*\a, y radius=0.5*\b, rotate=45*\c]
, onde \a
e são calculados com base na proporção e na largura da imagem \b
.\c
Responder1
Não tenho certeza se é isso que você quer dizer, mas você pode calcular o ângulo de rotação dividindo a largura e a altura pelas unidades do eixo e, em seguida, obter o arctan, mas não tenho certeza se isso realmente resultará na saída correta:
\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}
A melhor maneira é provavelmente calcular de alguma forma a função paramétrica da elipse e plotá-la. Isso seria algo assim:
\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}
Responder2
Eu descobri graças à sugestão de Jasper Habicht, bem comoessepost: acontece que não é tão complicado quanto eu pensava.
Portanto, com o código abaixo, você pode traçar uma elipse em um pgfplots
ambiente de eixo tendo especificado o centro x, y e o maior, menor e o ângulo em relação ao eixo x.
MWE:
\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}
Saída: