如何防止使用坐标附近的节点绘制小值?

如何防止使用坐标附近的节点绘制小值?

我正在尝试完成我的第一张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是浮点表示法,因此您必须先使用 打开fpufloating 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} 

相关内容