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