python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python绘制R可视化图

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

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

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 importr
pandas2ri.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'] = df
ro.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

学习点:

例 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")

学习点:

例 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'] = df
ro.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")

学习点:

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

四、绘图包装

①Python给数据(dataframe格式)

mport os
import pandas as pd
import Rplot
# 生成模拟数据
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
})
Rtext='''
library(ggplot2)
library(ggpmisc)  # 提供 geom_text_npc 等标注函数
p <- ggplot(Data, 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("Output.png", p, width=10, height=4, dpi=300)
'''
Rplot.PyRplot(Data=df,Rtext=Rtext)
os.startfile("Output.png")

②R绘图

import pandas as pd
import rpy2.robjects as ro
ro.r('Sys.setenv(LANGUAGE="en")')
from rpy2.robjects import pandas2ri
pandas2ri.activate()
ro.globalenv['mpg'] = ro.r('ggplot2::mpg')
def PyRplot(Data,Rtext):
    if not isinstance(Data, pd.DataFrame):
        data = pd.DataFrame(Data)
    ro.globalenv['Data'] = Data
    ro.r(Rtext)
    ro.r('rm(Data)')  # 用后即删,保持环境干净

到此这篇关于Python中绘制R的科研级可视化图的文章就介绍到这了,更多相关Python中绘制R的科研级可视化图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文