在geom_density中使用分类列时出错



将列转换为分类类型并设置一些美学属性(aes(((以使用它时,我收到以下错误:

NotImplementedError: isna is not defined for MultiIndex

例如,下面是一个可重现的示例:

randCat = np.random.randint(0,2,500)
randProj = np.random.rand(1,500)
df = pd.DataFrame({'proj': np.ravel(randProj),'cat': np.ravel(randCat)})
df['cat'] = df['cat'].map({0:'firstCat', 1:'secondCat'}) 

df['cat'] = df['cat'].astype('category')
g = ggplot(aes(x='proj', color='cat',fill='cat'), data=df) + geom_density(alpha=0.7)
print(g)

我正在使用pandas version 0.22.0. 而ggplot 0.11.5

有趣的是,当我没有将"cond"列设置为"分类"类型(保留为字符串(时,情节很好。但是,出于不同的目的,我需要此列进行分类。

更完整的错误跟踪:

54     # hack (for now) because MI registers as ndarray
55     elif isinstance(obj, ABCMultiIndex):
---> 56         raise NotImplementedError("isna is not defined for MultiIndex")
57     elif isinstance(obj, (ABCSeries, np.ndarray, ABCIndexClass)):
58         return _isna_ndarraylike(obj)

NotImplementError: isna 未为 MultiIndex 定义

谢谢 埃亚尔。

这可能是导致 ggplot 与熊猫组合失败的边缘情况。

查看 ggplot 的源代码,我们在ggploy.py: _construct_plot_data末尾发现:

groups = [column for _, column in discrete_aes]
if groups:
return mappers, data.groupby(groups)
else:
return mappers, [(0, data)]

所以我的猜测是,该类别用于分组,这会导致熊猫断裂。

尝试投射到object而不是category,如果是geom_density,请删除fill='cat',因为这会导致线条和图例呈现两次:

randCat = np.random.randint(0,2,500)
randProj = np.random.rand(1,500)
df = pd.DataFrame({'proj': np.ravel(randProj),'cat': np.ravel(randCat)})
df['cat'] = df['cat'].map({0:'firstCat', 1:'secondCat'}) 
df['cat'] = df['cat'].astype('object')
g = ggplot(aes(x='proj', color='cat'), data=df) + geom_density(alpha=0.7)
print(g)

另请参阅 http://ggplot.yhathq.com/how-it-works.html 和 http://ggplot.yhathq.com/docs/geom_density.html

我使用seaborn包克服了"填充"问题。

import matplotlib.pyplot as plt
import seaborn as sns
sns.kdeplot(df[df['cat'] == 'firstCat']['proj'], shade=True, label='firstCat')
sns.kdeplot(df[df['cat'] == 'secondCat']['proj'], shade=True, label='secondCat')
plt.show()

绘制此内容

最新更新