Как аннотировать подзаголовки с помощью ggplot из rpy2?

Я использую 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"]()    

Но предполагая, что я действительно могу получить доступ к фрейму данных R из Python, как я могу построить эти корреляции? Благодарю.


person Community    schedule 17.02.2013    source источник


Ответы (2)


Решение состоит в том, чтобы создать фрейм данных с меткой для каждого нанесенного образца. Столбец фрейма данных должен соответствовать соответствующему имени столбца фрейма данных с исходными данными. Затем это можно построить с помощью:

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

где labels_df — это кадр данных, содержащий метки, а labels — имя столбца labels_df с метками, которые нужно нанести на график. (1,1) в этом случае будет координатной позицией метки на каждом подграфике.

person Community    schedule 18.02.2013

Я обнаружил, что ответ @ 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")

Один небольшой комментарий: я не знаю, будет ли это работать с огранкой.

person ganong    schedule 28.06.2016