# Hatched bars and bar-specific background in BarChart

I would like to diagonally hatch the bars in BarChart and to have three different background colors for the different bars, like this:

Any ideas how to reproduce this image? The closest post I found is here.

-
–  The Toad Oct 15 '13 at 4:35
@rm-rf The hatching part of this question is a duplicate indeed. The background part, however, is unique to this question. Therefore, I hesitate to vote to close. –  Sjoerd C. de Vries Oct 15 '13 at 6:29
@SjoerdC.deVries Fair enough. Changed comment to "Related" –  The Toad Oct 15 '13 at 7:05

With a bit of manual parameters:

barFilled[gap_, h_, seg_][{{xmin_, xmax_}, {ymin_, ymax_}}, ___] :=
Module[{width, line, yt, yb, lend},
{yb, yt} = Sort[{ymin, ymax}];
width = xmax - xmin;
line = Table[{{xmin, i}, {xmax, i + width}}, {i, yb, yt - width, h/seg}];
lend = line[[-1, 1, 2]];
line = {Line[line],
Line[Table[{{xmin + i, yb}, {xmax, yb + width - i}}, {i, h/seg, width, h/seg}]],
Line[Table[{{xmin, lend + i}, {xmax - (lend + width - yt) - i,yt}}, {i, h/seg, width + h/seg, h/seg}]]};
{{Opacity[.2], EdgeForm[], Rectangle[{xmin, -h}, {xmax + gap, h}]},
{CapForm["Butt"], line}, {FaceForm[], Rectangle[{xmin, ymin}, {xmax, ymax}]}}]

BarChart[{2, -1, 1.5, -3, 3, 2.5}, BarSpacing -> 2,
ChartElementFunction -> barFilled[.65, 3, 35], ChartStyle -> 61,
GridLines -> {None, Automatic}]


Like AimForClarity mentioned, to avoid empty strip, we could replace 0 with some dummy value + meta and define barFilled for that value. For example:

barFilled[gap_, h_, seg_][{{xmin_, xmax_}, {ymin_, ymax_}}, _, {None}] :=
{{Opacity[.2], EdgeForm[], Rectangle[{xmin, -h}, {xmax + gap, h}]}}

BarChart[{2, -1, 0, -2, 1, 2} /. {0 -> (1 -> None)}, BarSpacing -> 2,  ChartElementFunction -> barFilled[.65, 2, 35],
ChartStyle -> 61, GridLines -> {None, Automatic}]


-
Does the grid lines have to be on top of the charts and axes ticks labels? –  mmal Oct 15 '13 at 8:45
@mmal grid lines are behind bars. It's a side effect of setting FaceForm[]. If you don't want that, you can insert one more rectangle before drawing lines. For example, .., {FaceForm[White], Rectangle[{xmin, ymin}, {xmax, ymax}]}, {CapForm["Butt"], line}, ... –  halmir Oct 15 '13 at 12:14
@mmal To have grid lines on top of the charts and axes ticks labels one can use Method -> {"GridLinesInFront" -> True} option. –  Alexey Popkov Oct 15 '13 at 21:12
Thanks, the halmir's method does exactly what I was thinking about. Using Frame->True clips the grid lines to frame region. –  mmal Oct 16 '13 at 5:52
I hav not been able to get around this silly problem, that if one of the elements is 0 in the array, the barFilled function does not seem to be called and so there is an empty strip, any ideas how to fix this? –  AimForClarity Oct 19 '13 at 4:31