Using `RectangleChart` with a custom `ChartElementFunction`: ClearAll[mainEffectsChart, cEF, preProcess] cEF = {AbsolutePointSize[10], Point[{Mean @ #[[1]], #[[2, 2]]}], GrayLevel[.4], Text[Style[#3[[1, 1]], 11], Offset[{0, -5}, {Mean[#[[1]]], #3[[1, 2]]}], {0, 1}], Line[Table[ Offset[{0, i}, {Mean[#[[1]]], #3[[1, 2]]}], {i, 0, 7}]]} &; preProcess = Module[{min = Min@# - .1 Abs[Subtract@@#] & @ MinMax[#[[All, All, -1]]]}, Module[{ll = Length @ #}, Rule[{1/ll, #2}, {#, min}] & @@@ #] & /@ #] &; mainEffectsChart = Module[{data = #, colors = ColorData[97] /@ Range[Length@#], labels = #2, means = #[[All, All, -1]], gl = 3/2 Range[Length@# - 1], yrange = (# + {-.1, .1} Abs[Subtract @@ #]) & @ MinMax@#[[All, All, -1]]}, ReplaceAll[l_Line :> {Thick, Last[colors = RotateLeft[colors]], l}]@ RectangleChart[preProcess @ data, Joined -> {{Mean@#[[1]], #[[2, 2]]} &}, Frame -> True, ChartStyle -> {colors, None}, GridLines -> {gl, {{Mean@Flatten@means, Dashed}}}, BarSpacing -> {0, .5}, PlotRange -> {{0, 3/2 Length@data}, yrange}, ImagePadding -> {{Automatic, Automatic}, {Scaled[.05], Automatic}}, PlotRangePadding -> 0, FrameTicks -> {{Automatic, All}, {Automatic, Thread[{3/4 + Prepend[gl, 0], labels, 0}]}}, ChartElementFunction -> cEF, ##3]] &; ***Examples:*** data = {Bucket, Nozzle, NzD}; labels = Style[#, 16] & /@ {"Bucket", "Nozzle", "NzD"}; mainEffectsChart[data, labels, ImageSize -> Large, FrameLabel -> {None, Style["Mean of means", 16]}, PlotLabel -> Style["Main Effects Plot", 20]] [![enter image description here][1]][1] SeedRandom[1] data3 = SortBy[First]@RandomInteger[100, {#, 2}] & /@ {3, 3, 5, 2, 4}; labels3 = Style[#, 16] & /@ RandomWord["Noun", 5]; mainEffectsChart[data3, labels3, ImageSize -> Large, FrameLabel -> {None, Style["Mean of means", 16]}, PlotLabel -> Style["Main Effects Plot", 20], ChartLegends -> LineLegend[labels3, LegendMarkers -> {"●", 12}]] [![enter image description here][2]][2] [1]: https://i.sstatic.net/XK47E.png [2]: https://i.sstatic.net/C7k9N.png