Pgfplots 圆圈

Pgfplots 圆圈

我在 pgfplots 中绘制圆圈时遇到了一些麻烦。这是我的代码,然后我会解释:

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{color}
\usepackage{tikz}
\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[shift={(0,0)}]
\begin{axis}[ 
    ticks=none,
    axis lines = middle,
    axis line style={->},
    ymin=0,
    xmin=-3,
    xmax=3,
    xlabel={$Y$},
    ylabel={$\pi$}]
\addplot[black, domain=-2:2] {3*x+2};
\addplot[black, domain=-2:2] {2*x+2};
\addplot[red,mark=*] coordinates {(0,3)};
\addplot[red,mark=*] coordinates {(1,3)};
\draw(axis cs:0,3) circle[blue, radius=1];
\end{axis}
\end{tikzpicture}
\end{figure}

\end{document}

想象无限多个围绕 (0,3) 的同心圆。实际数字和线方程并不重要;我只想展示以下关系:随着线变得陡峭,它在较高的 \pi 和较低的 x 处与半径较小的圆相切。

我知道 LaTeX 可能有办法通过交点或其他方法帮我处理切线问题,但我不介意自己做数学题。我的主要问题是如何根据坐标编码圆的半径?例如,在我的代码中,圆的半径为 1,因此它应该与最右边的红点相交。但实际上并没有,它太小了,你看不到它。

如果您不明白我的请求,请告诉我。

答案1

自 PGFPlots 1.5.1 版起,圆和椭圆半径以轴单位解释(这正是您想要的)。但是,为了保持向后兼容性,默认情况下不启用此功能:您必须设置\pgfplotsset{compat=1.5.1}(或更高)。

如果你这样做,你会发现你得到的是椭圆而不是圆形。这是因为你的轴没有等比例缩放。设置axis equal(或axis equal image) 将得到一个正确的圆形:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}

\begin{document}

\begin{figure}
\begin{tikzpicture}
\begin{axis}[ 
    ticks=none,
    axis lines = middle,
    axis line style={->},
    ymin=0,
    xmin=-3, xmax=3,
    xlabel={$Y$},
    ylabel={$\pi$},
    axis equal image
]
\addplot[black, domain=-2:2] {3*x+2};
\addplot[black, domain=-2:2] {2*x+2};
\addplot[red, mark=*, only marks] coordinates {(0,3) (1,3)};
\draw (axis cs:0,3) circle [blue, radius=1];
\end{axis}
\end{tikzpicture}
\end{figure}

\end{document}

绘制切线和切点的方法如下:

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}

\begin{document}


\begin{tikzpicture}
\pgfmathsetmacro\r{1}
\pgfmathsetmacro\d{3}
\pgfmathsetmacro\angle{acos(\r/\d)}

\begin{axis}[ 
    ticks=none,
    axis lines = middle,
    axis line style={->},
    ymin=0, ymax=6,
    xmin=-3, xmax=3,
    xlabel={$Y$},
    ylabel={$\pi$},
    axis equal image,clip mode=individual
]
\draw (axis cs:0,\d) circle [radius=\r];
\node [
    fill,
    red,
    circle,
    inner sep=1.5pt
] (tangent)  at (axis cs:{\r*sin(\angle)},{\d-\r*cos(\angle)}) {};
\draw [shorten >=-1cm] (axis cs:0,0) -- (tangent);
\end{axis}
\end{tikzpicture}

\end{document}

答案2

有一种方法可以根据坐标确定半径。方法如下。

  1. 为兴趣点指定名称。请参阅\path (axis cs:x,y) coordinate (name);
  2. 将它们分配给命令\p1\p2并用它veclen来确定半径的长度。 calc需要来自 tikzlibrary

在此处输入图片描述

代码

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{color}
\usepackage{tikz}
\usetikzlibrary{calc}
\pgfplotsset{compat=1.8}
\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[shift={(0,0)}]
\begin{axis}[ 
    ticks=none,
    axis lines = middle,
    axis line style={->},
    %axis equal=true,  % The plot was obtained with this marked out, since your code does not have this.
    ymin=0,
    xmin=-3,
    xmax=3,
    xlabel={$Y$},
    ylabel={$\pi$}]
\path (axis cs:0,3) coordinate (A);       %%%%
\path (axis cs:1,3) coordinate (B);       %%%%
\addplot[black, domain=-2:2] {3*x+2};
\addplot[black, domain=-2:2] {2*x+2};
\addplot[red,mark=*] coordinates {(0,3)};  
\addplot[red,mark=*] coordinates {(1,3)};  
\draw[blue] let \p1=(A),\p2=(B), \n1={veclen(\x2-\x1,\y2-\y1)} in (A) circle[radius=\n1];                           %%%%
\end{axis}
\end{tikzpicture}
\end{figure}

\end{document}

相关内容