Seaborn非常适合根据对每个构面类别进行编码的分类变量创建构面图.但是,这假设您的类别是互斥的.是否可以基于一组指标变量来创建Seaborn FacetGrid(或类似模型)?
举一个具体的例子,考虑比较被一种或多种病毒感染的患者,并按病毒绘制感兴趣的属性.患者可能携带多种病毒,因此不可能创建病毒栏来创建网格.但是,您可以创建一组指标变量(每种病毒一个),为每个患者标记该病毒.似乎没有将一组指标变量传递给任何Seaborn函数的方法.
我无法想象我是遇到这种情况的第一人,所以我希望有一些建议,而不需要在Matploltlib中手动编码.
解决方法:
我看不到如何使用FacetGrid进行此操作,可能是因为这并未对数据进行分面处理,因为数据记录可能在图中显示多次或仅出现一次.一组位域的标准技巧之一是将它们读取为二进制,因此您会看到位的每种组合.这是明确的,但会造成混乱:
import pandas as pd
import seaborn as sns
from numpy.random import random, randint
from numpy import concatenate
import matplotlib.pyplot as plt
# Dummy data
vdata = pd.DataFrame(concatenate((randint(2, size=(32,4)), random(size=(32,2))), axis=1))
vdata.columns=['Species','v1','v2','v3','x','y']
binary_v = vdata.v1 + vdata.v2*2 + vdata.v3*4
# Making a binary number out of the "virusX?" fields
pd.concat((vdata, binary_v), axis=1)
vdata = pd.concat((vdata, binary_v), axis=1)
vdata.columns=['Species','v1','v2','v3','x','y','binary_v']
# Plotting group membership by row
#g = sns.FacetGrid(vdata, col="Species", row='binary_v')
#g.map(plt.scatter, "x", "y")
#g.add_legend()
#plt.savefig('multiple_facet_binary_row') # Unreadably big.
h = sns.FacetGrid(vdata, col="Species", hue="binary_v")
h.map(plt.scatter, "x","y")
h.add_legend()
plt.savefig('multiple_facet_binary_hue')
如果您有太多指标无法应对组合爆炸,请明确使新子集起作用:
# Nope, need to pull out subsets:
bdata = vdata[vdata.v1 + vdata.v2 + vdata.v3 ==0.]
assert(len(bdata) > 0) # ... catch...
bdata['Virus'] = pd.Series(['none']*len(bdata), index=bdata.index)
for i in ['v1','v2','v3']:
on = vdata[vdata[i]==1.]
on['Virus'] = pd.Series([i]*len(on), index=on.index)
bdata = bdata.append(on)
j = sns.FacetGrid(bdata, col='Species', row='Virus')
j.map(plt.scatter, 'x', 'y')
j.add_legend()
j.savefig('multiple_facet_refish')