How to move or remove the legend from a seaborn JointGrid or jointplot
Question:
How to remove the legend in the seaborn.JoingGrid
plot?
The reference code is like below:
import matplotlib.pyplot as plt
import seaborn as sns
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
plt.show()
I have tried to use the following methods that are known to work on the other seaborn plots, but failed on the jointplot:
plt.legend([],[], frameon=False)
g._legend.remove()
Answers:
- To remove the legend, the correct part of the
sns.JointGrid
must be accessed.
- In this case
g.ax_joint
is where the legend is located.
- As stated in a comment by mwaskom, Matplotlib axes have
.legend
(a method that creates a legend) and .legend_
(the resulting object). Don’t access variables that start with an underscore (_legend), because it indicates that they are private.
- Tested in
python 3.10
, matplotlib 3.5.1
, seaborn 0.11.2
sns.JointGrid
import seaborn as sns
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
# remove the legend from ax_joint
g.ax_joint.legend_.remove()
- Moving the
JointGrid
legend can be done with sns.move_legend
, as shown in this answer.
- This also requires using
g.ax_joint
.
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
# move the legend in ax_joint
sns.move_legend(g.ax_joint, "lower right", title='Species', frameon=False)
With sns.jointplot
g.ax_joint.legend_.remove()
can be used, but removing the legend is more easily accomplished by passing legend=False
to the plot: sns.jointplot(..., legend=False)
.
g.ax_joint.
is still required to move the legend.
penguins = sns.load_dataset("penguins")
g = sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
# remove the legend
g.ax_joint.legend_.remove()
# or
# move the legend
# sns.move_legend(g.ax_joint, "lower right", title='Species', frameon=False)
How to remove the legend in the seaborn.JoingGrid
plot?
The reference code is like below:
import matplotlib.pyplot as plt
import seaborn as sns
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
plt.show()
I have tried to use the following methods that are known to work on the other seaborn plots, but failed on the jointplot:
plt.legend([],[], frameon=False)
g._legend.remove()
- To remove the legend, the correct part of the
sns.JointGrid
must be accessed.- In this case
g.ax_joint
is where the legend is located.
- In this case
- As stated in a comment by mwaskom, Matplotlib axes have
.legend
(a method that creates a legend) and.legend_
(the resulting object). Don’t access variables that start with an underscore (_legend), because it indicates that they are private. - Tested in
python 3.10
,matplotlib 3.5.1
,seaborn 0.11.2
sns.JointGrid
import seaborn as sns
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
# remove the legend from ax_joint
g.ax_joint.legend_.remove()
- Moving the
JointGrid
legend can be done withsns.move_legend
, as shown in this answer.- This also requires using
g.ax_joint
.
- This also requires using
penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
g.plot_joint(sns.scatterplot)
sns.boxplot(data=penguins, x=g.hue, y=g.y, ax=g.ax_marg_y)
sns.boxplot(data=penguins, y=g.hue, x=g.x, ax=g.ax_marg_x)
# move the legend in ax_joint
sns.move_legend(g.ax_joint, "lower right", title='Species', frameon=False)
With sns.jointplot
g.ax_joint.legend_.remove()
can be used, but removing the legend is more easily accomplished by passinglegend=False
to the plot:sns.jointplot(..., legend=False)
.g.ax_joint.
is still required to move the legend.
penguins = sns.load_dataset("penguins")
g = sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
# remove the legend
g.ax_joint.legend_.remove()
# or
# move the legend
# sns.move_legend(g.ax_joint, "lower right", title='Species', frameon=False)