jay
jay

Reputation: 1463

Change legend location and labels in Seaborn scatter plot

I am tying to change the location as well as labels of my legend in Seaborn scatterplot. Here is my code:

ax_total_message_ratio=sns.scatterplot(x='total_messages', y='email_messages_ratio',hue='poi',data=df_new)
ax_total_message_ratio.set_title("Email Messages Ratio vs. Total Messages Across Poi",y=1.12,fontsize=20,fontweight='bold')
ax_total_message_ratio.set_ylabel('Email Messages Ratio')
ax_total_message_ratio.set_xlabel('Total Messages')
ax_total_message_ratio.legend.loc("lower right")
put.show()

enter image description here But I am getting following error message; 'function' object has no attribute 'loc'. Can I get some help on how to control legends with Seaborn? Additionally, I also need to replace 0 by No and 1 by Yes in the legend labels. Thanks

Upvotes: 7

Views: 22335

Answers (2)

fotis j
fotis j

Reputation: 487

You can use the convenience method get_legend_handles_labels() to get the handles and the text of the labels:

ax=sns.scatterplot(x='total_messages', y='email_messages_ratio',hue='poi',data=df_new)

handles, labels  =  ax.get_legend_handles_labels()

ax.legend(handles, ['Yes', 'No'], loc='lower right')

Upvotes: 12

William Miller
William Miller

Reputation: 10328

You can adjust the position using the loc keyword in calling legend(), like

ax_total_message_ratio.legend(loc="lower right")

To include custom labels for your markers you can create a custom legend, i.e.

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

custom = [Line2D([], [], marker='.', color='b', linestyle='None'),
          Line2D([], [], marker='.', color='r', linestyle='None')]

fig = plt.figure(figsize=(8,5))

plt.legend(custom, ['Yes', 'No'], loc='lower right')
plt.show()

This will give you

Sample plot with custom legend

and should remove the automatically generated legend, leaving only the custom legend.

Upvotes: 7

Related Questions