在 R 中导入带有网状结构的 matplotlib
Importing matplotlib with reticulate in R
我刚开始使用 R 中的 reticulate 包,但我仍在解决一些问题。特别是,导入 matplotlib 并不顺利。我尝试了两种不同的方法,每种方法都有不同的错误消息。
首先,在RStudio的交互中使用repl_python shell:
library(reticulate)
use_python('/home/craig/anaconda3/bin/python')
py_discover_config()
repl_python()
import matplotlib.pyplot as plt
打开的 REPL Python shell 似乎具有正确的版本和所有内容,但是当我尝试导入 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, name, silent) 中的错误:属性错误:模块 'matplotlib' 没有属性 'pyplot' 调用:... $.python.builtin.object -> py_get_attr -> py_get_attr_impl -> .调用执行暂停
知道这里会发生什么吗?
谢谢!
更新: 正如我在评论中提到的,安装网纹的开发者版本解决了一些问题,但不是全部。如果我尝试 运行 这个 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
当我尝试用谷歌搜索错误文本时,similar error with xcb 似乎出现在一个上下文中,据我所知,它不是那么相关。
通过将 R Markdown 代码块更改为以下内容,我能够让事情正常进行:
```{r}
library(reticulate)
use_python('/usr/bin/python3')
```
```{python}
import matplotlib.pyplot as plt
```
我仍然不太明白为什么,但似乎 reticulate
不能很好地与 anaconda 安装一起使用。也许这与 anaconda 被设置为与交互式 Jupyter notebook 一起工作有关。
通过将 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 单独使用相同的导入它工作正常。看来网状不是 'seeing' 作为 libz 源的 conda lib,但确实在 /lib/x86_64-linux-gnu/
目录中查找。
Python: 3.6
康达:4.5.1
OS:Ubuntu 14.04.1 LTS
我发现 reticulate 也有同样的错误,它不是从 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')
我一直在使用 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()
我刚开始使用 R 中的 reticulate 包,但我仍在解决一些问题。特别是,导入 matplotlib 并不顺利。我尝试了两种不同的方法,每种方法都有不同的错误消息。
首先,在RStudio的交互中使用repl_python shell:
library(reticulate)
use_python('/home/craig/anaconda3/bin/python')
py_discover_config()
repl_python()
import matplotlib.pyplot as plt
打开的 REPL Python shell 似乎具有正确的版本和所有内容,但是当我尝试导入 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, name, silent) 中的错误:属性错误:模块 'matplotlib' 没有属性 'pyplot' 调用:... $.python.builtin.object -> py_get_attr -> py_get_attr_impl -> .调用执行暂停
知道这里会发生什么吗?
谢谢!
更新: 正如我在评论中提到的,安装网纹的开发者版本解决了一些问题,但不是全部。如果我尝试 运行 这个 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
当我尝试用谷歌搜索错误文本时,similar error with xcb 似乎出现在一个上下文中,据我所知,它不是那么相关。
通过将 R Markdown 代码块更改为以下内容,我能够让事情正常进行:
```{r}
library(reticulate)
use_python('/usr/bin/python3')
```
```{python}
import matplotlib.pyplot as plt
```
我仍然不太明白为什么,但似乎 reticulate
不能很好地与 anaconda 安装一起使用。也许这与 anaconda 被设置为与交互式 Jupyter notebook 一起工作有关。
通过将 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 单独使用相同的导入它工作正常。看来网状不是 'seeing' 作为 libz 源的 conda lib,但确实在 /lib/x86_64-linux-gnu/
目录中查找。
Python: 3.6
康达:4.5.1
OS:Ubuntu 14.04.1 LTS
我发现 reticulate 也有同样的错误,它不是从 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')
我一直在使用 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()