在 R Markdown 文档中使用 Python 代码绘制 matplotlib

Graphing matplotlib with Python code in a R Markdown document

是否可以使用Pythonmatplotlib代码在RStudio中绘制图形?

例如下面 Python matplotlib 代码:

import numpy as np
import matplotlib.pyplot as plt

n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)

plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.plot (X, Y-1, color='blue', alpha=1.00)
plt.show()

输出图将是:

然后我需要写一个R Markdown来包含这些代码并在编织markdown后自动生成图表。

一种可能的解决方案是将绘图保存为图像,然后将文件加载到 markdown。

### Call python code sample
```{r,engine='python'}
import numpy as np
import matplotlib.pyplot as plt

n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)

fig, ax = plt.subplots( nrows=1, ncols=1 )
ax.plot (X, Y+1, color='blue', alpha=1.00)
ax.plot (X, Y-1, color='blue', alpha=1.00)
#plt.show()
fig.savefig('foo.png', bbox_inches='tight')
print "finished"
```
Output image:
![output](foo.png)

#### The End

输出:

  1. install.packages('devtools') 先得到install_github函数
  2. install_github("rstudio/reticulate") 安装 reticulate
  3. 的开发版本
  4. 在 r markdown 文档中,使用下面的代码启用该功能。
```{r setup, include=FALSE}  
library(knitr)  
library(reticulate)  
knitr::knit_engines$set(python = reticulate::eng_python)  
```

试试吧,你会得到你想要的,不需要保存任何图像。

您可以使用 reticulate 做到这一点,但大多数时候在尝试按照教程进行操作时,您可能会遇到一些没有充分解释的技术问题。

我的回答有点晚了,但我希望这是一个彻底的演练,以正确的方式进行——不是渲染它然后将它作为 png 加载,而是让 python 代码执行得更多 "natively".

第 1 步:从 RStudio

配置 Python

你想插入一个R块,运行下面的代码配置你想使用的Python版本的路径。大多数 OS 随附的默认 python 通常是过时的 python 2 并且不是您安装软件包的位置。这就是为什么这样做很重要,以确保 Rstudio 将使用指定的 python 实例,在该实例中可以找到您的 matplotlib 库(以及您将用于该项目的其他库):

library(reticulate)
# change the following to point to the desired path on your system
use_python('/Users/Samuel/anaconda3/bin/python')
# prints the python configuration
py_config()

您应该会看到您的会话配置了您指定的设置:

python:         /Users/Samuel/anaconda3/bin/python
libpython:      /Users/Samuel/anaconda3/lib/libpython3.6m.dylib
pythonhome:     /Users/Samuel/anaconda3:/Users/Samuel/anaconda3
version:        3.6.3 |Anaconda custom (64-bit)| (default, Oct  6 2017, 12:04:38)  [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
numpy:          /Users/Samuel/anaconda3/lib/python3.6/site-packages/numpy
numpy_version:  1.15.2

python versions found: 
 /Users/Samuel/anaconda3/bin/python
 /usr/bin/python
 /usr/local/bin/python
 /usr/local/bin/python3
 /Users/Samuel/.virtualenvs/r-tensorflow/bin/python

第 2 步:熟悉的 plt.show

在您的 R Markdown 文档中添加一个 Python 块(不是 R!)(参见随附的屏幕截图),您现在可以编写本机 Python 代码。这意味着熟悉的 plt.show()plt.imshow() 无需任何额外工作即可工作。它将被渲染并可以使用 knitr.

编译成 HTML / PDF

这会起作用:

plt.imshow(my_image, cmap='gray') 

或更详细的示例:

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2

DATADIR = '/Users/Samuel/Datasets/PetImages'
CATEGORIES = ['Dog', 'Cat']

for category in CATEGORIES:
    path = os.path.join(DATADIR, category) # path to cat or dog dir
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE)
        plt.imshow(img_array, cmap='gray')
        plt.show()
        break
    break

输出:

第 3 步:编织成 HTML/PDF/Word 等

照常编织。最终产品是使用 R Markdown 在 Python 代码中完成的格式精美的文档。 RStudio 已经走了很长一段路,令我惊讶的是它对 Python 代码的支持水平并不为人所知,所以希望偶然发现这个答案的任何人都能发现它提供的信息并学到一些新东西。

我一直在使用 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') ## yes, you can run pytorch and tensor flow too

然后您可以使用任何一种语言工作。因此,为了使用 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()

您从中得到以下信息:

我没有添加评论的声望点数,但 Bryan 上面的回答是唯一对我有用的。添加 plt.tight_layout() 有所不同。我将该行添加到以下简单代码并显示了绘图。

{python evaluate}

plt.scatter(X_train, y_train, color = 'gray')
plt.plot(X_train, regresssion_model_sklearn.predict(X_train), color = 'red')
plt.ylabel('Salary')
plt.xlabel('Number of Years of Experience')
plt.title('Salary vs. Years of Experience')

plt.tight_layout()
plt.show()