
В приведенном ниже MWE есть ли способ сделать маркеры *
внутри круга (т.е. \x^2 + \y^2 <= 1
) вместо 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}
решение1
Полная ревизия: Я очень прост с точкой мета. Нужно только определить два класса и задать точку мета соответствующим образом, см. код.
\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}
Ниже приведены более сложные артефакты.
Я бы сделал два графика и вырезал их.
\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}
ОБНОВЛЯТЬ: Или вы используете функционал диаграмм рассеяния. Я просто отключаю отметку внутри/снаружи круга.
\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}
Таким образом, символы не обрезаются. Вы по-прежнему можете обрезать по ограничивающему прямоугольнику, например, используя первый пример.
решение2
Здесь я представляю решение, которое сначала создает случайные данные в таблице, которая затем используется для их построения. Разделение созданных точек ввнутрииснаружикруг затем можно легко сделать с помощью фильтрации.
Главное отличие отответ сурказаключается в том, что мое решение на самом деле выводит только указанное количество точек, в то время как в ответе marmots дважды создается указанное количество точек, а затем "фильтруется" для внутренней и внешней части круга. Но поскольку используются случайные данные, маловероятно, что в результирующем графике будет показано именно указанное количество точек. Поэтому вопрос в том, если вам нужноточноуказанное количество баллов или нет...
Подробную информацию смотрите в комментариях к коду.
% 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}