Reputation: 169
My boxplot seem not align with the x-tick of the plot. How to make the boxplot align with the x-tick?
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame([['0', 0.3],['1', 0.5],['2', 0.9],
['0', 0.8],['1', 0.3],['2', 0.4],
['0', 0.4],['1', 0.0],['2', 0.7]])
df.columns = ['label', 'score']
label_list = ['0', '1', '2']
fig = plt.figure(figsize=(8, 5))
g=sns.boxplot(x='label', y='score', data=df, hue='label', hue_order=label_list)
g.legend_.remove()
plt.show()
Upvotes: 8
Views: 4989
Reputation: 62403
hue='label', hue_order=label_list
. That is responsible for shifting the boxes.
sns.catplot
and associated axes-level categorical plots.hue
should be used to encode a different set of categories, not to encode the same category, 'label'
, multiple times.
'label'
category is already encoded on the x-axis. Likewise, there doesn't need to be a legend, because the information is already encoded on the x-axis.ggplot
, and seaborn
, may encode every category on the x-axis with a color, it's better to avoid unnecessary usage of color.hue
ax = sns.boxplot(data=df, x='label', y='score')
_ = ax.set(title='Default Plot\nUnnecessary Use of Color')
ax = sns.boxplot(data=df, x='label', y='score', color='tab:blue')
_ = ax.set(title='Avoid Unnecessary Use of Color')
order
parameter.
order=['0', '1', '2']
or order=label_list
df
column to a category Dtype
with pd.Categorical
df.label = pd.Categorical(values=df.label, categories=label_list, ordered=True)
Upvotes: 0
Reputation: 8033
You can add dodge=False
into your boxplot
line & that should fix this.
That updated code would be as below
g=sns.boxplot(x='label', y='score', data=df, hue='label', hue_order=label_list, dodge=False)
You can then play with width
to control the width (default width is 0.8) of box plots like below
g=sns.boxplot(x='label', y='score', data=df, hue='label', hue_order=label_list, dodge=False, width=.2)
Upvotes: 14