FacetGrid
对象包含一组轴(一个形状为网格的numpy数组)。您可以手动在数组中的每个轴上设置轴限制。不过,这需要大量迭代/后处理。以下是一个快速示例。
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()
然而,如果您不介意跳过 seaborn
直接使用 matplotlib
,您可以使用一个 GridSpec
对象来代替 FacetGrid。在这个示例中可以看到。然后,您可以明确指定共享哪些轴。
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()
在这个例子中,我们在行之间共享x轴(每个
i % 5 == 0 )。由于GridSpec对象只是一个轴的numpy数组,因此我们可以以任何方便的顺序初始化它们并根据需要共享轴。使用
GridSpec
,您有更多的自定义选项,但是
seaborn
的许多好处(色调等)都必须手动编码。
FacetGrid
这么容易,我想避免涉及到那个...不管怎样,还是谢谢! :) - mgab