如何将 pgfplots 条形图中每个条形的值放在条形内?

如何将 pgfplots 条形图中每个条形的值放在条形内?

我有这个:

\begin{tikzpicture}
\begin{axis}[
ybar = 0.6,
width=1.2\textwidth,
height=0.4\textheight,
enlarge x limits = 0.2,
bar width=16pt,
title={Instance els19 with 1\% max error},
legend style={at={(0.5,-0.15)},
anchor=north,legend columns=0},
ylabel={Time in milisseconds},
symbolic x coords={s-HAS, s-cAS, CUDA-HAS},
xtick=data,
nodes near coords,
%nodes near coords align={horizontal},
]
\addplot coordinates {(s-HAS,44.60) (s-cAS,71.90) (CUDA-HAS,8.67)};
\addplot coordinates {(s-HAS,4) (s-cAS,4) (CUDA-HAS,6)};
\addplot coordinates {(s-HAS,156) (s-cAS,334) (CUDA-HAS,18)};


\legend{Average 1\%,Best 1\%,Worst 1\%}
\end{axis}
\end{tikzpicture}

并生成如下内容:

在此处输入图片描述

有什么方法可以将当前位于每个条形上方的条形值放入条形内吗?条形可以更宽。此外,数字可以旋转 90 度。

我需要这个,因为在其他一些图形上,数字确实很大,并且它们彼此重叠,如下所示:

在此处输入图片描述

此外,任何关于如何使这些图表看起来更好的建议都会被接受。

答案1

数字太小(第一个示例中的红色列)无法放入条形图内,因此将它们放在上方通常更安全。如果您确实想将它们放在条形图内,可以设置every node near coord/.append style={anchor=north},这将使用标签节点(锚点)的顶部进行放置。您可以通过添加选项(将它们放在列内)或将它们放在顶部来north旋转标签。rotate=90, anchor=eastanchor=west

对于像这样的柱状图,我建议设置ymin=0以确保列从开始0,并且enlarge y limits={upper, value=<value>}仅在图的顶部添加空间。

为了使图表更具吸引力,您可以做很多事情。首先,我会将列从最小到最大排序。基于如何最小化 pgfplots 的墨水与数据比率,这是您的图表的更简化版本。我还增加了图例条目之间的空间,如如何调整 PGFPlots 中图例条目之间的水平间距?

在此处输入图片描述

\documentclass{standalone}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
compat=newest, %Better label placement
ybar = 0.6,
width=1.2\textwidth,
height=0.4\textheight,
enlarge y limits={upper, value=0.2},
ymin=0,
enlarge x limits = 0.2,
bar width=32pt,
title={Instance els19 with 1\% max error},
legend style={at={(0.5,-0.15)},
anchor=north,legend columns=0},
ylabel={Time in milisseconds},
symbolic x coords={s-HAS, s-cAS, CUDA-HAS},
xtick=data,
nodes near coords,
axis lines*=left,
y axis line style={opacity=0},
yticklabels={\empty},
ytick style={draw=none},
cycle list={
    {fill=black!60,draw=black!60},
    {fill=black!40,draw=black!40},
    {fill=black!20,draw=black!20}
},
axis on top,
major grid style=white,
ymajorgrids,
legend style={draw=none,/tikz/every even column/.append style={column sep=0.5cm}}
%nodes near coords align={horizontal},
]
\addplot coordinates {(s-HAS,4) (s-cAS,4) (CUDA-HAS,6)};
\addplot coordinates {(s-HAS,44.60) (s-cAS,71.90) (CUDA-HAS,8.67)};
\addplot coordinates {(s-HAS,156) (s-cAS,334) (CUDA-HAS,18)};


\legend{Best 1\%,Average 1\%,Worst 1\%}
\end{axis}
\end{tikzpicture}
\end{document}

相关内容