Trazado condicional basado en datos.

Trazado condicional basado en datos.

En el MWE a continuación, ¿hay alguna manera de hacer los marcadores *dentro del círculo (es decir, \x^2 + \y^2 <= 1) en lugar de 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}

ingrese la descripción de la imagen aquí

Respuesta1

Revisión completa: Es súper simple con punto meta. Solo es necesario definir dos clases y establecer el punto meta de manera adecuada; consulte el código.

\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}

ingrese la descripción de la imagen aquí

Los siguientes son simplemente artefactos más complicados.

Haría dos parcelas y las recortaría.

\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}

ingrese la descripción de la imagen aquí

ACTUALIZAR: O utiliza la funcionalidad de diagramas de dispersión. Simplemente apago la marca dentro/fuera del círculo.

\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}

ingrese la descripción de la imagen aquí

De esta forma los símbolos no se cortan. Aún puedes recortar contra el cuadro delimitador, por ejemplo, usando el primer ejemplo.

Respuesta2

Aquí presento una solución que primero crea los datos aleatorios en una tabla que luego se utiliza para trazarlos. Separando los puntos creados enadentroyafueraEl círculo se puede hacer fácilmente filtrando.

La principal diferencia conla respuesta de la marmotaes que mi solución realmente solo imprime el número especificado de puntos, mientras que en las marmotas se crea dos veces el número especificado de puntos y luego se "filtra" para dentro y fuera del círculo. Pero debido a que se utilizan datos aleatorios, es muy poco probable que se muestre exactamente el número de puntos especificados en el gráfico resultante. Entonces la pregunta es, si necesitasexactamenteel número especificado de puntos o no...

Para más detalles, eche un vistazo a los comentarios en el código.

% 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}

imagen que muestra el resultado del código anterior

información relacionada