使用 reticulate 在 R 中调用 pandas 绘图功能实现散点图

本文详解如何通过 reticulate 包在纯 r 脚本中调用 python pandas 的 `plot.scatter()` 方法绘制散点图,涵盖数据传递、python 环境执行及图形显示全流程。

要在 R 环境中直接调用 pandas 的绘图功能(而非借助 ggplot2 或 R 原生绘图系统),关键在于:将 R 数据框安全、准确地转换为 Python pandas DataFrame,并在 Python 运行时环境中执行原生 pandas 绘图语句。reticulate 提供了 r_to_py() 和 py_run_string() 两个核心函数来完成这一桥接。

以下是完整、可运行的 R 脚本示例(适用于 .R 文件,非 R Markdown):

library(reticulate)

# 导入必要 Python 模块
pd <- import("pandas")
plt <- import("matplotlib.pyplot")

# 构建 R 数据框(注意:列名需为合法 Python 标识符,避免空格或特殊字符)
df <- data.frame(
  col1 = c(1, 2, 3, 4, 5),
  col2 = c(6, 7, 8, 9, 10)
)

# 将 R 数据框转换为 Python pandas DataFrame
df_python <- r_to_py(df)

# 在 Python 环境中执行绘图命令(使用 r. 前缀访问 R 传入的对象)
py_run_string("
import matplotlib
matplotlib.use('Agg')  # 避免无 GUI 环境报错(如服务器、Rscript)
python_plot = r.df_python.plot.scatter(x='col1', y='col2', alpha=0.3, figsize=(6, 4))
plt.title('Scatter Plot via pandas in R')
")

# 显示图形(需确保 matplotlib 后端支持显示;若在无界面环境,建议保存为文件)
plt$show()

⚠️ 重要注意事项

  • r. 前缀是关键:r.df_python 表示 Python 环境中对 R 变量 df_python 的引用,不可省略或误写为 df_python(否则 Python 会报 NameError)。
  • 后端兼容性:在无图形界面的环境(如 Linux 服务器、Rscript 批处理)中,plt$show() 可能失败。推荐添加 matplotlib.use('Agg') 并改用 plt$savefig("plot.png") 保存图像:
    py_run_string("
    plt.savefig('scatter_from_pandas.png', dpi=300, bbox_inches='tight')
    ")
  • 数据类型一致性:r_to_py() 通常能正确推断数值型和字符型,但对因子(factor)、时间类(POSIXct)等需预处理(如 as.character() 或 as.numeric()),否则可能在 Python 中转为 object 类型导致绘图异常。
  • 依赖安装:确保 Python 环境已安装 pandas 和 matplotlib(可通过 reticulate::py_install(c("pandas", "matplotlib")) 自动安装)。

✅ 总结:该方案实现了 R 与 pandas 绘图能力的无缝集成——无需切换语言环境,不依赖 R Markdown 渲染机制,完全满足“在 .R 脚本中调用 pandas 函数”的工程化需求。只要正确管理对象跨环境引用与图形后端,即可稳定复现 Python 原生可视化效果。