Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Customize the axis label in seaborn jointplot

Tags:

I seem to have got stuck at a relatively simple problem but couldn't fix it after searching for last hour and after lot of experimenting.

I have two numpy arrays x and y and I am using seaborn's jointplot to plot them:

sns.jointplot(x, y) 

Now I want to label the xaxis and yaxis as "X-axis label" and "Y-axis label" respectively. If I use plt.xlabel, the labels goes to the marginal distribution. How can I make them appear on the joint axes?

like image 813
Peaceful Avatar asked Mar 02 '18 09:03

Peaceful


People also ask

What is a Jointplot in Seaborn?

jointplot() : Draw a plot of two variables with bivariate and univariate graphs. This function provides a convenient interface to the 'JointGrid' class, with several canned plot kinds. This is intended to be a fairly lightweight wrapper; if you need more flexibility, you should use :class:'JointGrid' directly.


1 Answers

sns.jointplot returns a JointGrid object, which gives you access to the matplotlib axes and you can then manipulate from there.

import seaborn as sns import numpy as np  # example data X = np.random.randn(1000,) Y = 0.2 * np.random.randn(1000) + 0.5  h = sns.jointplot(X, Y)  # JointGrid has a convenience function h.set_axis_labels('x', 'y', fontsize=16)  # or set labels via the axes objects h.ax_joint.set_xlabel('new x label', fontweight='bold')  # also possible to manipulate the histogram plots this way, e.g. h.ax_marg_y.grid('on') # with ugly consequences...  # labels appear outside of plot area, so auto-adjust h.figure.tight_layout()  

seaborn jointplot with custom labels

(The problem with your attempt is that functions such as plt.xlabel("text") operate on the current axis, which is not the central one in sns.jointplot; but the object-oriented interface is more specific as to what it will operate on).

Note that the last command uses the figure attribute of the JointGrid. The initial version of this answer used the simpler - but not object-oriented - approach via the matplotlib.pyplot interface. To use the pyplot interface:

import matplotlib.pyplot as plt plt.tight_layout() 
like image 181
Bonlenfum Avatar answered Oct 11 '22 18:10

Bonlenfum