Elliot
Elliot

Reputation: 2690

How to set seaborn styles on existing matplotlib axes

I'm trying to use seaborn to set axes properties for a (potentially large) number of matplotlib subfigures. What I would like to be able to do is generate all the plots with a single call to plt.subplots, and then set the subplot style when each actual plot is generated. Unfortunately it seems that the sns style only matters when the subplot is generated.

The code below is a minimum (non)working example. Ideally the two subfigures would have two different styles, but they do not.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

def makeplt(sub, dat):
    sub.contour(dat)

def makepltwith(sub, dat, style):
    with sns.axes_style(style) as sty:
        sub.contour(dat)

dat = np.arange(100).reshape(10, 10)
with sns.axes_style('ticks'):
    fig, subs = plt.subplots(ncols=2)
makeplt(subs[0], dat)
makepltwith(subs[1], dat, 'darkgrid')
plt.show()

Is there a way to ensure that the second plot has the formatting I want it to have? The best idea I have on my own is to make some use of the sty object to manually reformat the sub object, but I can't come up with a pithy way of running through the formatting.

seaborn.__version__=0.7, matplotlib.__version__=1.5 if that matters.

Upvotes: 3

Views: 2114

Answers (2)

Peter9192
Peter9192

Reputation: 3109

I encountered a similar problem and solved it like this:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def add_sp_default(fig,pos):
    ax = fig.add_subplot(pos)
    return ax

def add_sp_image(fig,pos):
    ax = fig.add_subplot(pos)
    img=mpimg.imread('http://static.wixstatic.com/media/4afb41_998a1c7c0835c6eae5e159be3c2cfc07.png_1024')
    ax.imshow(img)
    ax.set_axis_off()
    return ax

def add_sp_polar(fig,pos):
    ax = fig.add_subplot(pos,projection='polar')
    return ax

def add_sp_xkcd(fig,pos):
    with plt.xkcd():
        ax = fig.add_subplot(pos)
    return ax

fig = plt.figure(figsize=(10,7))
ax1 = add_sp_default(fig,221)
ax2 = add_sp_image(fig,222)
ax3 = add_sp_polar(fig,223)
ax4 = add_sp_xkcd(fig,224)

plt.show()

The output

Upvotes: 1

mwaskom
mwaskom

Reputation: 49032

No, it is not possible to do that. Axes styles are applied when the axes is created.

Of course, there are other ways to set up the subplots that don't involve making them all in one line of code, which would be more amenable to subplot-specific styles.

Upvotes: 0

Related Questions