将列转换为分类类型并设置一些美学属性(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()
绘制此内容