y 坐标上的一个大值使得其他小值几乎无法显示

y 坐标上的一个大值使得其他小值几乎无法显示

在 N3 中,y 值为 222000。如您所见,其他值与它相比都很小。因此,这个值使得其他条非常小。有没有办法让它更漂亮?

这是我的代码:

\begin{center}
\begin{figure*}[tp]
\centering
  \begin{tikzpicture}[scale=1] %[x={10.0pt},y={10.0pt}]
    \begin{axis}[
    width  = 1*\textwidth,
    height = 8cm,
    major x tick style = transparent,
    ybar=2*\pgflinewidth,
    bar width=0.4cm,
    ymajorgrids = true,
    ylabel = {Average Load},
   xlabel = {Nodes},
    symbolic x coords={N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12},
    xtick = data,
    scaled y ticks = false,
    enlarge x limits=0.088,
    ymin=0,
    legend cell align=left,
    legend style={draw=none, legend columns=-1}

]
    \addplot[style={rred,fill=rred,mark=none},postaction={pattern=north east lines}]
        coordinates {(N1, 0) (N2,0) (N3,222000) (N4,1000) (N5, 2000) (N6,10000) (N7,0) (N8,1000) (N9, 2000) (N10,3000) (N11,8000) (N12,1000)};

    \addplot[style={black,fill=black,mark=none}]
         coordinates {(N1, 20000) (N2,20000) (N3,41000) (N4, 15000) (N5, 22000) (N6,16000) (N7,20000) (N8,19000) (N9, 22000) (N10,13000) (N11,16000) (N12,21000)};
     \legend{Baseline, Load balancing protocol}
\end{axis}
\end{tikzpicture}% pic 1
\caption{\label{fig:execution:small}}
\end{figure*}
\end{center}

它产生的结果是:

在此处输入图片描述

谢谢。

答案1

绘图的重点在于您有一个固定的比例,这样查看绘图的人就可以轻松看到哪个条形图比另一个条形图大,并大致了解它们之间的差异。因此,没有真正的方法可以在同一绘图上同时显示和而不222000显得很小,因为与相比非常小。所以从通常意义上讲,您所要求的实际上是不可能的。100010001000222000

我能想到的替代方案有三种:

省略N3

由于 的值N3比其余数据高出几个数量级,这可能表明存在某种错误或无效异常值。如果确实如此,那么N3从图中省略它是个好主意。事实上,我认为保留它实际上是一种误导,因为它暗示它N3与其他数据点的质量相同。

截断轴

由于所有剩余的值都是相似的,并且N3是唯一一个与其他值相比真正巨大的值,因此可以截断-轴,使得的值N3超出图表范围(字面意思)。

这里的主要问题是,你必须让读者清楚地知道这个值确实是超出图表范围而不是恰好停在图表的边界上。还有一个问题是读者无法再直观地比较该值有多大,因为没有显示完整的条形图。

这里有一个例子,我在栏上添加了一个箭头来表明它继续,并且我也明确地写了值。

\documentclass[tikz]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      width=16cm,
      height=8cm,
      % plot options
      ybar,
      bar width=0.4cm,
      % x axis
      enlarge x limits=0.088,
      major x tick style = transparent,
      symbolic x coords={N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12},
      xlabel={Nodes},
      xtick=data,
      % y axis
      ymajorgrids = true,
      ylabel={Average Load},
      scaled y ticks=false,
      ymin=0,
      ymax=50000,
      % legend
      legend cell align=left,
      legend style={
        draw=none,
        legend columns=-1
      }
    ]

    \addplot [red, fill]
      table {
        label value
        N1 0
        N2 0
        N3 222000
        N4 1000
        N5 2000
        N6 10000
        N7 0
        N8 1000
        N9 2000
        N10 3000
        N11 8000
        N12 1000
      };
    \draw [->, thick, white, xshift=-0.2cm] (N3, 47000) -- (N3, 50000)
      node [pos=0, rotate=90, anchor=east] {\(222,000\)};

    \addplot [black, fill]
      table {
        label value
        N1 20000
        N2 20000
        N3 41000
        N4 15000
        N5 22000
        N6 16000
        N7 20000
        N8 19000
        N9 22000
        N10 13000
        N11 16000
        N12 21000
      };
    \legend{Baseline, Load balancing protocol}
  \end{axis}
\end{tikzpicture}
\end{document}

输出

使用对数刻度

最后一种选择是使用对数刻度。这在绘制跨越多个数量级的值时非常有用,但它也有很多缺点:

  • 对数图可能更难阅读,不熟悉它们的人可能会很难理解;
  • 相似的值(本例中为黑条)在对数刻度上看起来会更加相似。当所有值都跨越多个数量级时,对数刻度更好;
  • 条形图通常没有对数刻度(至少我没有见过),这是有充分理由的,因为在对数刻度上“高度增加一倍”的条形不再仅仅是“值的两倍”(这在某种程度上是条形图的全部意义所在)。

以下是使用对数刻度的结果:

\documentclass[tikz]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}

\begin{document}
\begin{tikzpicture}
  \begin{semilogyaxis}[
      width=16cm,
      height=8cm,
      % plot options
      ybar,
      bar width=0.4cm,
      % x axis
      enlarge x limits=0.088,
      major x tick style = transparent,
      symbolic x coords={N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12},
      xlabel={Nodes},
      xtick=data,
      % y axis
      ymajorgrids = true,
      ylabel={Average Load},
      scaled y ticks=false,
      ymin=100,
      % legend
      legend cell align=left,
      legend style={
        draw=none,
        legend columns=-1
      }
    ]

    \addplot [red, fill]
      table {
        label value
        N1 0.1
        N2 0.1
        N3 222000
        N4 1000
        N5 2000
        N6 10000
        N7 0.1
        N8 1000
        N9 2000
        N10 3000
        N11 8000
        N12 1000
      };

    \addplot [black, fill]
      table {
        label value
        N1 20000
        N2 20000
        N3 41000
        N4 15000
        N5 22000
        N6 16000
        N7 20000
        N8 19000
        N9 22000
        N10 13000
        N11 16000
        N12 21000
      };
    \legend{Baseline, Load balancing protocol}
  \end{semilogyaxis}
\end{tikzpicture}
\end{document}

输出

请注意,我必须修改数据并删除未定义的0值。log(0)

答案2

在我看来,轴断裂(这个问题) 是一个更好的解决方案。但是,它在 pgfplots 中不受支持,必须手动创建。

相关内容