Search code examples
pythonseabornboxplotsubplothistplot

The color is not matching between two subplots & legend order


I'm struggling with two small formatting issues with my Seaborn boxplot and histogram (plotted as subplots).

  1. The colors between the two subplots are slightly different even though the coded colors are exactly the same.
  2. I'm trying to rearrange the order of the legend so 'Group A' appears above 'Group B'
groupA = [94, 74, 65, 36, 32, 65, 56, 59, 24, 133, 16, 8, 18]
groupB = [1, 1, 1, 1, 2, 7, 7, 10, 15, 16, 17, 17, 19, 29, 31, 32, 43, 43, 44, 47, 56, 64, 64, 80, 81, 87, 103, 121, 121, 121, 187, 197, 236, 292, 319, 8, 12, 12, 14, 14, 15, 16, 16, 20, 20, 33, 36, 37, 37, 44, 46, 48, 51, 51, 54, 57, 72, 74, 95, 103, 103, 107, 134, 199, 216, 228, 254]
f, (ax_boxplot, ax_histogram) = plt.subplots(2, sharex=True, gridspec_kw={'height_ratios': (0.3,0.7)}, figsize=(10,10))
sns.boxplot(data=[groupA, groupB], ax=ax_boxplot, orient='h', palette=['green', 'silver'])
ax_boxplot.tick_params(axis='y', left=False, labelleft=False)
sns.histplot(data=[groupA, groupB], bins=34, binrange=(0,340), palette=['green', 'silver'], alpha=1, edgecolor='black')
ax_histogram.tick_params(axis='both', labelsize=18)
ax_histogram.legend(labels=['groupB', 'groupA'], fontsize=16, frameon=False)
plt.xlabel("Days", fontsize=24, labelpad=20)
plt.ylabel("Count", fontsize=24, labelpad=20)
sns.despine()

What I have tried so far:

  • For the colors: I tried setting the alpha to 1 in the histogram, but there still seems to be a slight difference.
  • For the legend: Tried playing around with hue_order and handles, but didn't have any luck getting that to work.

Image of histogram and boxplot subplots


Solution

  • Try using saturation=1 in your call to boxplot. Unless specified, saturation is equal to 0.75.

    The documentation says:

    saturation float, optional

    Proportion of the original saturation to draw colors at. Large patches often look better with slightly desaturated colors, but set this to 1 if you want the plot colors to perfectly match the input color.