如何制作条形图,其中条形上方的文本始终位于轴内?

如何制作条形图,其中条形上方的文本始终位于轴内?

我正在制作条形图 ( xbar),并使用环境中的命令pgfplots在每个条形图顶部添加文本/数字。x 轴故意不为参数赋予任何值,以便使最高的条形图动态确定轴中使用的最大 x 值(该行被注释掉)。但是,当 TikZ 确定 x 轴上的最大值时,不会考虑每个条形图顶部的文本/数字的范围。在我的示例中,上面第二个条形图顶部的名称“Steve”与右侧 y 轴重叠。我该如何防止这种情况发生,以便独立于文件中的 x 值解决问题?nodes near coordsaxisxmaxxmax=100data.dat

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  98           Jeff
40-50               3                  121          Steve
50-60               4                  24           John 
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\makeatletter
\begin{axis}[
    xlabel={Test score},
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
   % xmax = 100,
    xticklabel pos = upper,
    tick align = outside,
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    ylabel={Age intervals (yr)},
    nodes near coords,
    every node near coord/.append style={anchor=west},
    point meta=explicit symbolic
]
\addplot table [
    y=Y-Position,
    x=Score,
    meta=Name
] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

您可以设置enlarge x limits={upper, value=0.2},这将使 x 的上限增加绘图 x 范围的 20%,因此只要您的标签宽度不超过绘图宽度的 20%,就没问题。如果您的标签更长,则可能需要选择其他值。

如果您确实想要一个可以适应任何标签长度的自动解决方案,这里有一个解决方案。我编写了一个名为的新键,accommodate labels它将表的名称和包含标签的列的名称作为参数,然后计算值enlarge x limits。这假设width图的 是手动设置的(否则该值不可用),并且 被scale only axis激活(否则width指的是整个图形,而不仅仅是轴区域)。

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents,pgfplotstable}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  98           Jeff
40-50               3                  121          LoooooooongJohnSilver
50-60               4                  24           John 
\end{filecontents}

\pgfplotsset{
    accommodate labels/.code 2 args={
        \newlength{\myl}
        \pgfplotstableread{#1}\data
        \def\largestlength{0}
        \pgfplotstableforeachcolumnelement{#2}\of\data\as\cell{
            \settowidth{\myl}{\pgfinterruptpicture\cell\endpgfinterruptpicture}
            \pgfmathsetmacro\largestlength{max(\the\myl,\largestlength)}
        }
        \pgfplotsset{
            enlarge x limits={
                upper,              value=1/(1-(\largestlength+4pt)/\pgfkeysvalueof{/pgfplots/width})-1
            }
        }
    }
}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    xlabel={Test score},
    xbar,     
    bar width=2pt,
    ytick=data,scale only axis,
    width=6cm,
    height=5cm,
    xmin=-1,
    accommodate labels={data.dat}{Name},
    xticklabel pos = upper,
    tick align = outside,
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    ylabel={Age intervals (yr)},
    nodes near coords,
    every node near coord/.append style={anchor=west},
    point meta=explicit symbolic
]
\addplot table [
    y=Y-Position,
    x=Score,
    meta=Name
] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

相关内容