1

I am using the following code with pgfplotstable to generate a new column that represents the difference of two other columns.

\pgfplotstableset{create on use/iqr/.style={
    create col/expr={\thisrow{uq}-\thisrow{lq}
    }
  }, create on use/range/.style={%
     create col/expr={\thisrow{uw}-\thisrow{lw}
     }
  }
}

The resulting column values have some values that are incorrect, off by 0.1. The original data comes from a table where the data has 2 decimal places. I format the result columns with precision=1 . What do I need to include so simple subtraction is correct?

A MWE is as follows:

\documentclass[margin=1cm]{standalone}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\usepackage{multirow}
\pgfplotsset{compat=1.11}
\usepgfplotslibrary{statistics}

\pgfplotstableset{create on use/pliqr/.style={
    %%create col/expr={\thisrow{uq}-\thisrow{lq}
    %%}
  }
}
\pgfplotstableset{create on use/iqr/.style={
    create col/expr={\thisrow{uq}-\thisrow{lq}
    }
  }, create on use/range/.style={%
     create col/expr={\thisrow{uw}-\thisrow{lw}
     }
  }
}

\newcommand{\testdesboxplot}{%
\begin{tikzpicture}
\begin{axis}[%
       y=-\baselineskip, scale only axis,
       width=7.5cm,
       enlarge y limits={abs=0.10},
       boxplot/draw direction=x,
       clip=false, y axis line style={opacity=0}, 
       ytick=\empty,
       xmajorgrids, major grid style=gray!20,
       xtick={0,10,15,20,25,30,35,40,45,50,60},
       xmin=0, xmax=60, axis x line*=bottom,
       axis y line*=left,
       xticklabel pos=upper, tick align=outside,
       xticklabel style={font=\small,major tick length=5pt,
       thick, color=black,tickwidth={2pt}},
]%
\desboxplot{2.9}{8.08}{9.45}{11.35}{15.6}{9.75}{0}
\desboxplot{2.4}{8.50}{12.5}{18.00}{51.3}{13.91}{1}
\desboxplot{6.0}{8.85}{11.6}{19.50}{30.0}{13.795}{2}
\desboxplot{7.7}{9.50}{15.0}{20.50}{41.1}{16.671}{3}
\desboxplot{6.5}{14.0}{16.0}{20.73}{41.1}{18.06}{4}
\desboxplot{7.4}{14.8}{18.5}{25.83}{42.0}{20.825}{5}
\desboxplot{11.5}{16.7}{18.1}{19.88}{31.2}{19.446}{6}
\desboxplot{4.4}{12.2}{15.1}{16.83}{20.2}{14.053}{7}
\desboxplot{6.0}{8.85}{11.1}{13.30}{22.0}{11.914}{8}
\desboxplot{3.5}{8.23}{12.7}{15.9}{17.8}{11.875}{9}
\desboxplot{6.3}{9.4}{12.7}{12.7}{17.5}{11.72}{10}
\desboxplot{2.0}{15.1}{16.5}{20.0}{32.1}{17.311}{11}
\desboxplot{7.0}{18.8}{23.6}{29.17}{53.72}{25.151}{12}
\desboxplot{11.0}{21.75}{26.52}{30.88}{42.1}{26.373}{13}
\desboxplot{10.3}{21.73}{26.9}{31.83}{45.3}{27.117}{14}
\desboxplot{12.2}{17.48}{21.9}{26.98}{40.3}{23.17}{15}
\desboxplot{10.2}{17.75}{21.6}{24.8}{30.5}{21.352}{16}
\desboxplot{12.5}{21.45}{24.8}{32.5}{38.7}{26.18}{17}

\edef\numberofticks{17}
\edef\ciline{0}%%{1}
\edef\desmu{19.06}
\edef\lci{18.3}
\edef\uci{19.8}
%\edef\desmu{25.6}
\edef\numberofrows{18}

\begin{pgfonlayer}{background}
  \fill[color=blue!10] (axis cs:12.2,\numberofticks) rectangle 
                        (axis cs:24.6,\ciline);
  \fill[color=red!10] (axis cs:\lci,\numberofticks) rectangle 
                        (axis cs:\uci,\ciline);
\draw [red,dotted,thick] (axis cs:\desmu,0.0) -- 
                         (axis cs:\desmu,\numberofticks)
   node[anchor=north] at (axis cs:\desmu,18.2){\tiny $ \mu$}
   node[blue,anchor=north] at (axis cs:12.2,18.5)
                                   {\tiny $Q_1$}
   node[blue,anchor=north] at (axis cs:24.6,18.5)
                                   {\tiny $Q_3$};
\draw [blue,dotted,thick] (axis cs:17.8,0.0) -- 
                          (axis cs:17.8,\numberofticks)
   node[blue,anchor=north] at (axis cs:17.8,18.5)
                                   {\tiny $Q_2$};
\end{pgfonlayer}

\end{axis}
\end{tikzpicture}
}%end testdesboxplot definition

\newcommand{\desboxplot}[7]{%
 \addplot[ boxplot prepared={%
  draw position={#7},
  lower whisker={#1}, lower quartile={#2}, median={#3},
  upper quartile={#4}, upper whisker={#5}, average={#6},
  box extend=0.5,  % height of box
  whisker extend=0.5, % height of whiskers
  every box/.style={thin,draw=black,fill=gray!50},
  every whisker/.style={black,thick},
  every median/.style={black,thick},
  every average/.style={/tikz/mark=*,red },
  /pgf/number format/precision=2 } ]
  coordinates {}
  node[left,black] at
  (boxplot box cs: \boxplotvalue{lower whisker},0.5)
  {\tiny\pgfmathprintnumber{\boxplotvalue{lower whisker}}}
  node[right,black] at
  (boxplot box cs: \boxplotvalue{upper whisker},0.5)
  {\tiny\pgfmathprintnumber{\boxplotvalue{upper whisker}}};
} %end of \desboxplot definition

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\pgfplotstableread[row sep=crcr]{
yr    ride  mile    lw     lq    med    uq     uw      av\\
1997  20    195.0   2.90   8.08   9.45  11.35  15.60   9.750\\
1998 118   1641.4   2.40   8.50  12.50  18.00  51.30  13.910\\
1999  43    593.2   6.00   8.85  11.60  19.50  30.00  13.795\\
2000  45    750.2   7.70   9.50  15.00  20.50  41.10  16.671\\
2001  63   1137.9   6.50  14.00  16.00  20.78  41.10  18.061\\
2002  36    749.7   7.40  14.83  18.50  25.83  42.00  20.825\\
2003  14    272.3  11.50  16.68  18.13  19.88  31.20  19.446\\
2004  10    140.6   4.40  12.21  15.14  16.83  20.20  14.053\\
2005   7     83.4   6.00   8.85  11.10  13.30  22.00  11.914\\
2006  12    142.5   3.50   8.23  12.70  15.90  17.80  11.875\\
2007   5     58.6   6.30   9.40  12.70  12.70  17.50  11.720\\
2008  36    605.9   2.00  15.10  16.50  20.00  32.10  17.311\\
2009  47   1182.1   7.00  18.80  23.60  29.17  53.72  25.151\\
2010  54   1424.0  11.00  21.75  26.52  30.88  42.10  26.373\\
2011  42   1138.9  10.30  21.73  26.90  31.83  45.30  27.117\\
2012  40    926.8  12.20  17.48  21.90  26.98  40.30  23.170\\
2013  27    576.5  10.20  17.75  21.60  24.80  30.50  21.352\\
2014  26    680.5  12.50  21.45  24.80  32.50  38.70  26.180\\
}\iqrtable

\begin{document}

\pgfplotstablegetrowsof{\iqrtable}
\let\numberofrows=\pgfplotsretval

% Print the table
\pgfplotstabletypeset[columns={yr,ride,mile,av,pliqr,lw,lq,med,%
                               uq,iqr,uw,range},
  % Booktabs rules
  every head row/.style={before row=\toprule,
                         after row=\midrule},
  every last row/.style={after row=[5ex]\bottomrule},
  % Set header name
  columns/yr/.style={string type,column name=Year},
  % Use the ``pliqr'' column to call the \testdesboxplot command 
  %in a multirow cell in the first row, keep empty for all 
  %other rows
  columns/pliqr/.style={
    column name={Dave Strang's Boxplot},
    assign cell content/.code={% use \multirow for Z column:
    \ifnum\pgfplotstablerow=0
    \pgfkeyssetvalue{/pgfplots/table/@cell content}
    {\multirow{\numberofrows}{7.5cm}{\testdesboxplot}}%
    \else
    \pgfkeyssetvalue{/pgfplots/table/@cell content}{}%
    \fi
    }
  },
  % Format numbers and titles
  columns/av/.style={column name=Mean,fixed,
                       fixed zerofill,dec sep align},
  columns/mile/.style={column name=Miles,precision=1,
                    fixed,fixed zerofill,dec sep align},
  columns/ride/.style={column name=Rides,fixed, precision=0,
                    fixed zerofill,dec sep align},
  columns/lw/.style={column name=Min,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/lq/.style={column name=Q1,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/med/.style={column name=Median,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/uq/.style={column name=Q3,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/iqr/.style={column name=IQR,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/uw/.style={column name=Max,fixed,precision=1,
                      fixed zerofill,dec sep align},
  columns/range/.style={column name=Range,fixed,precision=1,
                        dec sep align},
]{\iqrtable}
%Done!

\end{document}
  • 1
    Can you put a full example so that we can evaluate what the problam might be on our computers? Also note that precision involves rounding. – percusse Oct 31 '14 at 10:31
  • 1
    Can you turn your code into a complete minimal example (starting from \documentclass and including some dummy data) that demonstrates the problem? I assume that what you're seeing is just the rounding effect, try setting precision=2. – Jake Oct 31 '14 at 10:32
  • Here is the MWE. Note that I used tex.stackexchange.com/questions/19346/… as the basis for this. Very cool to put a plot into a table! – user50506 Nov 1 '14 at 4:43
  • An unusual feature I found is though I create two columns (iqr,range) by subtracting, iqr has incorrect elements, range seems fine! Regards, Dave – user50506 Nov 1 '14 at 5:08
  • I just tried it with precision=2 and it looks correct. – percusse Nov 1 '14 at 5:10
3

The data handling and pretty printing are different mechanisms in pgfplots. What is presented to the end result is passed via \pgfmathprintnumber variants and works only with the representation of the result. In other words, you see not the rounded value because the data is rounded but you see the result that presented in a rounded fashion. The data remains unaltered.

This allows the typesetting and internal calculations mutually exclusive. As given in the comments precision key adjusts the precision of the pretty printing but not the data handling.

Hence, the math is not wrong. But rounding is misleading.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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