Вопрос

Я использую RPY2-2.0.7 (мне нужно это работать с Windows 7, а компиляция двоичных файлов для новых версий RPY2 - это беспорядок), чтобы нажать на двух столбец DataFrame в R, создать несколько слоев в GGPLOT2, а вывод изображение в <.png>.

Я потратил бесчисленные часы против синтаксиса; Мне удалось выводить файлы, которые мне нужны в одной точке, но (тупо) не заметил и продолжил ездить с моим кодом ...

Я бы искренне ценю любую помощь; Ниже представляет собой (тривиальный) пример для демонстрации. Большое спасибо за Вашу помощь!!! ~ Эрическое масло


import rpy2.robjects as rob
from rpy2.robjects import r
import rpy2.rlike.container as rlc
from array import array

r.library("grDevices")    # import r graphics package with rpy2
r.library("lattice")
r.library("ggplot2")
r.library("reshape")

picpath = 'foo.png' 

d1 = ["cat","dog","mouse"]
d2 = array('f',[1.0,2.0,3.0])

nums = rob.RVector(d2)
name = rob.StrVector(d1)

tl = rlc.TaggedList([nums, name], tags = ('nums', 'name'))
dataf = rob.RDataFrame(tl)

## r['png'](file=picpath, width=300, height=300)
## r['ggplot'](data=dataf)+r['aes_string'](x='nums')+r['geom_bar'](fill='name')+r['stat_bin'](binwidth=0.1)
r['ggplot'](data=dataf)
r['aes_string'](x='nums')
r['geom_bar'](fill='name')
r['stat_bin'](binwidth=0.1)
r['ggsave']()
## r['dev.off']()

* Вывод - это просто пустое изображение (181 б).


Вот пара общих ошибок r сама бросает, как я скрипил в ggplot2:

r['png'](file=picpath, width=300, height=300)
r['ggplot']()
r['layer'](dataf, x=nums, fill=name, geom="bar")
r['geom_histogram']()
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RRUNTIMEERROR: ОШИБКА: Нет слоев на участке

r['png'](file=picpath, width=300, height=300)
r['ggplot'](data=dataf)
r['aes'](geom="bar")
r['geom_bar'](x=nums, fill=name)
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RruntimeError: Ошибка: когда параметр Эстетика, они могут принимать только одну ценность. Проблемы: заполните, х

Это было полезно?

Решение

Я использую RPY2 исключительно через блестящий маленький модуль Натаниэля Смита под названием rnumpy. (См. Ссылка «API» на домашней странице Rnumpy). С этим вы можете сделать:

from rnumpy import *

r.library("ggplot2")

picpath = 'foo.png' 
name = ["cat","dog","mouse"]
nums = [1.0,2.0,3.0]

r["dataf"] = r.data_frame(name=name, nums=nums)
r("p <- ggplot(dataf, aes(name, nums, fill=name)) + geom_bar(stat='identity')")
r.ggsave(picpath)

(Я немного догадаюсь о том, как вы хотите, чтобы сюжет посмотреть, но вы получаете идею.)

Другое большое удобство входит в «R режим» из Python с модулем iPy_rnumpy. (См. Ссылка «Интеграция iPython» на домашней странице Rnumpy).

Для сложных вещей я обычно прототип в R до тех пор, пока у меня не будет разработаны команды построения. Отчет об ошибках в RPY2 или Rnumpy может стать довольно грязным.

Например, результат назначения (или других вычислений) иногда печатается даже тогда, когда он должен быть невидимым. Это раздражает, например, при назначении больших кадров данных. Быстрый обходной путь заключается в том, чтобы закончить оскорбительную линию с помощью заднего оператора, который оценивает что-то короткое. Например:

In [59] R> long <- 1:20
Out[59] R>
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20

In [60] R> long <- 1:100; 0
Out[60] R> [1] 0

(Чтобы замолчать некоторые повторяющиеся предупреждения в Rnumpy, я отредактировал rnumpy.py, чтобы добавить «От предупреждений Import Warn» и заменить «печать» ошибки в процессе_респондентов: игнорируется «С» предупреждение («Ошибка в процессе_Revents: игнорируется»). Таким образом, я вижу только предупреждение один раз за сеанс.)

Другие советы

Вы должны включить dev (), прежде чем выключите его, что означает, что вам нужно распечатать () (как догадки JD выше) до бросания dev.off ().

from rpy2 import robjects                          
r = robjects.r                                                                                    
r.library("ggplot2")
robjects.r('p = ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()') 
r.ggsave('/stackBar.jpeg') 
robjects.r('print(p)')
r['dev.off']()

Чтобы сделать его немного легче, когда вы должны нарисовать более сложные участки:

from rpy2 import robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.lib.ggplot2 as ggplot2
r = robjects.r
grdevices = importr('grDevices')
p = r('''
  library(ggplot2)

  p <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
  p <- p + opts(title = "{0}")
    # add more R code if necessary e.g. p <- p + layer(..)
  p'''.format("stackbar")) 
  # you can use format to transfer variables into R
  # use var.r_repr() in case it involves a robject like a vector or data.frame
p.plot()
# grdevices.dev_off()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top