我正在尝试完成我的第一张pgfplots
图表。借助我在这里找到的所有示例,我几乎已经设法使它达到了我想要的效果。我似乎无法弄清楚的最后一件事是如何防止绘制低于 4% 的值标签,因为它们不适合该条形图(并且小百分比在这种特定情况下并不真正相关)。我在这里找到了一个示例,说明如何在值为 0 时抑制文本显示。我觉得这只是让它工作的一小步。我尝试使用\pgfmathfloatifflags
并测试负 4 的负数\pgfplotspointmeta
。这会起作用吗?我还没有让它工作。我认为我对 TeX/PGF 语义的理解还不够。
到目前为止的结果:我试图在这里发布一张图片,但作为新用户,我不被允许。让我描述一下这个问题:一个数据点的值为 2。这个数据点的条形段太小,无法将值绘制在条形段内。它现在与另一个值重叠。我希望图表中不绘制较小的值。
我当前使用的代码是:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\pgfplotstableread{
y x1 x2 x3 ylabel
1 41 4 55 {Unit A}
2 60 2 38 {Unit B}
3 20 50 30 {Unit C}
4 0 20 80 {Unit D}
}\datatable
\begin{figure}
\caption{How to not show labels $<4\%$}
\centering
\begin{tikzpicture}
\begin{axis}[
xbar stacked,
legend style={
legend columns=3,
at={(xticklabel cs:0.5)},
anchor=north,
draw=none
},
ytick=data,
axis y line*=left,
axis x line*=bottom,
tick label style={font=\footnotesize},
legend style={font=\footnotesize},
label style={font=\footnotesize},
xtick={0,20,40,60,80,100},
width=\textwidth,
bar width=6mm,
yticklabel style={text width=3cm, align=right},
yticklabels from table={\datatable}{ylabel},
xmin=0,
xmax=100.1,
y=8mm,
enlarge y limits={abs=0.7},
point meta=explicit,
every node near coord/.style={
check for zero/.code={
\pgfmathfloatifflags{\pgfplotspointmeta}{0}{
\pgfkeys{/tikz/coordinate}
}{}
}, check for zero, xshift=3, font=\scriptsize},
nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=0]{\pgfplotspointmeta}$\%$},
nodes near coords align=left
]
\addplot table [x=x1, y=y, meta=x1] \datatable;
\addplot table [x=x2, y=y, meta=x2] \datatable;
\addplot table [x=x3, y=y, meta=x3] \datatable;
\legend{lorem,ipsum, dolor}
\end{axis}
\end{tikzpicture}
\label{fig:test}
\end{figure}
\end{document}
答案1
快完成了!您只需要在进行比较之前额外执行减法,而不能将其直接放在命令中\pgfmathfloatifflags
。
由于 的值\pgfplotspointmeta
是浮点表示法,因此您必须先使用 打开fpu
(floating point unit
)库\pgfkeys{/pgf/fpu=true}
,然后使用 执行减法\pgfmathparse{\pgfplotspointmeta-4}
,使用 检查结果是否为负数\pgfmathfloatifflags{\pgfmathresult}{-}
,最后再次关闭该fpu
库。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\pgfplotstableread{
y x1 x2 x3 ylabel
1 41 4 55 {Unit A}
2 60 2 38 {Unit B}
3 20 50 30 {Unit C}
4 0 20 80 {Unit D}
}\datatable
\begin{figure}
\caption{How to not show labels $<4\%$}
\centering
\begin{tikzpicture}
\begin{axis}[
xbar stacked,
legend style={
legend columns=3,
at={(xticklabel cs:0.5)},
anchor=north,
draw=none
},
ytick=data,
axis y line*=left,
axis x line*=bottom,
tick label style={font=\footnotesize},
legend style={font=\footnotesize},
label style={font=\footnotesize},
xtick={0,20,40,60,80,100},
width=\textwidth,
bar width=6mm,
yticklabel style={text width=3cm, align=right},
yticklabels from table={\datatable}{ylabel},
xmin=0,
xmax=100.1,
y=8mm,
enlarge y limits={abs=0.7},
point meta=explicit,
every node near coord/.style={
check for zero/.code={
\pgfkeys{/pgf/fpu=true}
\pgfmathparse{\pgfplotspointmeta-4}
\pgfmathfloatifflags{\pgfmathresult}{-}{
\pgfkeys{/tikz/coordinate}
}{}
\pgfkeys{/pgf/fpu=false}
}, check for zero, xshift=3, font=\scriptsize},
nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=0]{\pgfplotspointmeta}$\%$},
nodes near coords align=left
]
\addplot table [x=x1, y=y, meta=x1] \datatable;
\addplot table [x=x2, y=y, meta=x2] \datatable;
\addplot table [x=x3, y=y, meta=x3] \datatable;
\legend{lorem,ipsum, dolor}
\end{axis}
\end{tikzpicture}
\label{fig:test}
\end{figure}
\end{document}