【问题标题】:How to annotate subplots with ggplot from rpy2?如何使用 rpy2 中的 ggplot 注释子图?
【发布时间】:2013-02-02 06:36:07
【问题描述】:

我正在使用 Rpy2 用 ggplot2 绘制数据帧。我做了以下情节:

p = ggplot2.ggplot(iris) + \
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", y="Sepal.Width")) + \
    ggplot2.facet_wrap(Formula("~Species"))
p.plot()
r["dev.off"]()  

我想用一些关于情节的统计数据来注释每个子情节。例如,我想计算每个 x/y 子图之间的相关性并将其放在图的右上角。如何才能做到这一点?理想情况下,我想将数据帧从 R 转换为 Python 对象,计算相关性,然后将它们投影到散点上。以下转换不起作用,但我正在尝试这样做:

# This does not work 
#iris_df = pandas.DataFrame({"Sepal.Length": rpy2.robjects.default_ri2py(iris.rx("Sepal.Length")),
#                            "Sepal.Width": rpy2.robjects.default_ri2py(iris.rx("Sepal.Width")),
#                            "Species": rpy2.robjects.default_ri2py(iris.rx("Species"))})
# So we access iris using R to compute the correlation
x = iris_py.rx("Sepal.Length")
y = iris_py.rx("Sepal.Width")
# compute r.cor(x, y) and divide up by Species
# Assume we get a vector of length Species saying what the
# correlation is for each Species' Petal Length/Width
p = ggplot2.ggplot(iris) + \
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", y="Sepal.Width")) + \
    ggplot2.facet_wrap(Formula("~Species")) + \
    # ...
    # How to project correlation?
p.plot()
r["dev.off"]()    

但假设我实际上可以从 Python 访问 R 数据框,我该如何绘制这些相关性?谢谢。

【问题讨论】:

    标签: r ggplot2 pandas rpy2


    【解决方案1】:

    解决方案是为每个绘制的样本创建一个带有标签的数据框。数据框的列应与数据框的相应列名与原始数据匹配。然后可以用以下方式绘制:

    p += ggplot2.geom_text(data=labels_df, mapping=ggplot2.aes_string(x="1", y="1", mapping="labels"))

    其中labels_df 是包含标签的数据框,labelslabels_df 的列名以及要绘制的标签。 (1,1) 在这种情况下将是标签在每个子图中的坐标位置。

    【讨论】:

      【解决方案2】:

      我发现@user248237dfsf 的回答对我不起作用。 ggplot 对我正在绘制的数据框和我用于标签的数据框感到困惑。

      相反,我使用 ggplot2_env = robjects.baseenv'as.environment'

      class GBaseObject(robjects.RObject):
        @classmethod
        def new(*args, **kwargs):
          args_list = list(args)
          cls = args_list.pop(0)
          res = cls(cls._constructor(*args_list, **kwargs))
          return res
      
      class Annotate(GBaseObject):
        _constructor = ggplot2_env['annotate']
      annotate = Annotate.new
      

      现在,我有了一些可以像标准注释一样工作的东西。

      annotate(geom = "text", x = 1, y = 1, label = "MPC")
      

      一个小评论:我不知道这是否适用于分面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-21
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多