使用Python中的Rpy2在翻转坐标上排序ggplot2条形图

时间:2013-07-14 22:35:39

标签: python r ggplot2 rpy2

我在Python中有一个使用Rpy2的R数据帧对象,如下所示:

cat name num
1   a  bob   1
2   b  bob   2
3   a mary   3
4   b mary   4

我想将其绘制为带有翻转坐标的geom_bar,并且条形的顺序与图例的顺序相匹配(不更改图例)。这已经在这里和其他邮件列表中被问到了,但我仍然坚持如何将R订购代码翻译成rpy2。这是我目前的代码:

# attempting to reorder bars so that value 'a' of cat is first (in red)
# and value 'b' of cat is second (in green)
labels = tuple(["a", "b"])
labels = robj.StrVector(labels)
variable_i = r_df.names.index("cat")
r_df[variable_i] = robj.FactorVector(r_df[variable_i],
                                     levels=labels)
r.pdf("test.pdf"))
p = ggplot2.ggplot(r_df) + \
    ggplot2.geom_bar(aes_string(x="name",
                                y="num",
                                fill="cat"),
                     position=ggplot2.position_dodge(width=0.5)) + \
    ggplot2.coord_flip()
p.plot()

这给出了一个具有正确图例的图形('a'首先是红色,'b'是绿色的第二个)但是条形显示为绿色/红色('b','a')的顺序'name'的价值。我对prev的印象。帖子是因为coord_flip()翻转了订单。如何更改条形顺序(不是图例顺序)以匹配当前图例,在每个躲避条形图组中首先绘制红条?感谢。

修改:*

在rpy2中尝试了@joran的解决方案:

labels = tuple(["a", "b"])
labels = robj.StrVector(labels[::-1])
variable_i = r_df.names.index("cat")
r_df[variable_i] = robj.FactorVector(r_df[variable_i],
                                     levels=labels)
p = ggplot2.ggplot(r_df) + \
    ggplot2.geom_bar(aes_string(x="name",
                                y="num",
                                fill="cat"),
                     stat="identity",
                     position=ggplot2.position_dodge()) + \
    ggplot2.scale_fill_manual(values = np.array(['blue','red'])) + \
    ggplot2.guides(fill=ggplot2.guide_legend(reverse=True)) + \
    ggplot2.coord_flip() 
p.plot()

这不起作用,因为找不到ggplot2.guides,但这仅用于设置图例。我的问题是:scale_fill_manual为什么必要?我不想指定我自己的颜色,我想要默认的ggplot2颜色,但我只想将排序设置为特定的方式。有意义的是,使用coord_flip我需要一个反向排序,但这不足以明显重新排序条形图(请参阅我的labels[::-1]),与图例无关。这个想法?

1 个答案:

答案 0 :(得分:2)

我很抱歉我的机器上没有rpy设置,但我能用这个R / ggplot2代码得到我认为你所描述的内容:

dat$cat <- factor(dat$cat,levels = c('b','a'))

ggplot(dat,aes(x = name,y = num, fill = cat)) + 
    geom_bar(stat = "identity",position = "dodge") + 
    coord_flip() + 
    scale_fill_manual(values = c('blue','red')) +
    guides(fill = guide_legend(reverse = TRUE))

enter image description here

基本上,我只是颠倒了因素水平,并颠倒了传奇顺序。卷曲,但它看起来像你描述的。 (另外,你确实想要stat = "identity",对吧?)