I'm sure I've seen this sort of thing done before, but now I can't find a working implementation anywhere. Below I give a toy example that is just complex enough to illustrate the issues. **(I provide full code after the problem's description.)** --- First, consider this simple (and entirely meaningless) barchart: In[122]:= With[ { labels = BlockRandom[SeedRandom[-2]; RandomSample[DictionaryLookup[{"English", ___}], nItems] ] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ] , FrameStyle -> Thin ] ] ![Mathematica graphics](https://i.sstatic.net/tmgMs.png) > The goal is to replace the text labels along the left with `Graphic` objects, ("graphic labels", if you will), in such a way that these labels *scale appropriately with the figure*. --- For this (rather artificial!) example, the "graphic labels" I have in mind consist of several colored `Rectangle` objects lined up in a row, like this: ![Mathematica graphics](https://i.sstatic.net/qMgQ0.png) (The black dot just marks the point (0, 0) in the barcode's internal reference frame; it is not part of the barcode.) I defined a `barcode` function that, for any integer argument, generates a (random-but-reproducible) "barcode" like the one above. Now, if I substitute such graphic labels for the text ones in the barchart, this is what I get: In[124]:= With[ { labels = Table[Graphics[barcode[i]], {i, Length[data]}] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ] , FrameStyle -> Thin ] ] ![Mathematica graphics](https://i.sstatic.net/UPqro.png) Not great. For one thing, the barcodes come out too big, and too far from the vertical axis. But most seriously, the size of the barcodes does not change when `ImageSize` changes. For example, if `ImageSize` is changed from 250 to 500, the result looks like this: ![Mathematica graphics](https://i.sstatic.net/1dX5K.png) Confusingly enough, even though the size of the barcodes remains constant, the spacing *between* them changes in proportion to the change in `ImageSize`. --- I'm looking for a way to set the size of the barcodes so that 1. the height of the barcode corresponds to 1 plot unit (or slightly less), *while preserving the barcode's original aspect ratio*; 2. the spacing between the barcodes and the (vertical) axis matches that between text labels and the axis; 3. both the size of the barcode and the spacing between one barcode and the next one, and between the barcodes and axis *scale with the image*. With enough trial-and-error, I can find a "solution" that meets requirements (1) and (2), but I have not been able to find one that *also* meets requirement (3). The next section includes all the code referenced above; the last section documents some failed attempts at solving the problem. --- Code --- nItems = 10; data = BlockRandom[SeedRandom[-1]; 20 + RandomInteger[80, nItems] ]; With[{ labels = BlockRandom[SeedRandom[-2]; RandomSample[DictionaryLookup[{"English", ___}], nItems] ] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ] , FrameStyle -> Thin ] ] palette = ColorData[1, "ColorList"]; basewidth = 0.5; baseheight = 1; nstrips = 8; baserect = Rectangle[{0, 0}, {basewidth, baseheight}]; barcode[index_] := BlockRandom[ SeedRandom[index]; Module[{colors = RandomSample[palette, nstrips]}, Table[Translate[{colors[[i]], baserect}, {(i - nstrips - 1) basewidth, -0.5 baseheight}], {i, nstrips}] ] ] Graphics[{barcode[1], Disk[{0, 0}, 0.05]}, Frame -> True, ImageSize -> Medium] With[{ labels = Table[Graphics[barcode[i]], {i, Length[data]}] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ] , FrameStyle -> Thin ] ] With[{ labels = Table[Graphics[barcode[i]], {i, Length[data]}] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 500 ] , FrameStyle -> Thin ] ] --- Failures --- **Using `Scaled`** Block[{baserect = Rectangle[Scaled[{0, 0}], Scaled[{basewidth, baseheight}]]}, With[{ labels = Table[Graphics[barcode[i]], {i, Length[data]}] }, Framed[ BarChart[data, ChartLabels -> labels , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ] , FrameStyle -> Thin ] ] ] ![Mathematica graphics](https://i.sstatic.net/iKldg.png) - swatches within barcode overlap - overall scaling is wrong - positioning is wrong **Drawing labels in plot-space** With[{ labels = Table[Graphics[Translate[barcode[i], {0, i}]], {i, Length[data]}] }, Framed[ Show[{ BarChart[data, ChartLabels -> None , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 ], labels } ] , FrameStyle -> Thin ] ] ![Mathematica graphics](https://i.sstatic.net/B44Cy.png) - aspect ratio is wrong **Using `Inset`** With[{ labels = Graphics[Table[Translate[barcode[i], {0, i}], {i, Length[data]}]] }, Framed[ BarChart[data, ChartLabels -> None , ChartStyle -> LightGray , BarOrigin -> Left , ImageSize -> 250 , ImagePadding -> {{50, Automatic}, {120, Automatic}} , Epilog -> Inset[labels, {0, 0}] ] , FrameStyle -> Thin ] ] ![Mathematica graphics](https://i.sstatic.net/sEGWL.png) - overall scaling is wrong