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?
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.
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()
(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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With