When plotting a swarm plot (seaborn) over a box plot, the points may cover the median line of a box plot. How can I do the swarm plots dots a bit more transparent so that I also see the median of a box plot?
On the plot we do not see the median line because it is covered by the dot, so, optically I do not know where the median is on the second box. Is it possible to do the points of the swarm plot more transparent so that I also see the median line?
Example:
fig, axes = plt.subplots(nrows=1, ncols=1,figsize=(6,2))
data = pd.DataFrame({'a':[3,3,3,3,4,5,6,8,11,11,8,7,7,7,7,7,7,3,3,3,3,3,7,7,7,7,7,7,7,7,7,7,7,8,9,10,11,12,11,11,11]})
sns.boxplot(x='a',data=data, ax = axes)
ax = sns.swarmplot(x='a', data=data, color = 'grey', ax = axes)
(Making a larger figure is not an option)
Two options come directly to my mind:
Make the swarmplot translucent. This can be done by adding the alpha
argument, e.g. alpha=0.5
for half-transparent. Of course the darker the bar in the background, the less visible the points are (hence I made it yellow here).
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
fig, axes = plt.subplots(figsize=(6,2))
data = pd.DataFrame({'a':[3,3,3,3,4,5,6,8,11,11,8,7,7,7,7,7,7,3,3,
3,3,3,7,7,7,7,7,7,7,7,7,7,7,8,9,10,11,12,11,11,11]})
sns.boxplot(x='a',data=data, ax = axes, color="gold")
sns.swarmplot(x='a', data=data, color = 'grey', ax = axes, alpha=0.5)
plt.show()
Show the median line on top of the swarmplot points. This can be done by specifying the zorder
of the medianline via a dictionary passed through the medianprops
keyword argument.
sns.boxplot(x='a',data=data, ax = axes, color="gold", medianprops={"zorder":3})
In this case, making the median line half-transparent via medianprops={"zorder":3, "alpha":0.6}
is equally possible.
Of course any combination of the two options can help as well.