
Gibt es im folgenden MWE eine Möglichkeit, die Markierungen *
innerhalb des Kreises (also \x^2 + \y^2 <= 1
) statt zu platzieren 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}
Antwort1
Komplette Überarbeitung: Mit Point-Meta ist es super einfach. Man muss nur zwei Klassen definieren und Point-Meta entsprechend festlegen, siehe Code.
\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}
Im Folgenden handelt es sich lediglich um kompliziertere Artefakte.
Ich würde zwei Diagramme erstellen und sie ausschneiden.
\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}
AKTUALISIEREN: Oder Sie nutzen die Funktionalität von Scatterplots. Ich schalte dazu einfach die Markierung innerhalb/außerhalb des Kreises aus.
\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}
Auf diese Weise werden die Symbole nicht abgeschnitten. Sie können immer noch an der Begrenzungsbox ausschneiden, beispielsweise mithilfe des ersten Beispiels.
Antwort2
Hier stelle ich eine Lösung vor, die zunächst die Zufallsdaten in einer Tabelle erstellt, die dann zum Plotten verwendet wird. Durch das Trennen der erstellten Punkte ininnenUnddraußenDer Kreis kann dann einfach durch Filtern gebildet werden.
Der Hauptunterschied zuMurmeltiers Antwortist, dass meine Lösung wirklich nur die angegebene Anzahl von Punkten druckt, während in Murmeltiers Antwort zweimal die angegebene Anzahl von Punkten erstellt und dann für innerhalb und außerhalb des Kreises „gefiltert“ wird. Da jedoch zufällige Daten verwendet werden, ist es sehr unwahrscheinlich, dass im resultierenden Diagramm genau die Anzahl der angegebenen Punkte angezeigt wird. Die Frage ist also, ob Siegenaudie angegebene Punktzahl oder nicht...
Für Details schauen Sie sich bitte die Kommentare im Code an.
% 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}