设置
我正在复制一个简单的相关散点图,其中包含一组随机节点,如下所示:
平均能量损失
我的 MWE 如下,其中的图表是按照我认为在书中的比例设置的:
\documentclass[11pt, oneside]{book}
%pakages for figures
\usepackage[labelfont=bf]{caption}
\usepackage{float}
\usepackage{graphicx}
%pakage for graph
\usepackage{tikz}
\usepackage{amsmath}
\usepackage{amssymb}
%--------------------------------BEGIN--------------------
\begin{document}
\begin{figure}[H]
\centering
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\end{tikzpicture}
\caption{a) Possetive Correlation}\label{CORA}
\end{minipage}\hfill
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\end{tikzpicture}
\caption{b) Uncorrelated/No Correlation}\label{CORB}
\end{minipage}\hfill
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\end{tikzpicture}
\caption{c) Negative Correlation}\label{CORC}
\end{minipage}\hfill
\end{figure}
\end{document}
目标
我问的是实际如何绘制点。如果这是一个简单函数,我知道如何做到这一点,但是对于一组随机节点,您将如何做到这一点。
答案1
您可以在图片中沿 x 轴绘制一系列点,其中 y 坐标为随机。对于不同的图形,您可以使用 x 值并添加随机分量(正相关),使用 x 值的倒数并添加随机分量(负相关)或保持完全随机(无相关)。
在下面的 MWE 中,首先计算坐标,然后进行校正,以防随机坐标超出图表范围(例如,将随机 x 坐标 -1.8 校正为 -1.7)。随机引擎被植入种子,以便\pgfmathsetseed
在每次编译时获得不同的结果。
您可以改变循环中的数字foreach
来获得不同数量的点,并且可以改变随机数的划分来增加/减少随机性(即相关性)。
代码:
\documentclass[11pt, oneside]{book}
%pakages for figures
\usepackage[labelfont=bf]{caption}
\usepackage{float}
\usepackage{graphicx}
%pakage for graph
\usepackage{tikz}
\usetikzlibrary{calc}
\pgfmathsetseed{\number\pdfrandomseed}
\usepackage{amsmath}
\usepackage{amssymb}
%--------------------------------BEGIN--------------------
\begin{document}
\begin{figure}[H]
\centering
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\foreach \x in {-1.7,-1.5,...,1.7}{
\pgfmathsetmacro\xcoord{\x+rand/10}
\pgfmathsetmacro\ycoord{\x+rand/2}
\pgfmathsetmacro\xcoord{\xcoord < -1.7 ? -1.7 : \xcoord}
\pgfmathsetmacro\xcoord{\xcoord > 1.7 ? 1.7 : \xcoord}
\pgfmathsetmacro\ycoord{\ycoord < -1.7 ? -1.7 : \ycoord}
\pgfmathsetmacro\ycoord{\ycoord > 1.7 ? 1.7 : \ycoord}
\node[circle,draw,fill=black,scale=0.3] at (\xcoord,\ycoord) {};
}
\end{tikzpicture}
\caption{a) Positive Correlation}\label{CORA}
\end{minipage}\hfill
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\foreach \x in {-1.7,-1.5,...,1.7}{
\pgfmathsetmacro\xcoord{\x+rand/10}
\pgfmathsetmacro\ycoord{rand*2}
\pgfmathsetmacro\xcoord{\xcoord < -1.7 ? -1.7 : \xcoord}
\pgfmathsetmacro\xcoord{\xcoord > 1.7 ? 1.7 : \xcoord}
\pgfmathsetmacro\ycoord{\ycoord < -1.7 ? -1.7 : \ycoord}
\pgfmathsetmacro\ycoord{\ycoord > 1.7 ? 1.7 : \ycoord}
\node[circle,draw,fill=black,scale=0.3] at (\xcoord,\ycoord) {};
}
\end{tikzpicture}
\caption{b) Uncorrelated/No Correlation}\label{CORB}
\end{minipage}\hfill
\begin{minipage}{0.32\textwidth}
\centering
\begin{tikzpicture}
\draw[->,ultra thick] (-1.7,0)--(1.7,0) node[right]{$x$};
\draw[->,ultra thick] (0,-1.7)--(0,1.7) node[above]{$y$};
\foreach \x in {-1.7,-1.5,...,1.7}{
\pgfmathsetmacro\xcoord{\x+rand/10}
\pgfmathsetmacro\ycoord{-\x+rand/2}
\pgfmathsetmacro\xcoord{\xcoord < -1.7 ? -1.7 : \xcoord}
\pgfmathsetmacro\xcoord{\xcoord > 1.7 ? 1.7 : \xcoord}
\pgfmathsetmacro\ycoord{\ycoord < -1.7 ? -1.7 : \ycoord}
\pgfmathsetmacro\ycoord{\ycoord > 1.7 ? 1.7 : \ycoord}
\node[circle,draw,fill=black,scale=0.3] at (\xcoord,\ycoord) {};
}
\end{tikzpicture}
\caption{c) Negative Correlation}\label{CORC}
\end{minipage}\hfill
\end{figure}
\end{document}
可能的结果:
答案2
另一个例子是元帖子:
\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef signum(expr x) =
if x > 0: 1 elseif x < 0: -1 else: 0 fi
enddef;
vardef random_correlates(expr N, R, S) =
save r; numeric r;
% r = R clipped to -1 < r < 1
r = if R > 1: 1 elseif R < -1: -1 else: R fi;
save p; picture p;
p = image(
drawarrow (-S-4, 0) -- (S+4, 0); label.rt("$x$", (S+4,0));
drawarrow (0, -S-4) -- (0, S+4); label.top("$y$", (0, S+4));
for x=-S step 2S/N until S:
drawdot (x, (abs r)[-S + uniformdeviate 2S, x*signum(r)])
withpen pencircle scaled 2
withcolor 2/3 blue;
endfor
label.bot("$r=" & decimal r & "$", (0,-S-4));
);
p
enddef;
beginfig(1);
draw random_correlates(24, 0.7, 42);
draw random_correlates(24, -0.7, 42) shifted 120 right;
draw random_correlates(24, 0, 42) shifted 240 right;
endfig;
\end{mplibcode}
\end{document}
笔记:
这包含在 中
luamplib
,因此请使用lualatex
引擎编译它(或研究如何使其适应pdflatex
+良好生产规范,或者普通的 MP,或者 Context 等)参数:
N
=要绘制的点数、R
所需的相关系数、S
图表的半比例
巧妙之处在于y
计算 的坐标drawdot
。分阶段(从右到左):
该
signum
函数是标准函数的一个简单实现,对负数返回 -1,对正数返回 +1,因此根据 的值x*signum(r)
给出+x
或或 0 。-x
r
uniformdeviate 2S
给出范围内的一个随机数0 < y < 2S
,然后将-S
其添加到我们得到的-S < y < S
。然后,我使用中介符号来
abs(r)
找到介于完全随机数y
和+x
或之间的一个数字-x
。
因此r=1
将每个 y 映射到 x,r=-1
将每个 y 映射到 -x,并将r=0
每个 y 映射到 -S 和 S 之间的完全随机值(这正是我们想要的)。
答案3
PSTricks 解决方案仅用于紧急目的。
\documentclass[preview,border=12pt]{standalone}
\usepackage{pst-plot}
\pstVerb{realtime srand}
\psset{unit=2mm}
\begin{document}
\noindent
\begin{pspicture}(-6.25,-6.25)(6.5,6.5)
\psLoop{50}{{\psset{linecolor=red}\qdisk(!.5 Rand sub 8 mul dup 1 mul .5 Rand sub 2 mul add){1pt}}}
\psaxes[ticks=none,labels=none]{->}(0,0)(-5,-5)(5,5)[$x$,0][$y$,90]
\end{pspicture}
\begin{pspicture}(-6.25,-6.25)(6.5,6.5)
\psLoop{50}{{\psset{linecolor=red}\qdisk(!.5 Rand sub 8 mul dup -1 mul .5 Rand sub 2 mul add){1pt}}}
\psaxes[ticks=none,labels=none]{->}(0,0)(-5,-5)(5,5)[$x$,0][$y$,90]
\end{pspicture}
\begin{pspicture}(-6.25,-6.25)(6.5,6.5)
\psLoop{50}{{\psset{linecolor=red}\qdisk(!.5 dup Rand sub 8 mul exch Rand sub 8 mul){1pt}}}
\psaxes[ticks=none,labels=none]{->}(0,0)(-5,-5)(5,5)[$x$,0][$y$,90]
\end{pspicture}
\end{document}