There are a couple of issues here: cycle list name
is the right way to approach this, and the cycle list will be respected as long as you use \addplot +[...]
. However, you need to use cycle list name
after ybar
, since ybar
sets its own list.
Furthermore, you need to make sure to either put a %
after the last entry in the cycle list, or to put the closing }
directly behind it (not on a new line).
To get black labels, add black
to the every node near coord
style.
To align the bars with the tick marks, set ybar=0pt, bar shift=0pt
.
![](https://i.stack.imgur.com/g7WEK.jpg)
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{xcolor}
\pgfplotsset{xticklabel={\tick},scaled x ticks=false}
\pgfplotsset{plot coordinates/math parser=false}
\definecolor{darkblue}{RGB}{0,34,68}
\definecolor{ochre}{RGB}{255,161,0}
\pgfplotscreateplotcyclelist{customcol}{%
{fill=darkblue, color=red, draw=black},
{fill=ochre, draw=black}%
}
\begin{document}
\begin{center}
\pgfplotstableread[col sep=comma,header=true]{
number,label
0.031,A
0.038,B
0.043,C
0.046,D
0.056,E
0.063,F
}\data
\begin{tikzpicture}
\begin{axis}
[
width=5in,
symbolic y coords={A,B,C,D,E,F},
tick label style={font=\footnotesize},
label style={font=\footnotesize},
axis x line*=bottom,
axis y line*=left,
yticklabel style={text width=3cm, align=right,inner sep=0pt, outer sep=0pt},
xbar=0pt,
bar shift=0pt,
bar width=4pt,
point meta=x*100,
xlabel=number,
ylabel=label,
y tick label style={text width=0.5cm,align=center},
xticklabel=\pgfmathparse{100*\tick}\pgfmathprintnumber{\pgfmathresult}\,\%,
xticklabel style={/pgf/number format/.cd,fixed,precision=2},
nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}$\%$},
every node near coord/.append style={
black,
font=\footnotesize,
/pgf/number format/precision=3,
anchor=180
},
cycle list name=customcol
]
\pgfplotsinvokeforeach{0:0.041,0.041:0.0693}{
\addplot +[restrict x to domain=#1] table {\data};
}
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}
Best Answer
The reason why Jake's solution doesn't work is that the
\listmacro
isn't expanded before thepgfplotscreateplotcyclelist
macro searches for the\\
separators. Therefore the whole macro is taken as one setting and the included\\
are expanded as part of the setting which causes an error (line breaks in settings don't make much sense).So in order to make it work you have to manually expand
\listmacro
first and than feed it to\pgfplotscreateplotcyclelist
. There are multiple ways to do this. Here a way which uses eTeX's\unexpanded
inside\edef
to expand the\listmacro
only once, otherwise the\\
are expanded to early and cause also errors. I defined a new macro\pgfplotscreateplotcyclelistfrommacro
which expands the second argument and then calls\pgfplotscreateplotcyclelist
. Feel free to rename it.Based on Jake's code: