基于数据的条件绘图

基于数据的条件绘图

在下面的 MWE 中,有没有办法让标记*位于圆圈内(即\x^2 + \y^2 <= 1),而不是x

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}

  \begin{axis}
    [anchor=origin, axis equal image, xmin=-1,xmax=1, xlabel={$x$},
    ylabel={$y$}, ymin=-1,ymax=1, ]

    \draw[thick] (-1,-1) -- (1,-1) -- (1,1) -- (-1,1) -- (-1,-1);
    \draw[thick] (0,0) circle (1);

    \addplot [only marks, mark=x, samples=500]
    ({rand}, {rand} );
\end{axis}
\end{tikzpicture}%
\end{document}

在此处输入图片描述

答案1

完成修订:使用 point meta 非常简单。只需定义两个类并适当设置 point meta,请参阅代码。

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}

  \begin{axis}
    [anchor=origin, axis equal image, xmin=-1,xmax=1, xlabel={$x$},
    ylabel={$y$}, ymin=-1,ymax=1, ]

    \draw[thick] (-1,-1) -- (1,-1) -- (1,1) -- (-1,1) -- (-1,-1);
    \draw[thick] (0,0) circle (1);
    \clip (-1,-1) rectangle (1,1); % to prevent the marks from overshooting
    \addplot[scatter,clip=true, clip marker paths=true,
        only marks, mark=*, samples=500,
             scatter/classes={0={mark=*,blue},
                   1={mark=x,red}},point meta=int(sqrt(x^2+y^2)),
    ]({rand},{rand});
\end{axis}
\end{tikzpicture}%
\end{document}

在此处输入图片描述

以下只是一些更复杂的文物。

我会制作两个图并剪辑它们。

\documentclass{article}
\usepackage{pgfplots}


\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}

  \begin{axis}
    [anchor=origin, axis equal image, xmin=-1,xmax=1, xlabel={$x$},
    ylabel={$y$}, ymin=-1,ymax=1, ]

    \draw[thick] (-1,-1) -- (1,-1) -- (1,1) -- (-1,1) -- (-1,-1);
    \draw[thick] (0,0) circle (1);
    \begin{scope}
    \clip (0,0) circle (1) (-1,-1) rectangle (1,1);
    \addplot+[clip=true, clip marker paths=true,only marks, mark=*, samples=500]({rand},{rand});
    \end{scope}
    \clip (0,0) circle (1);
    \addplot+[clip=true, clip marker paths=true,only marks, mark=x, samples=500]
    ({rand},{rand});
\end{axis}
\end{tikzpicture}%
\end{document}

在此处输入图片描述

更新:或者您可以使用散点图的功能。我只是关闭了圆圈内/外的标记。

\documentclass{article}
\usepackage{pgfplots}


\pgfplotsset{compat=newest}

\begin{document}
\edef\Star{*}
\edef\X{x}
\begin{tikzpicture}
\tikzset{scatter/@pre marker code/.append style={/tikz/mark
size=\perpointmarksize}}
  \begin{axis}
    [anchor=origin, axis equal image, xmin=-1,xmax=1, xlabel={$x$},
    ylabel={$y$}, ymin=-1,ymax=1, ]

    \draw[thick] (-1,-1) -- (1,-1) -- (1,1) -- (-1,1) -- (-1,-1);
    \draw[thick] (0,0) circle (1);
    \addplot[scatter,
      scatter/use mapped color={
draw=black,
        fill=blue}, only marks, mark=*, samples=500,
             visualization depends on={int(sqrt(x^2+y^2)) \as \rad},
        scatter/@pre marker code/.append style=
            {/tikz/mark size=2*\rad}]({rand},{rand});
    \addplot[scatter,
      scatter/use mapped color={
draw=red,
        fill=red}, only marks, mark=x, samples=500,
             visualization depends on={int(2-sqrt(x^2+y^2)) \as \rad},
        scatter/@pre marker code/.append style=
            {/tikz/mark size=2*\rad}]({rand},{rand});
\end{axis}
\end{tikzpicture}%
\end{document}

在此处输入图片描述

这样符号就不会被截断。您仍然可以沿边界框进行裁剪,例如使用第一个示例。

答案2

这里我提出一个解决方案,首先在表中创建随机数据,然后使用这些数据绘制图表。将创建的点分离为里面外部然后就可以通过过滤轻松地完成圆圈的绘制。

主要区别在于marmot 的回答是我的解决方案实际上只打印了指定数量的点,而在 marmots answer 中,两次创建了指定数量的点,然后“过滤”了圆内和圆外的点。但由于使用了随机数据,因此结果图中不太可能准确显示指定数量的点。所以问题是,如果你需要确切地指定点数或不...

有关详细信息,请查看代码中的注释。

% used PGFPlots v1.15
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
    \pgfplotsset{
        % use this `compat' level or higher so circles use axis coordinates
        % as "units" when a radius is given without a unit
        compat=1.11,
    }
    % create a table containing the random data
    \pgfplotstablenew[
        % create a column for the x data
        create on use/x/.style={
            create col/expr={rand}
        },
        % create a column for the y data
        create on use/y/.style={
            create col/expr={rand}
        },
        % create a column for the vector length
        create on use/veclen/.style={
            create col/expr={sqrt( (\thisrow{x})^2 + (\thisrow{y})^2 )}
        },
        % "load" the columns which shall be used
        columns={
            x,
            y,
            veclen%
        },
    % replace the "500" to the number of sample points you want to have
    ]{500}{\datatable}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        axis equal image,
        xmin=-1,
        xmax=1,
        ymin=-1,
        ymax=1,
        xlabel={$x$},
        ylabel={$y$},
        % moved common options here
        only marks,
    ]

        % state the radius of the circle here
        \pgfmathsetmacro{\CircleRadius}{1}

    \draw [thick] (0,0) circle (\CircleRadius);

    % add values inside the circle
    \addplot table [
        x=x,
        y expr={
            ifthenelse(
                \thisrow{veclen} <= \CircleRadius,
                \thisrow{y},
                NaN
            )
        }
    ] {\datatable};

    % add values outside the circle
    \addplot table [
        x=x,
        y expr={
            ifthenelse(
                \thisrow{veclen} > \CircleRadius,
                \thisrow{y},
                NaN
            )
        }
    ] {\datatable};
\end{axis}
\end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容