Как построить (встроенный) с Rpy2 в блокноте Jupyter?

Я учусь использовать rpy2 в ноутбуке Jupyter. У меня проблемы с графиком. Когда я использую этот пример из документов rpy2 для интерактивной работы:

from rpy2.interactive import process_revents
from rpy2.robjects.packages import importr
from rpy2.robjects.vectors import IntVector
process_revents.start()

graphics = importr("graphics")
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")

Юпитер открывает новое окно с сюжетом. Окно "заголовок" гласит: R Графика: Устройство 2 (ACTIVE) (не отвечает). Ядро Jupyter активно. Когда я пытаюсь закрыть окно с графиком, Windows утверждает, что python.exe не отвечает, и если я принудительно закрываю его, ядро ​​jupyter перезапускается.

Во-первых, как я могу сделать график rpy2 встроенным? Второе: если встроенное построение графиков невозможно, как получить график в окне, когда python.exe перестает отвечать на запросы?

1 ответ

Решение

Похоже, что это ответ на ваш вопрос: https://bitbucket.org/rpy2/rpy2/issues/330/ipython-plotting-wrapper

with rpy2.robjects.lib.grdevices.render_to_bytesio(grdevices.png, width=1024, height=896, res=150) as img:
    graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
IPython.display.display(IPython.display.Image(data=img.getvalue(), format='png', embed=True))

Я думаю, что самое чистое решение - просто использовать %Rмагическая функция. Раньше он был частью IPython, но был перемещен вrpy2, поэтому вам нужно сначала загрузить его как расширение:

%load_ext rpy2.ipython
A = np.random.normal(100)
%R -i A hist(A)

строит гистограмму в консоли Jupyter.

Это немного более сложная версия ответа Кристиана, которая объединяет построение графика и встроенное встраивание в один и тот же диспетчер контекста:

from contextlib import contextmanager
from rpy2.robjects.lib import grdevices
from IPython.display import Image, display

@contextmanager
def r_inline_plot(width=600, height=600, dpi=100):

    with grdevices.render_to_bytesio(grdevices.png, 
                                     width=width,
                                     height=height, 
                                     res=dpi) as b:

        yield

    data = b.getvalue()
    display(Image(data=data, format='png', embed=True))

Применение:

with r_inline_plot(width=1024, height=896, dpi=150):
    graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
Другие вопросы по тегам