46

Is it possible to combine a TikZ pattern with a background of a chosen color?

\addplot[black,fill=yellow,pattern=north east lines] ...

yields bars which have black stripes on white (transparent?) background, whereas

\addplot[black,pattern=north east lines,fill=yellow] ...

yields bars which are plain yellow with not stripes at all. Any chance of getting tiger-like bars (black stripes on yellow) without defining an inherently-colored pattern by hand?

3 Answers 3

55

You can use a postaction to draw the pattern after the yellow background.

tiger bar plot

\documentclass[12pt]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{patterns}


\begin{document}
\begin{tikzpicture}
\begin{axis}[ybar, samples=10, enlarge y limits=upper, ymin=0]
\addplot +[
    black,
    fill=yellow,
    postaction={
        pattern=north east lines
    }
]{rnd};
\end{axis}

\end{tikzpicture}
\end{document}

In older versions of PGFfplots, you needed to use every path to apply the pattern.

In order to apply the postaction, you can use every path/.style={postaction={...}}. This requires that you clear the postaction, e.g. using the approach given in Applying a postaction to every path in TikZ, as otherwise you get an infinite recursion.

\documentclass[12pt]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{patterns}

\makeatletter
\tikzset{nomorepostaction/.code=\let\tikz@postactions\pgfutil@empty}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[ybar, samples=10]
\addplot +[
    black,
    fill=yellow,
    every path/.style={
        postaction={
            nomorepostaction,
            pattern=north east lines
        }
    }
]{rnd};
\end{axis}

\end{tikzpicture}
\end{document}
9
  • Works like a charm. :-)
    – Andreas
    Commented Aug 8, 2011 at 7:29
  • This doesn't work anymore with the latest version? Commented Jan 23, 2012 at 10:49
  • @MobiusPizza: It does for me (with version 1.5.1). I forgot the \end{document} in my example, so maybe that's what caused the failure for you?
    – Jake
    Commented Jan 23, 2012 at 11:04
  • @Jake I can confirm that indeed the new version does not render the patterns.
    – percusse
    Commented Apr 20, 2012 at 19:12
  • 1
    @percusse: You're right, the new version doesn't seem to need the every path approach any more. I've edited my answer.
    – Jake
    Commented Apr 20, 2012 at 19:57
2

I think the answer is yes: by two separate path instructions with the same path: one without pattern but with fill color and one with the chosen pattern.

In terms of the \addplot command of pgfplots: two separate \addplot commands, one with \addplot[fill,forget plot,...] and one with the pattern. The forget plot tells pgfplots to avoid legend entries for the plot.

If this appears to be unsuitable, you may want to look into decorations - perhaps they support such a thing.

2

another simple way is to use pattern

\documentclass[12pt]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usepgfplotslibrary{groupplots}


\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{groupplot}[
legend columns=-1,
legend entries={{\color{red}{\tiny Random}},{\color{blue}{\tiny ++Cost}},{\color{black}{\tiny ++FTE}},{\color{green}{\tiny ++Resources}},{\color{orange}{\tiny Hold All}}},
legend to name=CombinedLegendBar,
area legend, 
group style={
group size=1 by 1,
xlabels at=edge bottom,
ylabels at=edge left,
xticklabels at=edge bottom}]
\nextgroupplot[bar width=17pt, xticklabels=\empty]
\addplot[ybar, pattern=horizontal lines] coordinates {  (1, 12)};
\addplot[ybar, pattern=vertical lines] coordinates { (2, 3)};
\addplot[ybar, pattern=grid] coordinates {  (3, 3)};
\addplot[ybar, pattern=dots] coordinates {  (4, 2)};
\addplot[ybar, pattern=north east lines] coordinates {  (5, 2)};


\end{groupplot}
\end{tikzpicture}
\ref{CombinedLegendBar}
\caption{Triage++ Performance}
\label{PlusPlusCombinedBar}
\end{figure}
\end{document}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .