2012-03-02 2 views
3

Без каких-либо существующих знаний о R, Rpy2 и ggplot2 я бы никогда не хотел создавать диаграмму рассеяния тривиальной таблицы из Python.Rpy2 & ggplot2: LookupError 'print.ggplot'

Чтобы установить это я только что установили:

  • Ubuntu 11.10 64 бит
  • R version 2.14.2 (от г-CRAN зеркала)
  • ggplot2 (через R> install.packages('ggplot2'))
  • rpy2-2.2.5 (через easy_install)

После этого я могу запишите некоторые примеры данных из интерактивного сеанса R, используя ggplot2.

Однако, когда я просто пытаюсь импортировать ggplot2, как я видел в качестве примера я нашел в Интернете, я получаю следующее сообщение об ошибке:

from rpy2.robjects.lib import ggplot2 
    File ".../rpy2/robjects/lib/ggplot2.py", line 23, in <module> 
    class GGPlot(robjects.RObject): 
    File ".../rpy2/robjects/lib/ggplot2.py", line 26, in GGPlot 
    _rprint = ggplot2_env['print.ggplot'] 
    File ".../rpy2/robjects/environments.py", line 14, in __getitem__ 
    res = super(Environment, self).__getitem__(item) 
LookupError: 'print.ggplot' not found 

Может кто-нибудь сказать мне, что я делаю неправильно? Как я уже сказал, оскорбительный импорт происходит из онлайн-примера, поэтому вполне может быть, что есть другой способ, которым я должен использовать gplot2 через rpy2.


Для справки, и не имеет отношение к указанным выше проблемам, вот пример dataframe я хотел бы построить, как только я получаю импорт работать (не должна быть проблемой, глядя на примерах). Идея состоит в том, чтобы создать график рассеяния с длинами по оси x, проценты по оси Y, а логическое значение используется для окраски точек, которые я хотел бы сохранить в файл (изображение или PDF). Учитывая, что эти требования очень ограничены, альтернативные решения также приветствуются.

 original.length row.retained percentage.retained 
1    1875  FALSE    11.00 
2    1143  FALSE    23.00 
3    960  FALSE    44.00 
4    1302  FALSE    66.00 
5    2016  TRUE     87.00 

ответ

4

В пакете R ggplot2 произошли изменения, которые сломали слой rpy2. Попробуйте недавний (я только что установил этот) снимок ветки «default» (rpy2-2.3.0-dev) для кода rpy2 на битбакете.

Редактировать: rpy2-2.3.0 - это на несколько месяцев отставание от графика. Я просто нажал bugfix release rpy2-2.2.6, который должен решить проблему.

+0

Привет, спасибо за исправление проблемы! Импорт работает снова, и я изучаю преобразование своего кода для использования rpy2 + ggplot2. – Tim

2

Хотя я не могу помочь вам с исправлением для ошибки импорта вы видите, есть аналогичный пример с использованием решетки здесь: lattice with rpy2.

Кроме того, стандарт R plot функция принимает окраску, используя factor функцию (которую вы можете кормить row.retained колонку. Пример:

plot(original.length, percentage.retained, type="p", col=factor(row.retained)) 
2

На основании ответа fucitol, я уже вместо реализован сюжет с использованием как . по умолчанию участок & решетки Вот обе реализации:

from rpy2 import robjects 
#Convert to R objects 
original_lengths = robjects.IntVector(original_lengths) 
percentages_retained = robjects.FloatVector(percentages_retained) 
row_retained = robjects.StrVector(row_retained) 

#Plot using standard plot 
r = robjects.r 
r.plot(x=percentages_retained, 
     y=original_lengths, 
     col=row_retained, 
     main='Title', 
     xlab='Percentage retained', 
     ylab='Original length', 
     sub='subtitle', 
     pch=18) 

#Plot using lattice 
from rpy2.robjects import Formula 
from rpy2.robjects.packages import importr 
lattice = importr('lattice') 
formula = Formula('lengths ~ percentages') 
formula.getenvironment()['lengths'] = original_lengths 
formula.getenvironment()['percentages'] = percentages_retained 

p = lattice.xyplot(formula, 
        col=row_retained, 
        main='Title', 
        xlab='Percentage retained', 
        ylab='Original length', 
        sub='subtitle', 
        pch=18) 
rprint = robjects.globalenv.get("print") 
rprint(p) 

это позор, я не могу ggplot2 работать, так как он производит НИК er по умолчанию, и я считаю, что работа с файловыми кадрами более ясна. Любая помощь в этом направлении по-прежнему приветствуется!

1

Проблема вызвана последней версией ggplot2, которая равна 0.9.0. Эта версия не имеет функции print.ggplot(), которая находится в ggplot2 версии 0.8.9.

Я попытался возиться с кодом rpy2, чтобы он работал с новейшим ggplot2, но расширение изменений кажется довольно большим.

Между тем, просто снимите версию ggplot2 до 0,8.9

+0

'ggplot2 ::: print.ggplot' – baptiste

2

Если у вас нет никакого опыта работы с R, но с python, вы можете использовать numpy или pandas для анализа данных и matplotlib для черчения.

Вот небольшой пример того, как "это чувствует себя подобно":

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({'original_length': [1875, 1143, 960, 1302, 2016], 
        'row_retained': [False, False, False, False, True], 
        'percentage_retained': [11.0, 23.0, 44.0, 66.0, 87.0]}) 
fig, ax = plt.subplots() 
ax.scatter(df.original_length, df.percentage_retained, 
      c=np.where(df.row_retained, 'green', 'red'), 
      s=np.random.randint(50, 500, 5) 
      ) 
true_value = df[df.row_retained] 
ax.annotate('This one is True', 
      xy=(true_value.original_length, true_value.percentage_retained), 
      xytext=(0.1, 0.001), textcoords='figure fraction', 
      arrowprops=dict(arrowstyle="->")) 
ax.grid() 
ax.set_xlabel('Original Length') 
ax.set_ylabel('Precentage Retained') 
ax.margins(0.04) 
plt.tight_layout() 
plt.savefig('alternative.png') 

alternative.png

pandas также имеет экспериментальный интерфейс rpy2.

Смежные вопросы