【问题标题】:Graphing matplotlib with Python code in a R Markdown document在 R Markdown 文档中使用 Python 代码绘制 matplotlib 图形
【发布时间】:2016-07-26 00:34:11
【问题描述】:

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

例如下面是 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 后自动生成图形。

【问题讨论】:

  • R 可以轻松搞定!为什么需要使用python!
  • @lucky1928 这只是一个例子,python 可以做许多其他不适合 R 的事情。:-)

标签: matplotlib rstudio r-markdown knitr


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

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

【讨论】:

  • 代码在 R Markdown 文档中,正如问题所问的那样。
【解决方案2】:

我一直在使用 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()

您从中得到以下信息:

【讨论】:

    【解决方案3】:

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

    我的回答有点晚了,但我希望这是一个以正确方式进行的彻底演练 - 不是渲染它,然后将其加载为 png,而是让 python 代码更“本机”地执行。

    第 1 步:从 RStudio 配置 Python

    您想插入一个 R 块,并运行以下代码来配置您要使用的 Python 版本的路径。大多数操作系统附带的默认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
    

    第二步:熟悉的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 代码的支持程度并不为人所知,所以希望任何偶然发现这个答案的人都会发现它提供了丰富的信息并学到了一些新东西。

    【讨论】:

      【解决方案4】:

      一种可能的解决方案是将绘图保存为图像,然后将文件加载到 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
      

      输出:

      【讨论】:

      • 我今天尝试在 knitr 中使用钩子来使这个解决方案更加自动化,但问题是钩子是用 R 编写的,所以似乎无法访问蟒蛇代码。也许有一种方法可以在最后写出一些 python 代码。
      • 现在,2018 年,您可以在 Rmarkdown 中插入 Python 代码。要使用 matplotlib 绘图,您只需添加 plt.show
      猜你喜欢
      • 2019-06-16
      • 2021-11-01
      • 1970-01-01
      • 2018-05-18
      • 2018-12-16
      • 2015-04-24
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多