Rpy2 & ggplot2: LookupError 'print.ggplot' - PullRequest
       15

Rpy2 & ggplot2: LookupError 'print.ggplot'

3 голосов
/ 03 марта 2012

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

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

  • Ubuntu 11.10 64 бит
  • R version 2.14.2 (от зеркала r-кран)
  • 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

Ответы [ 5 ]

4 голосов
/ 19 апреля 2012

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

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

2 голосов
/ 21 апреля 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.

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

2 голосов
/ 05 марта 2012

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

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

plot(original.length, percentage.retained, type="p", col=factor(row.retained))
1 голос
/ 13 апреля 2012

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

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

А пока просто понизьте версию ggplot2 до 0.8.9

...