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