TikZ 中的子图和图形标签需要更正

TikZ 中的子图和图形标签需要更正

我正在尝试绘制下图,其中包含 4 个子图。第一个图显示了我想要更正的图类型。更正处以问题标记。我尝试了上一篇文章中的答案,代码如下所示。

结果显示在结果部分。但子图和标签对齐的问题仍然存在。有人可以建议对我的代码进行更改,从而得到更好、更有意义的图吗?

需要更正:

在此处输入图片描述

结果:

在此处输入图片描述

代码:

\documentclass[12pt, a4paper,
                parskip=half,
                toc=bibliography,
                numbers=noendperiod
               ]{scrbook}

\usepackage[hmargin={3.0cm, 2.5cm},
            vmargin={2.5cm, 2.0cm},
            includehead,    includefoot
            ]{geometry}

\usepackage[UKenglish]{babel}
\usepackage[T1]{fontenc}

\usepackage{scrlayer-scrpage}
\usepackage{subcaption}
\usepackage{caption}
\addtokomafont{caption}{\scriptsize}
\setkomafont{captionlabel}{\bfseries\rmfamily}

\usepackage[dvipsnames,table,xcdraw]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}


\begin{document}
    \begin{figure}[ht]
            \pgfplotsset{
                     width=\linewidth, height=0.75\linewidth,
                     enlarge y limits=0.1,
                     %tick label style={font=\scriptsize},
                     %xticklabel style = {text width=0.4em},
                     %ylabel style = {text width=1em, inner sep=2pt},
                     %yticklabel style = {text width=0.2em},
                     %label style={font=\bfseries\boldmath},
                     %tick label style={font=\bfseries\boldmath},
                     %
                     %tick align = outside,
                     %tick pos = left,
                     %every axis plot post/.append style={color=Blue, dashed, mark=*}, 
                     }
                \begin{subfigure}[t]{0.48\linewidth}
                        \begin{tikzpicture}
                            \begin{loglogaxis}[
                            xmin=0.1, xmax=0.1e8,
                            ymin=1e-8, ymax=5e3,
                            xlabel={Number of Flops}, 
                            ylabel={Normalized MSE: $\log_{10} (e)$ },
                            scatter/classes={ a={mark=square*, blue}, b={mark=square*, red}, c={mark=square, black}, d={mark=triangle*, blue}, e={mark=triangle*, red},f={mark=triangle*, black},g={mark=x, black}, h={mark= diamond*, pink} },
                            ] 
                                \addplot[scatter, only marks,
                                scatter src=explicit symbolic]
                                table[meta=label] {
                                x     y      label
                                1320.9279232530525 0.9258769833615981 a
                                3102.831857215906 0.7072210955836371 a
                                };
                            \end{loglogaxis}
                        \end{tikzpicture}
                    \caption{Plot 1}
                \end{subfigure}
            \hfill
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{axis}[
                            domain=0:1,
                            ymax=1,
                            xlabel={Input $x$},
                            ylabel={$f(x)$},
                            %samples=801
                                    ]
                            \addplot {sin(5*deg(x))};
                            \addplot {sin(10*deg(x))};
                            \legend{$\sin(5x)$,$\sin(10x)$,$\sin(50x)$}
                        \end{axis}
                    \end{tikzpicture}
                    \caption{Plot 2}
                \end{subfigure}
        
            \medskip
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{loglogaxis}[
                        xmin=0.1, xmax=0.1e8,
                        ymin=1e-13, ymax=5e3,
                        xlabel={Number of Flops}, 
                        ylabel={Normalized MSE: $\log_{10} (e)$ },
                        %label style={font=\bfseries\boldmath},
                        %tick label style={font=\bfseries\boldmath},
                        scatter/classes={ a={mark=square*, blue}, b={mark=square*, red}, c={mark=square, black}, d={mark=triangle*, blue}, e={mark=triangle*, red},f={mark=triangle*, black},g={mark=x, black}, h={mark= diamond*, pink} },
                        ] 
                            \addplot[scatter, only marks,
                            scatter src=explicit symbolic]
                                table[meta=label] {
                                x     y      label
                                55.57063517556737 0.28272347338878956 a
                                285.8811806506138 0.003443221651312178 a
                                
                                };                        
                        \end{loglogaxis}
                    \end{tikzpicture}
                    \caption{Plot 3}
                \end{subfigure}
            \hfill
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{axis}[
                            xlabel={Input $x$}, 
                            ylabel={$f(x)$},
                            ymin= 0, ymax=1e2,
                                    ]
                            \addplot  {e^x)};
                            \addplot  {e^(2*x))};
                            \legend{$\exp(x)$,$\exp(2x)$}
                        \end{axis}
                    \end{tikzpicture}
                    \caption{Plot 4}
                \end{subfigure}
        \caption{caption for all plots}
        \label{all_plots}
    \end{figure}
\end{document}

新更新:

更新后的数据

在此处输入图片描述

更新的代码:

\documentclass[12pt, a4paper,
                parskip=half,
                toc=bibliography,
                numbers=noendperiod
               ]{scrbook}

\usepackage[hmargin={3.0cm, 2.5cm},
            vmargin={2.5cm, 2.0cm},
            includehead,    includefoot
            ]{geometry}

\usepackage[UKenglish]{babel}
\usepackage[T1]{fontenc}

\usepackage{scrlayer-scrpage}
\usepackage{subcaption}
\usepackage{caption}

\setkomafont{captionlabel}{\bfseries\rmfamily}

\usepackage[dvipsnames,table,xcdraw]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usepackage[font=normalsize]{subcaption}

\begin{document}
    \begin{figure}[ht]
            \pgfplotsset{
                     width=\linewidth, height=0.9\linewidth,
                     enlarge y limits=0.1,
                     %tick label style={font=\scriptsize},
                     xticklabel style = {text width=0.8em},
                     %ylabel style = {text width=1em, inner sep=2pt},
                     yticklabel style = {text width=2.0em, anchor= east},
                     label style={font=\bfseries\boldmath},
                     %tick label style={font=\bfseries\boldmath},
                     %
                     %tick align = outside,
                     tick pos = left,
                     %every axis plot post/.append style={color=Blue, dashed, mark=*}, 
                     }
                \begin{subfigure}[t]{0.48\linewidth}
                        \begin{tikzpicture}
                            \begin{loglogaxis}[
                            xmin=10, xmax=0.1e8,
                            ymin=1e-8, ymax=1e2,
                            xlabel={Number of Flops}, 
                            ylabel={Normalized MSE: $\log_{10} (e)$ },
                            scatter/classes={ a={mark=square*, blue}, b={mark=square*, red}, c={mark=square, black}, d={mark=triangle*, blue}, e={mark=triangle*, red},f={mark=triangle*, black},g={mark=x, black}, h={mark= diamond*, pink} },
                            ] 
                                \addplot[scatter, only marks,
                                scatter src=explicit symbolic]
                                table[meta=label] {
                                    x     y      label
                                    1320.9279232530525 0.9258769833615981 a
                                    
                                    };
                            \end{loglogaxis}
                        \end{tikzpicture}
                    \caption{Plot 1}
                \end{subfigure}
            \hfill
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{axis}[
                            domain=0:1,
                            ymax=1,
                            xlabel={Input $x$},
                            ylabel={$f(x)$},
                            %samples=801
                                    ]
                            \addplot[orange, mark=*] {sin(5*deg(x))};
                            \addplot[black, mark=*] {sin(10*deg(x))};
                            \legend{$\sin(5x)$,$\sin(10x)$,$\sin(50x)$}
                        \end{axis}
                    \end{tikzpicture}
                    \caption{Plot 2}
                \end{subfigure}
        
            \medskip
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{loglogaxis}[
                        xmin=10, xmax=0.1e8,
                        ymin=1e-13, ymax=1e1,
                        xlabel={Number of Flops}, 
                        ylabel={Normalized MSE: $\log_{10} (e)$ },
                        %label style={font=\bfseries\boldmath},
                        %tick label style={font=\bfseries\boldmath},
                        scatter/classes={ a={mark=square*, blue}, b={mark=square*, red}, c={mark=square, black}, d={mark=triangle*, blue}, e={mark=triangle*, red},f={mark=triangle*, black},g={mark=x, black}, h={mark= diamond*, pink} },
                        ] 
                            \addplot[scatter, only marks,
                            scatter src=explicit symbolic]
                                table[meta=label] {
                                    x     y      label
                                    55.57063517556737 0.28272347338878956 a
                                
                                    };                        
                        \end{loglogaxis}
                    \end{tikzpicture}
                    \caption{Plot 3}
                \end{subfigure}
            \hfill
                \begin{subfigure}[t]{0.48\linewidth}
                    \begin{tikzpicture}
                        \begin{axis}[
                            domain=0:1,
                            xlabel={Input $x$}, 
                            ylabel={$f(x)$},
                            ymin= 0, ymax=1e1,
                                    ]
                            \addplot[orange, mark=*]  {e^x)};
                            \addplot[black, mark=*]  {e^(2*x))};
                            \legend{$\exp(x)$,$\exp(2x)$}
                        \end{axis}
                    \end{tikzpicture}
                    \caption{Plot 4}
                \end{subfigure}
        \caption{caption for all plots}
        \label{all_plots}
    \end{figure}
\end{document}

答案1

这不是完整的答案,但评论太长了。其中一些要点指的是该问题的旧版本。

初步意见

  • 请注意,当我按原样编译您的代码时,出现“尺寸太大”错误。
  • 我,以及其他使用您的代码的人,都很高兴有正确缩进的代码,因为这样更容易阅读。

为什么会出现这些问题?

  • 首先,你设置widthheight。我读(例如pgfplots 具有固定宽度的图形)pgfplots 仅估计尺寸,因此可能会存在一些不准确之处。
  • 旋转的 ylabel:您指定了trig format = rad。因此,ylabel 不是旋转 90°(度),而是旋转 90(弧度),相当于大约 117°——即标签的角度。
  • 第一行垂直对齐:您的 xlabel 和 xticklabel 似乎具有不同的字体大小和系列。此外,左侧 xticklabel 有指数,而右侧没有。因此,左侧图的 xticklabel 较高,需要更多空间,因此它们将图向上移动。
  • 第二行的垂直对齐:除了上一点之外,您完全省略了 xtick(标签),因此图不会被向上推。
  • 水平对齐左列:上图中的指数有符号,数字,而较低的数字有一个符号和数字。
  • 水平对齐右列:上图中的 yticklabels有一个标志,而下面地块上的
新要点
  • 对我来说,尺寸过大错误仍然存​​在。在右下角的图中,域可能是 [-5, 5],即红色图达到值 e^(2*5)。这个值对于 TeX 来说太大了。
  • \addtokomafont{caption}{\scriptsize}设置脚本大小的标题。
非常新的要点
  • 未对齐的 yticklabels:一旦您设置yticklabel style = {text width=2.0em},yticklabels 就会变为左对齐。

如何解决这些问题

  • 旋转的 ylabel:可以轻松解决:省略trig format = rad并使用\addplot {sin(5*deg(x))};代替\addplot {sin(5*x)};
  • 第二行垂直对齐:添加 xtick(标签)。为什么要省略它们?
新要点
  • \addplot[domain=-5:2.3] {e^(2*x))};尺寸过大错误:您可以在右下方的图中使用它来避免它(请注意 e^(2*2.3) \approx 1e2)。
  • 标题字体大小:注释上述行至少会将其设置为 11 号字体大小,但还不能设置为默认字体大小 12 号字体大小。因此请使用\usepackage[font=normalsize]{subcaption}
非常新的要点
  • yticklabels 未对齐:改用yticklabel style = {text width=2.0em, align=right}。锚点与问题无关。

对于其他问题我目前还没有答案。

其他的建议

  • 请使用数学模式进行数学表达式,即,xlabel={$x$}而不是xlabel={x}
  • 不要在子图中使用不同的字体(属性)。

相关内容