2016-02-01 41 views
3

我試圖使用seaborn來設置(可能很大)matplotlib子圖的軸屬性。我希望能夠做的是通過一次調用plt.subplots生成所有圖,然後在生成每個實際圖時設置子圖樣式。不幸的是,似乎只有在生成子圖時,sns樣式纔是重要的。如何在現有的matplotlib軸上設置seaborn樣式

以下代碼是最小(非)工作示例。理想情況下,兩個子圖有兩種不同的樣式,但它們不是。

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() 

有沒有辦法確保第二個圖有我想要的格式?我自己的最好想法是使用sty對象來手動重新格式化sub對象,但我無法想出一種運行格式的精闢方法。

seaborn.__version__=0.7, matplotlib.__version__=1.5如果有關係。

回答

0

不,這是不可能的。軸創建時應用軸樣式。

當然,還有其他方法可以設置子曲線圖,這些子曲線圖不需要在一行代碼中完成,而這些代碼將更適合特定於子圖的樣式。

1

我遇到了類似的問題,解決它像這樣:

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

相關問題