【发布时间】:2013-07-12 17:46:50
【问题描述】:
我在 Python 中有一个 R 数据框对象,使用 Rpy2,如下所示:
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”)的顺序显示“名称”的值。我对上一个的印象。帖子是这是因为coord_flip() 翻转了订单。如何更改 bars 顺序(不是图例顺序)以匹配当前图例,在每个躲避的条组中首先绘制红色条?谢谢。
编辑:*
在 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])。对此有什么想法?
【问题讨论】:
-
ggplot2 的
guides不是由模块rpy2.robjects.lib.ggplot2自定义映射的(guides是相对较新的,我错过了它的介绍,直到现在没有人抱怨)。同时,尝试使用ggplot2.ggplot2.guides()修改您的代码。