Rpy2 и ggplot2: LookupError 'print.ggplot'

Независимо от каких-либо ранее существовавших знаний R, Rpy2 и ggplot2, я тем не менее хотел бы создать диаграмму рассеяния тривиальной таблицы из Python.

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

  • Убунту 11.10 64 бит
  • R version 2.14.2 (от зеркала заднего вида)
  • 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.


Для справки и не связанной с проблемой выше, вот пример фрейма данных, который я хотел бы построить, как только я получу импорт для работы (не должно быть проблем с просмотром примеров). Идея состоит в том, чтобы создать точечную диаграмму с длинами по оси 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

person Tim    schedule 02.03.2012    source источник


Ответы (5)


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

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

person lgautier    schedule 19.04.2012
comment
Привет, спасибо за решение проблемы! Импорт снова работает, и сейчас я пытаюсь преобразовать свой код для использования rpy2 + ggplot2. - person Tim; 16.05.2012

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

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

plot(original.length, percentage.retained, type="p", col=factor(row.retained))
person Fukusahashi    schedule 05.03.2012

Основываясь на ответе 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 работать, так как по умолчанию он создает более красивые графики, и я считаю работу с фреймами данных более явной. Любая помощь в этом направлении по-прежнему приветствуется!

person Tim    schedule 05.03.2012

Если у вас нет опыта работы с 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.

person bmu    schedule 21.04.2012

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

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

Между тем, просто понизьте версию ggplot2 до 0.8.9.

person fidel    schedule 13.04.2012