设置

设置

设置

我正在复制一个简单的相关散点图,其中包含一组随机节点,如下所示:

在此处输入图片描述

平均能量损失

我的 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 。-xr

  • 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}

在此处输入图片描述

相关内容