【问题标题】:Ordering ggplot2 bars with flipped coordinates using Rpy2 in Python在 Python 中使用 Rpy2 对带有翻转坐标的 ggplot2 条形图进行排序
【发布时间】: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() 修改您的代码。

标签: python r ggplot2 rpy2


【解决方案1】:

很抱歉,我的机器上没有 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",对吧?)

【讨论】:

  • @user248237dfsf guides 抛出类似错误的唯一原因是(a)您安装了相当旧的 ggplot 版本,或者(b)rpy 表现不佳。我只使用了scale_manual,否则你会得到 a 和 b 以相反的顺序映射到默认颜色;显示您想要的方式,但第一个默认颜色映射到 b。如果您不在乎,请忽略它。
  • @jordan:那么为什么只做dat$cat &lt;- factor(dat$cat,levels = c('b','a')) 来扭转酒吧还不够呢?至少 rpy2 等价物不这样做,它需要scale_fill_manual。关于颜色:我可以在不明确说明的情况下反转它们吗?我希望 ggplot 在不输入十六进制颜色或颜色名称的情况下选择颜色
  • @user248237dfsf 我叫乔兰。重新排序级别确实重新排序条形。但正如我之前所说,ggplot 分配其默认颜色的顺序保持不变。所以 b 得到第一个默认颜色, a 得到第二个。
  • 抱歉打错了!通常不会弄乱名字。我想我明白 ggplot 现在在做什么,但仍然无法将您的解决方案转换为 rpy2
  • 将@lgautier 的调用和ggplot2.guide_legend 合并到ggplot2.ggplot2.guide_legend 中使其工作,但它仍然迫使您手动选择颜色,这很痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多