<p><code>FacetGrid</code>对象包含一个轴集合(网格形状的numpy数组)。可以在阵列中的每个轴上手动设置轴限制。不过,这需要大量的迭代/后处理。下面是一个简单的例子。</p>
<pre><code>import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt
data = pd.DataFrame({'a':np.random.random(1000),
'b':np.random.random(1000),
'c':np.random.random_integers(0,3,1000),
'x':np.random.random_integers(1,5,1000),
'y':np.random.random_integers(1,5,1000)})
g = sns.FacetGrid(data=data, col='x', row='y', hue='c', sharex=False, sharey=False)
g.map(plt.scatter, 'a', 'b').add_legend()
for axlist in g.axes:
for ax in axlist:
ax.set_ylim(.2,.3)
break
print(type(g.axes))
plt.show()
</code></pre>
<p>但是,如果您不介意跳过<code>seaborn</code>并直接在<code>matplotlib</code>中工作,则可以使用<code>GridSpec</code>对象而不是FacetGrid,如示例<a href="https://stackoverflow.com/questions/22511550/gridspec-with-shared-axes-in-python">here</a>所示。然后可以指定共享的轴。</p>
<pre><code>import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec
data = pd.DataFrame({'a':np.random.random(1000),
'b':np.random.random(1000),
'c':np.random.random_integers(0,3,1000),
'x':np.random.random_integers(1,5,1000),
'y':np.random.random_integers(1,5,1000)})
colors = ['b', 'r', 'g', 'y']
fig = plt.figure(figsize=(6,6))
gs = gridspec.GridSpec(len(data['x'].unique()),len(data['y'].unique()))
g = data.groupby(['x','y'])
for i, (ind, grp) in enumerate(g):
if i % 5 == 0:
ax = fig.add_subplot(gs[i])
else:
ax2 = fig.add_subplot(gs[i], sharex = ax)
plt.setp(ax2.get_yticklabels(), visible=False)
subgroups = grp.groupby('c')
for index, sub in subgroups:
plt.scatter(sub['a'], sub['b'], color=colors[index])
plt.show()
</code></pre>
<p>在本例中,我们跨行共享x轴(每个<code>i % 5 == 0</code>)。由于GridSpec对象只是一个轴的numpy数组,我们可以按照任何方便的顺序初始化它们,并根据需要共享轴。有了<code>GridSpec</code>,您可以进行更多的定制,但是<code>seaborn</code>(色调等)的许多漂亮部分都必须手动编码。</p>