我想在文档中创建标准化堆叠条形图。但不知何故,条形图的第一部分出现了问题。是什么原因导致此错误?
我的代码
\documentclass{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}
\pgfplotstableread[col sep=comma]{
55,10,1,2,10
52,4,2,3,1
%18,0,2,3,4
%....
}\data
\pgfplotstablecreatecol[
create col/expr={
\thisrow{1} + \thisrow{2} + \thisrow{3} + \thisrow{4}
}
]{sum}{\data}
\newcommand{\stackedbar}[1]{
\begin{tikzpicture}
\begin{axis}[
xbar stacked,
point meta=\thisrow{y},
table/y expr=\coordindex,
table/x expr=\thisrow{y}/\thisrow{sum},
% x filter/.append expression={\thisrow{0} == #1 ? x : nan},
nodes near coords,
]
\addplot table[y=1]{\data};
\addplot table[y=2]{\data};
\addplot table[y=3]{\data};
\addplot table[y=4]{\data};
\end{axis}
\end{tikzpicture}
}
\begin{document}
\stackedbar{55}
%\stackedbar{52}
\end{document}
输出
正如我们所见,第一个段以某种方式被部分绘制,但段的中心可能被正确计算(图形左侧奇怪的标签位置)。
神秘的自我修复
有趣的是,如果我在表格的最后一行进行注释,其他行就会自行修复,并且现在可以正确绘制。
(我在代码中注释掉了环境的预期用途stackedbar
。我想内联使用环境并一次只过滤掉表中的一行。)
答案1
感谢@hpekristiansen,xmin=0
当将其作为轴选项包含时,解决了该问题。
我附加了我的预期用途和输出:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{lipsum}
\pgfplotsset{compat=1.17}
\pgfplotstableread[col sep=comma]{
55,10,1,2,10
52,4,2,3,1
18,0,2,3,4
%....
}\data
\pgfplotstablecreatecol[
create col/expr={
\thisrow{1} + \thisrow{2} + \thisrow{3} + \thisrow{4}
}
]{sum}{\data}
\newcommand{\stackedbar}[1]{
\begin{tikzpicture}
\begin{axis}[
xbar stacked,
point meta=\thisrow{y},
table/y expr=\coordindex,
table/x expr=\thisrow{y}/\thisrow{sum},
xmin=0,
x filter/.append expression={\thisrow{0} == #1 ? x : nan},
nodes near coords,
ticks=none,
axis lines=none,
inner sep = 0,
outer sep = 0,
width=1.095\linewidth,
scale only axis,
]
\addplot table[y=1]{\data};
\addplot table[y=2]{\data};
\addplot table[y=3]{\data};
\addplot table[y=4]{\data};
\end{axis}
\end{tikzpicture}
}
\begin{document}
This is what I wanted to achieve: show a single data row inline.\\
\stackedbar{55}\\
\lipsum[1]
This is what I wanted to achieve: show another data row inline.\\
\stackedbar{52}\\
\lipsum[2-3]\\
\stackedbar{18}
\end{document}