我在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]
),与图例无关。这个想法?
答案 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))
基本上,我只是颠倒了因素水平,并颠倒了传奇顺序。卷曲,但它看起来像你描述的。 (另外,你确实想要stat = "identity"
,对吧?)