
No MWE abaixo, existe uma maneira de fazer os marcadores *
dentro do círculo (ou seja, \x^2 + \y^2 <= 1
) em vez 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}
Responder1
Revisão completa: I é super simples com meta de ponto. Basta definir duas classes e definir o meta do ponto apropriadamente, consulte o 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}
A seguir estão apenas artefatos mais complicados.
Eu faria dois gráficos e os recortava.
\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}
ATUALIZAR: ou você usa a funcionalidade de gráficos de dispersão. Acabei de desligar a marca dentro/fora do 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}
Desta forma os símbolos não ficam cortados. Você ainda pode recortar a caixa delimitadora, por exemplo, usando o primeiro exemplo.
Responder2
Aqui apresento uma solução que primeiro cria os dados aleatórios em uma tabela que depois é usada para plotá-los. Separando os pontos criados emdentroeforao círculo pode então ser feito facilmente por filtragem.
A principal diferença pararesposta da marmotaé que minha solução realmente imprime apenas o número especificado de pontos, enquanto nas marmotas respondem duas vezes o número especificado de pontos são criados e depois "filtrados" para dentro e fora do círculo. Mas como são usados dados aleatórios, é muito improvável que o número exato de pontos especificados seja mostrado no gráfico resultante. Então a questão é: se você precisarexatamenteo número especificado de pontos ou não ...
Para obter detalhes, dê uma olhada nos comentários no 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}