Skip to content

Latest commit

 

History

History
135 lines (97 loc) · 5.46 KB

scatter_diagram.md

File metadata and controls

135 lines (97 loc) · 5.46 KB

如何绘制美妙的散点图

本章节主要介绍如何采用latex绘制散点图。这里主要采用的package是pgfplots。 故首先要引用该包如下:

\usepackage{pgfplots}

其它需要的package同第一节一样。

pgfplots 的使用是嵌入在tikz内部的,故其代码块应该包在tikz代码块内部, 如下所示:

\begin{tikzpicture}
    ...
    {pdfplots 代码块;}
    ...
\end{tikzpicture}

接下来,我们将进入正题,开始从0到1绘制一个散点图。如上图所示,该散点描述了模型训练更新次数,模型容量,以及模型的性能之间的关系。

Step 1: 首先第一步我们要定义我们的画布。这一部分主要采用的是axis命令来得到我们的画布, 如下所示:

\begin{tikzpicture}
    \begin{axis}[
        at={(0,0)},
        ymajorgrids,
        xmajorgrids,
        grid style=dashed,
        width=0.7*\textwidth,
        height=0.65*\textwidth,
        xlabel={\small{Prams. (M)}},
        ylabel={\small{BLEU}},
        ylabel style={yshift=0em, xshift=0em},
        xlabel style={xshift=1em,yshift=0.0em},
        yticklabel style={/pgf/number format/precision=1,
        /pgf/number format/fixed zerofill},
        ymin=28.7,ymax=30.4, ytick={29,29.5,30},
        xmin=90,xmax=330,xtick={100, 150, 200, 250, 300},
        ]

        ...
        
    \end{axis}
\end{tikzpicture}

其中

\begin{axis}[...]    \end{axis}

是axis命令的基本使用格式,与figure,tikz等命令类似; at={(0,0)} 表示的是画布位于(0,0)处; width = 0.7*\textwidth, height=0.5*\textwidth 表示该画布的宽和高分别为0.7*\textwidth 和 0.5*\textwidth;xlabel 与 ylabel 则为 x轴与y轴的标签;坐标轴取值范围以及坐标的设置则由如下代码定义:

ymin=28.7,ymax=30.4, ytick={29,29.5,30}, xmin=90,xmax=330,xtick={100, 150, 200, 250, 300}

该命令将x轴的取值范围设置为[90, 330]; y轴的取值范围设置为[28.7, 30.4]; y轴的刻度线为{29,29.5,30}; x轴的刻度线为{100, 150, 200, 250, 300}。 此外axis还提供了对坐标轴数值精度的设置,如下所示:

yticklabel style={/pgf/number format/precision=1, /pgf/number format/fixed zerofill}

该命令将精度设置为小数点后一位。

Step 2:将坐标点置于画布之上。 这一部分我们主要采用的是addplot命令, 具体如下:

\begin{axis}[...]   
    \addplot[purple!30,mark=*,mark size=3pt,thick,mark options={fill=purple!30,draw=purple!30,line width=1.0pt}] coordinates { (118,29.05)};
        
        \addplot[kleinblue!50,mark=*,mark size=6pt,thick,mark options={fill=kleinblue!70,draw=kleinblue!70,line width=1.0pt}] coordinates { (194,29.44)};
            
        \addplot[gray!30,mark=*,mark size=4.5pt,thick,mark options={fill=gray!30,line width=1.0pt}] coordinates { (137,29.30)};
            
        \addplot[bangdiblue!70,mark=*,mark size=6pt,thick,mark options={fill=bangdiblue!70,line width=1.0pt}] coordinates { (194,29.60)};
            
        \addplot[orange!30,mark=*,mark size=8pt,thick,mark options={fill=orange!30, draw=orange!30,line width=1.0pt}] coordinates { (270,29.92)};
            
        \addplot[tiffanyblue!70,mark=*,mark size=8pt,thick,mark options={fill=tiffanyblue!70, draw=tiffanyblue!70,line width=1.0pt}] coordinates { (262,30.10)};
            
        \addplot[yellow!50,mark=*,mark size=10pt,thick,mark options={fill=yellow!50, draw=yellow!50,line width=1.0pt}] coordinates { (272,30.19)};
\end{axis}

\addplot命令的核心部分是 coordinates {},正常情况下,我们只需要将对应的点坐标按照(x y) 的格式进行填写即可。 其中 \addplot[params] 的 params主要用于调整点的尺寸、点填充颜色以及点的形状。

Step 3: 绘制annotations以及表格的嵌入。这一部分主要采用的核心代码是基于node命令的。具体来说,我们只需要将node命令中{}中填充annotations名称或者表格即可。这里不再赘述,只提供相应的代码,如下:

		\node[font=\tiny] at (3.3em, 2.5em){Purple};
        \node[font=\tiny] at (4em, 5.5em){Gray};
        \node[font=\tiny] at (10.9em, 9em){Bangdiblue};
        \node[font=\tiny] at (10.2em, 7.2em){Kleinblue};
        \node[font=\tiny] at (11.2em, 14.5em){Tiffanyblue};
        \node[font=\tiny] at (16.9em, 16em){Yellow};
        \node[font=\tiny] at (16.35em,11.9em){Orange};
        \node[] at (12.85em,3.em){
        \setlength{\tabcolsep}{2.7pt}
        \tiny
        \begin{tabular}{lrrr}
        \toprule
        Model & $\mathrm{\theta}$(M) & Updates (K) & BLEU\\
        \midrule
        Purple & 118 &50& 29.05\\
        kleinblue & 194 &50& 29.44\\
        Orange & 270& 800&29.92 \\
        Gray & 137& 50&29.30 \\
        Bangdiblue & 194& 50&29.60 \\
        Tiffanyblue & 262& 250&30.10\\
        Yellow & 272& 300&30.19\\
        \bottomrule
        \end{tabular}
        };

总结

Latex 绘图的核心还是node的使用,只要熟练掌握node的使用,任何复杂的图都可以轻松解决。当然,为了更加高效、简洁的绘制图形,我们经常会用到偏移方法来进行绘制,以便更好的建模不同图形之间的关系,为后续图形的改动提供便利条件。