在R中导入具有网状的matplotlib

时间:2018-04-10 23:13:15

标签: python r matplotlib reticulate

我刚刚开始使用R中的网状包,我仍然会发现一些问题。特别是,导入matplotlib并不顺利。我尝试了两种不同的方法,每种方式都有不同的错误信息。

首先,在RStudio的交互式shell中使用repl_python:

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

打开的REPL Python shell似乎有正确的版本和所有内容,但是当我尝试导入matplotlib.pyplot时,我看到以下内容:

导入错误:/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,name,silent)中的错误:AtributeError:模块'matplotlib'没有属性'pyplot'调用:... $ .python.builtin.object - > py_get_attr - > py_get_attr_impl - > .Call Execution停止了

任何想法可能会在这里发生什么?

谢谢!

更新正如我在评论中提到的,安装网络版的开发者版本修复了一些问题,但并非全部。如果我尝试运行此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

当我尝试使用Google搜索错误文本时,similar error with xcb似乎确实会出现在我认为不太相关的上下文中。

4 个答案:

答案 0 :(得分:3)

通过将R Markdown代码块更改为:

,我能够完成工作
```{r}
library(reticulate)
use_python('/usr/bin/python3')
```

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

我仍然不明白为什么,但似乎reticulate对anaconda安装并不好。也许它与anaconda设置为与交互式Jupyter笔记本配合良好有关。

答案 1 :(得分:1)

我能够通过sym将conda lib文件链接到/ lib / x86_64-linux-gnu /。

来使用我的conda安装。

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

我注意到如果我使用相同的导入单独运行python它工作正常。似乎网状网没有“看到”conda lib作为libz的来源,但确实在/lib/x86_64-linux-gnu/目录中查看。

Python:3.6
康达:4.5.1
操作系统:Ubuntu 14.04.1 LTS

答案 2 :(得分:0)

我发现网状结构存在相同的错误,它不是从anaconda库中读取zlib,而是从/ 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')

答案 3 :(得分:0)

我一直在使用网状结构和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()

enter image description here