tikzpicture 图表出现断裂

tikzpicture 图表出现断裂

我使用 tikzpicture 绘制了一张图表,尽管我提高了分辨率,但图表本身仍然存在间隙。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[domain=-{sqrt(2)}:{sqrt(2)}]
    \draw[very thin,color=gray] (-1.2,-1.2) grid (1.2,1.2);
    \draw[<->] (-1.7,0) -- (1.7,0) node[right] {$x$};
    \draw[<->] (0,-1.3) -- (0,1.3) node[above] {$y$};
    \draw[color=red]  plot [samples=100](\x,{abs(\x)*sqrt(2 - \x*\x)});
    \draw[color=green]  plot [samples=100] (\x,{-abs(\x)*sqrt(2 - \x*\x)});
\end{tikzpicture}
\end{document}

得出的结果为:

示例图打印输出

您可以看到,在右侧 x 轴的任意一侧,图表的绿色部分与红色部分不相交。我允许程序包计算域边界。如果这是问题所在,那么首先由于域的性质,我无法超越它们。

奇怪的是,当我将分辨率从 100 增加到 1000 时,差距变得更大。

答案1

如果使用曲线的参数表示(即[sqrt(2)*sin(x), sin(2*x)]),则可以将其精确地绘制到极值。

在这里我使用了 PGFPlots,并在参数表示下方以灰色绘制了原始方程:

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    domain=-pi/2:pi/2, % The range over which to evaluate the functions
    xtick={-1,...,1}, ytick={-1,...,1}, % Tick marks only on integers between -1 and 1
    axis lines=middle, % Axis lines go through (0,0)
    enlargelimits=true, % Make the axis lines a bit longer than required for the plots
    samples=101, % Number of samples for evaluating the functions (use an odd number to capture the (0,0) point
    xlabel=$x$, ylabel=$y$, % Axis labels
    clip=false % So the labels aren't cut off
]
\addplot [thick, red]
    ( {sqrt(2) * sin(deg(x))},
      {abs(sin(deg(x*2)))} )
    node [pos=0.8, anchor=south] {$f(x) = |x|\sqrt{2-x^2}$}; % Add a text node at 80% of the plot length
\addplot [thick, blue]
    ( {sqrt(2) * sin(deg(x))},
      {-abs(sin(deg(x*2)))} )
    node [pos=0.8, anchor=north] {$f(x) = -|x|\sqrt{2-x^2}$};

\end{axis}
\end{tikzpicture}
\end{document}

关于根本问题:使用 PGFPlots 无法解决问题(但我仍然建议使用 PGFPlots 来绘制此类图)。此外,虽然对此类函数使用参数方程通常会产生更好的结果,因为沿图的采样更均匀,但这也不是根本原因。问题是由于在决定从何处采样域时出现数值错误而发生的,这导致最后一个采样点(sqrt(2)跳过最后一个采样点()。从本质上讲,这是在为什么 TikZ 的 \foreach 不迭代列表的最后一个元素?。在这种情况下,一个好的解决方案是修补生成采样表达式的函数,以明确包含域的上边缘。通过在序言中(在之后\usepackage{tikz})添加以下内容,您的原始代码将无间隙地运行:

\makeatletter
\def\tikz@plot@samples@recalc#1:#2\relax{%
  \pgfmathsetmacro\tikz@temp@start{#1}%
  \pgfmathsetmacro\tikz@temp@end{#2}%
  \pgfmathsetmacro\tikz@temp@step{(\tikz@temp@end-\tikz@temp@start)/(\tikz@plot@samples-1)}%
  \pgfmathsetmacro\tikz@temp@second{\tikz@temp@start+\tikz@temp@step}%
  \pgfmathsetmacro\tikz@temp@penultimate{\tikz@temp@end-\tikz@temp@step}
  \ifdim\tikz@temp@penultimate pt<\tikz@temp@second pt
    \edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@second,...,\tikz@temp@end}%  
  \else%
    \edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@second,...,\tikz@temp@penultimate,\tikz@temp@end}%
  \fi%
}
\makeatother

相关内容