Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I'm trying to finalize my first pgfplots chart. I've managed to get is almost the way I would like it to be with thanks to all examples I found here. The last thing I can't seem to figure out is how to prevent plotting of value labels below 4% as they don't fit the bar (and small percentages aren't really relevant in this specific case). I've found an example here on how to suppress the text from showing when the value is 0. I feel that it's just a small step to getting it to work. What I tried was to use \pgfmathfloatifflags and test for negative numbers on \pgfplotspointmeta minus 4. Would this work? I've not gotten it to work. I believe my understanding of the semantics of TeX/PGF is not adequate.

The result so far: I tried to post an image here but as a new user I'm not allowed. Let me describe the issue: One data point has value 2. The bar segment of this data point is too small for the value to be plotted inside bar segment. It's overlapping now with another value. I would like small values to not be plotted in the chart.

The code I'm currently using is:

\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} 
share|improve this question
    
Welcome to TeX.sx! Please make sure that all images are uploaded using the official stackexchange interface, i.e. the image icon on top of the text field (shortcut: CTRL+G). This ensures that all images are always accessible and do not expire. As new user without image posting privileges simply include the image as normal and remove the ! in front of it to turn it into a link. A moderator or another user with edit privileges can then reinsert the ! to turn it into an image again. –  Martin Scharrer Jun 15 '12 at 10:57

1 Answer 1

up vote 7 down vote accepted

Almost there! You only need to perform the subtraction in an extra step before doing the comparison, you can't put it right in the \pgfmathfloatifflags command.

Since the value of \pgfplotspointmeta is in floating point notation, you'll first have to switch on the fpu (the floating point unit) library using \pgfkeys{/pgf/fpu=true}, then perform the subtraction using \pgfmathparse{\pgfplotspointmeta-4}, check if the result is negative using \pgfmathfloatifflags{\pgfmathresult}{-}, and finally switch off the fpu library again.

\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} 
share|improve this answer
    
Thanks a lot. And WOW; that was fast! –  user15630 Jun 15 '12 at 10:13

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.