Bedingtes Plotten basierend auf Daten

Bedingtes Plotten basierend auf Daten

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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}

Bild, das das Ergebnis des obigen Codes zeigt

verwandte Informationen