在 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
显得很小,因为与相比非常小。所以从通常意义上讲,您所要求的实际上是不可能的。1000
1000
1000
222000
我能想到的替代方案有三种:
省略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 中不受支持,必须手动创建。