Search code examples
pythonmatplotlibseabornpairplot

How to use scientific notation in Pairplot


Is there a way to force scientific notation using Seaborn's Pairplot? I'm hoping for some consistency between plots (examples below). I've found suggestions for other seaborn plots, but have not successfully implemented anything with Pairplot.

https://seaborn.pydata.org/generated/seaborn.pairplot.html

Versions:
seaborn 0.8.1
numpy 1.13.1
matplotlib 2.0.2
pandas 0.23.0

Current plot:

import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt

#remove NAs
dfna = df.dropna()

#Correlation function
mean = np.zeros(3)
cov = np.random.uniform(.2, .4, (3, 3))
cov += cov.T
cov[np.diag_indices(3)] = 1

def corrfunc(x, y, **kws):
    r, _ = stats.pearsonr(x, y)
    ax = plt.gca()
    ax.annotate("{:.2f}".format(r),
            xy=(.3, .45), xycoords=ax.transAxes, fontsize = 30)

#2D regression + distribution
p = sns.pairplot(dfna, diag_kind="kde", diag_kws=dict(shade=True, color = "Blue"), plot_kws=dict(s=5, edgecolor="Blue", color = "Blue", linewidth=1))
p.fig.text(0.5, 1.00,'BLAHH', fontsize=30)
p.map_upper(plt.scatter, color = "White", edgecolor = "White")
p.map_upper(corrfunc)
p.fig.text(0.35, -0.04, "xxx", ha ='left', fontsize = 20)
p.fig.text(-0.04, 0.68, "xxx", ha ='left', fontsize = 20, rotation = 90)

#p.savefig('pairplot.svg') 

Unsuccessful attempts to reformat:

  1. plt.ticklabel_format(style = 'sci')
    
  2. import matplotlib.ticker as tkr        
    formatter = tkr.ScalarFormatter(useMathText=True)
    formatter.set_scientific(True)
    p = sns.pairplot(dfna, plot_kws = {'format': formatter})
    

Current: currentplot

Goal: goalplot


Solution

  • You need to apply your formatter to each of the axes created by pairplot. actually, the axes on the edge would be sufficient, but it's easier to apply the same thing to all axes equally. I would do:

    for ax in g.axes.flatten():
        ax.ticklabel_format(style='sci', scilimits=(0,0), axis='both')