我在 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
有一种方法可以根据坐标确定半径。方法如下。
- 为兴趣点指定名称。请参阅
\path (axis cs:x,y) coordinate (name);
- 将它们分配给命令
\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}