Here is a custom hack which is tailored only to the problem at hand. First we redefine the nodes near coords*
for our own purposes and removing many of the necessary checks. Because we are sure that we won't be using them. You have to take it inside the TikZ picture environment to make this local to the picture otherwise all pictures will be affected.
Then, when placing the nodes near coords we fix the bounding box of the local scope with a coordinate, named (O)
here. Then we reset the transformation inside that scope locally. This allows us to compute the distance to the right y
-axis and we west
anchor the node with a little shift to the left.
Regarding the first question you can use visualization depends on=
key to harvest data from other tables, format the number printing etc.
There might be an easier way to do the positioning but I just made it on auto pilot. Please use this to show smarter ways of doing it.
Here is the full code:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.7}
\usetikzlibrary{calc}
\begin{filecontents}{data1.dat}
Age-interval Y-Position Score Name
20-30 1 0.15 Peter
30-40 2 0.20 Jeff
40-50 3 0.12 Steve
50-60 4 1.24 John
\end{filecontents}
\begin{filecontents}{data2.dat}
Age-interval Y-Position Score Name
20-30 1 0.159 Peeteer
30-40 2 0.209 Jeeff
40-50 3 0.129 Steevee
50-60 4 1.249 Joohn
\end{filecontents}
\pgfkeys{/pgfplots/nodes near coords*/.append style={scatter/@post marker code/.code={%
\begin{scope}
\coordinate (O) at (0,0);
\pgftransformreset
\path let \p1 = ($(axis description cs:1,1)-(O)$) in
node[/pgfplots/every node near coord,anchor=west] at ([xshift=\x1+1.5mm]O) {#1};
\end{scope}
}
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xbar,clip=false,
ytick=data,
width=8 cm,height=6 cm,
enlarge y limits={true, value=0.2},
xmin=-0.01,xmax = 2.0,
xticklabel pos = upper,
tick align = outside,
yticklabel pos=left,
yticklabels from table={data2.dat}{Age-interval},
visualization depends on={value \thisrow{Name} \as \labela},
visualization depends on={value \thisrow{Score} \as \labelb},
every node near coord/.append style={
font=\small,
},
nodes near coords={\pgfmathprintnumber[sci]{\labelb} (\labela)},
]
\addplot table [
y=Y-Position,
x=Score,
] {data1.dat};
\addplot table [
y=Y-Position,
x=Score,
] {data2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
This happens because PGFPlots only uses one "stack" per axis: You're stacking the second confidence interval on top of the first. The easiest way to fix this is probably to use the approach described in "Is there an easy way of using line thickness as error indicator in a plot?": After plotting the first confidence interval, stack the upper bound on top again, using stack dir=minus
. That way, the stack will be reset to zero, and you can draw the second confidence interval in the same fashion as the first:
\documentclass{standalone}
\usepackage{pgfplots, tikz}
\usepackage{pgfplotstable}
\pgfplotstableread{
temps y_h y_h__inf y_h__sup y_f y_f__inf y_f__sup
1 0.237340 0.135170 0.339511 0.237653 0.135482 0.339823
2 0.561320 0.422007 0.700633 0.165871 0.026558 0.305184
3 0.694760 0.534205 0.855314 0.074856 -0.085698 0.235411
4 0.728306 0.560179 0.896432 0.003361 -0.164765 0.171487
5 0.711710 0.544944 0.878477 -0.044582 -0.211349 0.122184
6 0.671241 0.511191 0.831291 -0.073347 -0.233397 0.086703
7 0.621177 0.471219 0.771135 -0.088418 -0.238376 0.061540
8 0.569354 0.431826 0.706882 -0.094382 -0.231910 0.043146
9 0.519973 0.396571 0.643376 -0.094619 -0.218022 0.028783
10 0.475121 0.366990 0.583251 -0.091467 -0.199598 0.016664
}{\table}
\begin{document}
\begin{tikzpicture}
\begin{axis}
% y_h confidence interval
\addplot [stack plots=y, fill=none, draw=none, forget plot] table [x=temps, y=y_h__inf] {\table} \closedcycle;
\addplot [stack plots=y, fill=gray!50, opacity=0.4, draw opacity=0, area legend] table [x=temps, y expr=\thisrow{y_h__sup}-\thisrow{y_h__inf}] {\table} \closedcycle;
% subtract the upper bound so our stack is back at zero
\addplot [stack plots=y, stack dir=minus, forget plot, draw=none] table [x=temps, y=y_h__sup] {\table};
% y_f confidence interval
\addplot [stack plots=y, fill=none, draw=none, forget plot] table [x=temps, y=y_f__inf] {\table} \closedcycle;
\addplot [stack plots=y, fill=gray!50, opacity=0.4, draw opacity=0, area legend] table [x=temps, y expr=\thisrow{y_f__sup}-\thisrow{y_f__inf}] {\table} \closedcycle;
% the line plots (y_h and y_f)
\addplot [stack plots=false, very thick,smooth,blue] table [x=temps, y=y_h] {\table};
\addplot [stack plots=false, very thick,smooth,blue] table [x=temps, y=y_f] {\table};
\end{axis}
\end{tikzpicture}
\end{document}
Best Answer
You can use Joseph's approach from How can I add a zero line to a plot?: By setting
extra x ticks={1}
, you can define an additional tick that can be formatted differently from the others. By settingextra x tick style={xmajorgrids=true}
, you can switch on the grid line for this tick, resulting in a vertical line: