Python中绘制R的科研级可视化图

Python中绘制R的科研级可视化图
一、重要的桥接Python库
rpy2# pip install rpy2 我的R语言版本为 4.1.3 ,需要rpy2 3.5.X版本去对应
二、确保R环境
确保你电脑已安装 R,并在 R 里装好相关包:# install.packages(c("ggplot2", "ggstatsplot", "patchwork","ggpmisc"))

注意:这里可能遇到几个问题:

1.rpy2同python同R的版本兼容问题

可能有报错:ffi.error: symbol 'R_getVar' not found in library 'E:\R\Rlangrage\R-4.1.3\bin\x64\R.dll': error 0x7f

此时需要调整rpy2版本使得三方同时适配

如:Python 3.9 + R 4.1.3 可以加载 rpy2  3.5.x  版本

 

2.R中没有相关的库/包

可能有报错:rpy2.robjects.packages.PackageNotInstalledError: The R package "ggplot2" is not installed.

方法:指定版本下载

 

install.packages("https://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_3.4.2.tar.gz",repos = NULL, type = "source")

 

可能有报错:rpy2.rinterface_lib.embedded.RRuntimeError: Error in library(ggstatsplot) : there is no package called 'ggstatsplot'

方法:安装兼容 R 4.1.3 的旧版 ggstatsplot

一般方法较为困难,这里采用屏幕快照,穿越回4.1.3适用的当年进行下载:

①打开 R 4.1.3 控制台,先设置镜像为 MRAN 快照(这里选择 2022-08-15,R 4.1.3 稳定期):

options(repos = c(CRAN = "https://cran.microsoft.com/snapshot/2022-08-15/"))

直接安装 ggstatsplot、ggpmisc

,它会自动从该快照拉取兼容版本的依赖包(correlation, datawizard, patchwork 等全部是当时的老版本)

install.packages("ggstatsplot")

③如果提示需要 Rtools 编译(Windows 下极少发生,快照提供二进制),就先装 Rtools40,安装时勾选“Add Rtools to system PATH”。

备用:如果 MRAN 快照连接失败,可改用其它历史镜像,例如:

options(repos = c(CRAN = "https://packagemanager.rstudio.com/cran/__linux__/focal/2022-08-15"))
options(repos = c(CRAN = "https://packagemanager.posit.co/cran/2022-08-15"))

当报错:Warning: unable to access index for repository https://cran.microsoft.com/snapshot/2022-08-15/src/contrib: 无法打开URL'https://cran.microsoft.com/snapshot/2022-08-15/src/contrib/PACKAGES'即表示该快照或穿越路线失效需要更换快照路径

3.语言环境错误

可能有报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 32: invalid start byte

方法:在 Python 中强制 R 使用英文消息声明:

在导入 rpy2 后、任何绘图前,加一行:

ro.r('Sys.setenv(LANGUAGE="en")')

三、绘图测试

例 1:ggstatsplot —— 一行代码带统计检验的箱线图

R 独有优势:自动进行方差分析 / t 检验,并把 p 值、效应量、显著性标注直接画在图上,符合顶刊风格。Python 生态目前没有同等级别的库。

import pandas as pd
import rpy2.robjects as ro
ro.r('Sys.setenv(LANGUAGE="en")')
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importrpandas2ri.activate()# 生成一些三组数据
df = pd.DataFrame({'score': [85, 90, 88, 92, 87, 70, 75, 72, 68, 71, 55, 60, 58, 62, 59],'method': ['A']*5 + ['B']*5 + ['C']*5
})
ro.globalenv['df'] = dfro.r('''
library(ggplot2)
library(ggstatsplot)
p <- ggbetweenstats(data = df,x = method,y = score,type = "parametric",title = "Comparison of Teaching Methods",caption = "Auto: F-value, p-value, eta^2"
)
ggsave("statsplot.png", p, width=8, height=5, dpi=300)
''')# 用你的默认图片查看器打开
import os
os.startfile("statsplot.png")

image

学习点

  • 你不用自己写 scipy.stats.f_oneway,不用算效应量,不用手工在图上标 p 值。

  • ggstatsplot 自动完成统计推断 + 可视化,是沟通数据分析与论文插图的终极捷径。

  • 这种图在心理学、医学、教育学等需要展示统计结果的社会科学期刊中极受欢迎。

例 2:patchwork 拼图 —— 任意组合多张图,对齐出版级

R 独有优势:像搭积木一样用 |/+ 组合多幅 ggplot2 图,自动对齐坐标轴、图例、边距。Python 的 matplotlib 子图布局难以达到同样的精确度和美学。

import os
import pandas as pd
import rpy2.robjects as ro
ro.r('Sys.setenv(LANGUAGE="en")')
from rpy2.robjects import pandas2ri
pandas2ri.activate()# 直接拿 ggplot2 里的 mpg 数据
ro.globalenv['mpg'] = ro.r('ggplot2::mpg')ro.r('''
library(ggplot2)
library(patchwork)p1 <- ggplot(mpg, aes(displ, hwy)) + geom_point(aes(color = class)) + geom_smooth(se = FALSE) + theme_minimal()p2 <- ggplot(mpg, aes(class)) + geom_bar(fill = "steelblue") + coord_flip() + theme_minimal()p3 <- ggplot(mpg, aes(cty, hwy)) + geom_point(alpha = 0.3) + facet_wrap(~ year) + theme_minimal()combined <- (p1 / p2) | p3 + plot_annotation(title = "汽车数据多维度展示", tag_levels = 'A')ggsave("patchwork_demo.png", combined, width=12, height=7, dpi=300)
''')os.startfile("patchwork_demo.png")

patchwork_demo

学习点

  • patchwork 的布局语法极其直观:(A / B) | C 表示 A 在 B 上面,整列再与 C 左右排列。

  • 自动对齐坐标轴、图例位置,输出图片可直接用于论文,无需后期手动微调。

  • 这种“写代码像设计版面”的体验,是目前 matplotlibsubplot2grid 等难以企及的。

例 3:高级 ggplot2 分面 + 统计变换 + 自定义标注

R 独有优势:分面时在每个子图上自动计算并标注相关系数、回归线,使用 after_stat 等先进统计变换,Python 的 plotnine 只能完成基础分面。

import os
import pandas as pd
import rpy2.robjects as ro
ro.r('Sys.setenv(LANGUAGE="en")')
from rpy2.robjects import pandas2ri
pandas2ri.activate()# 生成模拟数据
df = pd.DataFrame({'x': [1,2,3,4,5]*3,'y': [2,4,6,8,10, 1,4,7,10,13, 3,5,7,9,11],'group': ['线性A']*5 + ['线性B']*5 + ['线性C']*5
})
ro.globalenv['df'] = dfro.r('''
library(ggplot2)
library(ggpmisc)  # 提供 geom_text_npc 等标注函数p <- ggplot(df, aes(x, y, color = group)) +geom_point(size = 3) +geom_smooth(method = "lm", se = TRUE, alpha = 0.2) +facet_wrap(~ group, scales = "free") +stat_poly_eq(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),formula = y ~ x, parse = TRUE) +theme_minimal(base_size = 14) +labs(title = "分面自动标注回归方程和 R²")ggsave("facet_annotation.png", p, width=10, height=4, dpi=300)
''')os.startfile("facet_annotation.png")

facet_annotation

学习点

  • stat_poly_eq 能自动计算回归方程和 R²,并以数学公式形式渲染在图上,这在你需要展示趋势线的统计结果时极为有用。

  • facet_wrap 配合 scales="free" 让每个分面都有自己的坐标尺度,这很贴合实际数据分析。

  • 这种“统计结果直接呈现在图形元素中”的能力,是 R 可视化最深邃的美学之一。

 

由此可以展开Python和R的结合,Python解决工程代码+数学逻辑,R专项负责可视化部分实现两者结合。