ggplot2 ад с rpy2-2.0.7 + python 2.6 + r 2.11 (windows 7) - PullRequest
3 голосов
/ 18 августа 2010

Я использую rpy2-2.0.7 (мне нужно это для работы с Windows 7, а компиляция двоичных файлов для более новых версий rpy2 - беспорядок), чтобы вставить двухстолбцовый фрейм данных в 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: Ошибка: когда устанавливает эстетику, они могут принимать только одно значение.Проблемы: заполнить, х

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

Я использую 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, добавив в него «из предупреждений импорта предупреждений» и заменив «print» error в process_revents: ignored »на« warn »(« error in process_revents: ignored » ). Таким образом, я вижу предупреждение только один раз за сеанс.)

2 голосов
/ 22 января 2011

Вы должны задействовать 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']()
1 голос
/ 17 февраля 2011

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

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()
...