我试图构建一个堆叠条形图,该图不在图例中显示列标题的标签,而是直接在条形图本身附近显示。到目前为止,我想出了以下内容:
\documentclass[12pt]{amsart}
\usepackage{pgfplots,pgfplotstable}
\pgfplotstableread{
Column abc def ghi
col1 32 2 35
col2 34 54 2
}\MyName
\begin{document}
\begin{tikzpicture}
\begin{axis}[ybar=0pt,
ybar stacked,
bar shift=0pt,
xticklabels from table={\MyName}{Column},
xtick=data,
nodes near coords=\col
]
\pgfplotstableforeachcolumn\MyName\as\col{%
\ifnum\pgfplotstablecol=0
\else
\edef\tmp{%
\noexpand\addplot table [x expr=\noexpand\coordindex,y=\col] {\noexpand\MyName};
}%
\tmp
\fi
}
\end{axis}
\end{tikzpicture}
\end{document}
不幸的是,在生成的图表中,所有标签都设置为最后一列标题,即“ghi”,而不是“abc”、“def”和“ghi”。有人有什么好主意吗?提前谢谢!
答案1
其中一个问题是,你nodes near coords=\col
在循环范围之外设置\col
了 。这也会干扰刻度。你需要做的是在nodes near coords
循环内部设置 的值。关键是分配point meta
。通常,这会期望给出一个数字,但有一种(略微复杂的)方法可以通过 TeX 代码提供文本,方法是指定
point meta={TeX code symbolic={\edef\pgfplotspointmeta{\col}}}
该TeX code symbolic
选项需要一些代码来定义命令,\pgfplotspointmeta
以便排版所需的标签。就您而言,循环内部\col
已经完成了您想要的操作。
\documentclass[12pt]{amsart}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.9}
\pgfplotstableread{
Column abc def ghi
col1 32 2 35
col2 34 54 2
}\MyName
\begin{document}
\begin{tikzpicture}
\begin{axis}[ybar=0pt,
ybar stacked,
nodes near coords,
bar shift=0pt,
xticklabels from table={\MyName}{Column},
xtick=data,
ymin=0
]
\pgfplotstableforeachcolumn\MyName\as\col{%
\ifnum\pgfplotstablecol=0
\else
\addplot+[point meta={TeX code symbolic={\edef\pgfplotspointmeta{\col}}}] table [x expr=\coordindex,y=\col] {\MyName};
\fi}
\end{axis}
\end{tikzpicture}
\end{document}
请注意,设置ymin=0
是合理放置最低节点标签所必需的。我使用了\addplot+
而不是\addplot
,这样先前的选项就不会被覆盖。