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}
\documentclassand including some dummy data) that demonstrates the problem? I assume that what you're seeing is just the rounding effect, try settingprecision=2. – Jake Oct 31 '14 at 10:32