Импорт matplotlib с ретикулятом в R

Я только начал использовать пакет reticulate в R, и я все еще разбираюсь с некоторыми изгибами. В частности, не ладится импорт matplotlib. Я пробовал это двумя разными способами, с разными сообщениями об ошибках для каждого.

Во-первых, используя repl_python в интерактивной оболочке RStudio:

library(reticulate)
use_python('/home/craig/anaconda3/bin/python')
py_discover_config()
repl_python()
import matplotlib.pyplot as plt

Открывающаяся оболочка REPL Python, кажется, имеет правильную версию и все такое, но когда я пытаюсь импортировать matplotlib.pyplot, я вижу следующее:

ImportError: /lib/x86_64-linux-gnu/libz.so.1: версия `ZLIB_1.2.9' не найдена (требуется /home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/../ ../.././libpng16.so.16)

Установка zlib (с использованием sudo apt-get install lib64z1-dev lib64z1), похоже, ничего не изменила. FWIW, import matplotlib работало нормально, пока мне не нужен pyplot.

Я также пытался сделать то же самое в документе R Markdown:

```{r}
library(reticulate)
py_discover_config()
```

```{python}
import matplotlib.pyplot as plt
```

На этот раз я увидел:

Ошибка в py_get_attr_impl (x, имя, молчание): AtributeError: модуль «matplotlib» не имеет атрибута «pyplot».

Есть идеи, что здесь может происходить?

Спасибо!

ОБНОВЛЕНИЕ: Как я упоминал в комментариях, установка версии reticulate для разработчиков устраняет некоторые проблемы, но не все. Если я попытаюсь запустить этот Rmd:

```{r}
library(reticulate)
use_python('/home/craig/anaconda3/bin/python')
```

```{python}
import matplotlib.pyplot as plt
```

Я получаю следующие сообщения об ошибках:

Error in py_run_string_impl(code, local, convert) : 
  ImportError: /home/craig/anaconda3/lib/python3.6/site-packages/PyQt5/../../../libxcb-dri3.so.0: undefined symbol: xcb_send_request_with_fds

Detailed traceback: 
  File "<string>", line 1, in <module>
  File "/home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 116, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 60, in pylab_setup
[backend_name], 0)
  File "/home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/backends/backend_qt5agg.py", line 16, in <module>
    from .backend_qt5 import (
  File "/home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/backends/backend_qt5.py", line 18, in <module>
    import matplotlib.backends.qt_editor.figureoptions as figureoptions
  File "/home/craig/anaconda3/lib/python3.6/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module>
Calls: <Anonymous> ... force -> py_run_string -> py_run_string_impl -> .Call
Execution halted

Когда я попытался погуглить текст ошибки, мне показалась похожая ошибка с xcb. всплывать в контексте, который, насколько я могу судить, не так актуален.


person cjolley    schedule 10.04.2018    source источник
comment
в вашем примере r markdown вы импортируете matplotlib, но не matplotlib.pyplot. это просто ошибка копирования и вставки?   -  person clemens    schedule 11.04.2018
comment
Это так, но на самом деле я получаю ту же ошибку, даже если я просто импортирую matplotlib, а не matplotlib.pyplot. Импорт matplotlib без pyplot с использованием repl_python() вместо R Markdown не дает ошибки.   -  person cjolley    schedule 11.04.2018
comment
ОБНОВЛЕНИЕ: проблема R Markdown все еще существует, но я смог решить ошибку repl_python(), следуя приведенным здесь инструкциям: stackoverflow.com/questions/48306849/   -  person cjolley    schedule 12.04.2018
comment
ОБНОВЛЕНИЕ 2: Установка версии reticulate для разработчиков с использованием devtools::install_github("rstudio/reticulate") немного помогает (т.е. теперь я могу import matplotlib без ошибки), но я все еще получаю ошибки, когда пытаюсь import matplotlib.pyplot.   -  person cjolley    schedule 12.04.2018
comment
Получение той же ошибки. Ошибка не возникает, если я просто импортирую matplotlib, но как только я ссылаюсь на maltplotlib.pyplot, возникают ошибки. Это было только в консоли R в RStudio, а не в RMarkdown fwiw.   -  person clesiemo3    schedule 24.04.2018
comment
Эта ссылка также помогла решить мою проблему stackoverflow.com/questions/48306849/   -  person Mike.Gahan    schedule 06.01.2019


Ответы (4)


Я смог заставить все работать, изменив блок кода R Markdown следующим образом:

```{r}
library(reticulate)
use_python('/usr/bin/python3')
```

```{python}
import matplotlib.pyplot as plt
```

Я до сих пор не очень понимаю, почему, но кажется, что reticulate плохо работает с установками анаконды. Возможно, это как-то связано с тем, что анаконда хорошо работает с интерактивным блокнотом Jupyter.

person cjolley    schedule 20.04.2018

Я смог заставить его работать с моей установкой conda, связав файл библиотеки conda с символом /lib/x86_64-linux-gnu/.

ln -s -f /opt/miniconda/lib/libz.so.1 /lib/x86_64-linux-gnu/libz.so.1

Я заметил, что если я запускал python один с тем же импортом, он работал нормально. Похоже, что reticulate не «видит» библиотеку conda как источник для libz, но ищет в каталоге /lib/x86_64-linux-gnu/.

Python: 3.6
Conda: 4.5.1
ОС: Ubuntu 14.04.1 LTS

person clesiemo3    schedule 24.04.2018
comment
Та же проблема - попробовал это, и это имело очень негативные последствия, фактически убив мой экземпляр EC2. - person JohnSG; 25.09.2018

Я обнаружил ту же ошибку с reticulate, который читает zlib не из библиотеки anaconda, а из /lib/x86_64-linux-gnu/.

Вместо символической ссылки я просто запускаю следующую строку из терминала каждый раз, когда использую скрипт:

export LD_LIBRARY_PATH=/home/craig/anaconda3/lib/:$LD_LIBRARY_PATH

На самом деле вы можете запустить его из скрипта R, дав:

system('export LD_LIBRARY_PATH=/home/craig/anaconda3/lib/:$LD_LIBRARY_PATH')
person fedef    schedule 14.05.2019

Я работал с reticulate и R Markdown, и вы должны указать свою виртуальную среду. Например, мой R Markdown начинается следующим образом:

{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, cache.lazy = FALSE)
library(reticulate)

use_condaenv('pytorch')

Тогда вы сможете работать на любом языке. Итак, для построения графиков с помощью matplotlib я обнаружил, что вам нужен модуль PyQt5, чтобы все работало гладко. Следующее делает хороший сюжет внутри R Markdown.

{python plot}
import PyQt5
import numpy as np
import pandas as pd
import os

import matplotlib.pyplot as plt
from matplotlib.pyplot import figure

data = pd.read_csv('Subscriptions.csv',index_col='Date', parse_dates=True)

# make the nice plot
# set the figure size
fig = plt.figure(figsize = (15,10))

# the series
ax1 = fig.add_subplot(211)
ax1.plot(data.index.values, data.Opens, color = 'green', label = 'Opens')

# plot the legend for the first plot
ax1.legend(loc = 'upper right', fontsize = 14)

plt.ylabel('Opens', fontsize=16)

# Hide the top x axis
ax1.axes.get_xaxis().set_visible(False)

#######  NOW PLOT THE OTHER SERIES ON A SINGLE PLOT

# plot 212 is the MI series

# plot series
ax2 = fig.add_subplot(212)
ax2.plot(data.index.values, data.Joiners, color = 'orange', label = 'Joiners')

# plot the legend for the second plot
ax2.legend(loc = 'upper right', fontsize = 14)

# set the fontsize for the bottom plot
plt.ylabel('Joiners', fontsize=16)

plt.tight_layout()
plt.show()

введите здесь описание изображения

person Bryan Butler    schedule 06.09.2019