seaborn
的 FacetGrid
创建了一个子网格,允许您探索数据集中的条件关系。
该函数接受的两个关键字参数是sharex
和sharey
,根据文档:
分享{x,y} :bool,可选
如果为true,则facet将跨行和/或x轴跨行共享y轴。
但我没有看到任何其他方法来控制facets / subplots共享轴的方式。所以来了......
有没有办法跨行和/或y轴跨行共享x轴?
我正在尝试获得不同条件(列和色调)的不同数量(行数)的密度图。因此,我希望我的子图可以跨行共享x轴和y轴,但不能跨列链接。
答案 0 :(得分:12)
没有正确记录,但这些参数会直接传递到plt.subplots
,这样您就可以将这些参数的值设置为"row"
或"col"
,以便轴只在行或列中共享,而不是在整个网格中共享。
我不确定我到底想要你的情节看起来如何,但我认为你可以这样做:
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="smoker", row="time", sharey="col")
g.map(plt.hist, "total_bill")
也就是说,一般来说,我会尝试在整个网格上共享轴(即,将图表结构化为跨行而不是跨列共享y轴)以简化视觉比较。
答案 1 :(得分:1)
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,如示例{{ 3}}。然后,您可以具体指定共享哪些轴。
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()
在此示例中,我们跨行(每个i % 5 == 0
)共享x轴。由于GridSpec对象只是一个numpy轴的数组,我们可以按任何方便的顺序初始化它们并按照我们的意愿共享轴。使用GridSpec
,您可以进行更多自定义,但seaborn
(色调等)的许多优点都必须手动编码。