This is an interesting data set to try to represent graphically, partly because it's not really categorical. Both 3-level factors are ordinal and there is possible interplay between them (presumably, it's harder for a mild
baseline
to have substantial
improvement
-- or maybe substantial
improvement
means something different for each baseline
).
With multiple variables, there isn't usually a single view that shows all the features you might care about. Some factors will be easier to compare than others. I think your original view is good and would be better with Nick Cox's suggestions: removing duplicate legends and using an ordinal color scale.
If you're most interesting in seeing the difference between treatments, you can emphasize the change by using a stacked area plot instead of stacked bars.
I'm usually wary of stacking in general because it's harder to read the middle values, but it does re-enforce the fixed-sum nature of this data. And it makes it easy to read the sum moderate
+substantial
if that's relevant. I've flipped the order of the improvement
levels so that higher is better for the frequency.
Without stacking, the equivalent is a slope graph.
It's easier to read each level, but harder to understand the interplay. You have to keep in mind that the third line is directly dependent on the other two.
Given the ordinal nature of the data, it may be helpful to convert the improvement
value into a numeric score, as is often done with Likert data. For instance, none=0
, moderate=1
, substantial=2
. Then you can graph that variable on a continuous scale. The downside is that you have to find a reasonable scoring (e.g., maybe 0, 1 and 5 would be a truer representation).
Colophon: These plots were made with the Graph Builder feature in the software package JMP (which I help develop). Though made interactively, a script, for instance, for the area plot, without the coloring customizations, is:
Graph Builder(
Graph Spacing( 15 ),
Variables( X( :treatment ), Y( :frequency ),
Group X( :baseline ), Overlay( :improvement )
),
Elements( Area( X, Y ) )
);