2

我想为一个索引级别制作堆叠条形图,而另一个保持未堆叠。下面的代码为每个索引行创建元组:

from pandas import DataFrame, MultiIndex
from numpy import repeat
from numpy.random import randn
arrays = [repeat('a b'.split(),2),[True,False,True,False]]
midx = MultiIndex.from_tuples(zip(*arrays), names=['letters','bool'])
df = DataFrame(randn(4,2)**2+5, index=midx)
df.plot(kind='bar', stacked=True)
plt.legend(loc="center right", bbox_to_anchor=(1.5, 0.5), ncol=2)

在此处输入图像描述 在此处输入图像描述

但我更希望看到 (0,1) 并排分组,就像使用这个 R 代码(在 IPython 中)一样:

%load_ext rmagic
dr = df.stack().reset_index()

接着

%%R -i dr

library(ggplot2)
names(dr) <- c('letters','bool','n','value')

    x <- ggplot() +
      geom_bar(data=dr, aes(y = value, x = letters, fill = bool), 
               stat="identity", position='stack') +
      theme_bw() + 
      facet_grid( ~ n)

print(x)

在此处输入图像描述

现在:有没有办法在pandas中做到这一点,我应该折磨matplotlib ,我应该为 python安装ggplot还是应该使用 Rmagic 在 IPython 中运行ggplot2(就像我刚刚做的那样)?我无法获得rpy2的 ggplot 类

from rpy2.robjects.lib import ggplot2

使用我的布局(还)。

4

1 回答 1

1

如果你有 R 代码,可以逐步移植到 rpy2

import rpy2.robjects as ro

ro.globalenv['dr'] = dr

ro.r("""
library(ggplot2)
names(dr) <- c('letters','bool','n','value')

x <- ggplot() +
  geom_bar(data=dr, aes(y = value, x = letters, fill = bool), 
           stat="identity", position='stack') +
  theme_bw() + 
  facet_grid( ~ n)

print(x)
""")

这样做的缺点是使用了 R 的 GlobalEnv。一个函数可以更优雅。

make_plot = ro.r("""
function(dr) {
  names(dr) <- c('letters','bool','n','value')

  x <- ggplot() +
    geom_bar(data=dr, aes(y = value, x = letters, fill = bool), 
             stat="identity", position='stack') +
    theme_bw() + 
    facet_grid( ~ n)

  print(x)
}""")

make_plot(dr)

另一种方法是在 rpy2 中使用 ggplot2 映射,并在不编写 R 代码的情况下编写此代码:

from rpy2.robjects import Formula
from rpy2.robjects.lib.ggplot2 import ggplot, geom_bar, aes_string, theme_bw, facet_grid

## oddity with names in the examples, that can either be corrected in the Python-pandas
## structure or with an explicit conversion into an R object and renaming there
drr = rpy2.robjects.pandas2ri.pandas2ri(dr)
drr.names[2] = 'n'
drr.names[3] = 'value'

p = ggplot(drr) + \
    geom_bar(aes_string(x="letters", y="value", fill="bool"),
             stat="identity", position="stack") + \
    theme_bw() + \
    facet_grid(Formula('~ n'))

p.plot()
于 2013-10-30T11:22:11.847 回答