使用rpy2设置lattice绘图选项的问题

3 投票
1 回答
743 浏览
提问于 2025-04-16 10:19

我正在尝试使用numpy数组中的数据创建一个热图或颜色强度图,使用的是rpy2和lattice。我用的是python 2.6.2,R 2.10.1,rpy2 2.1.9,不太确定lattice的版本。我已经把它搞定了,运行得很好,唯一的问题是我需要修改lattice的默认设置,想要改变绘制相关变量(z)水平时使用的颜色渐变。具体来说,我想要灰度色,而不是默认的品红-青色渐变。下面是生成一个虚拟数据框并在普通R中创建灰度水平图的代码:

library(lattice)

x <- rep(seq(1,10), each=10)
y <- rep(seq(1,10), 10)
z <- abs(rnorm(100))
z <- z/max(z)
df <- data.frame(x=x, y=y, z=z)

grayvector <- gray(seq(0,1,1/100))

foo <- levelplot(z ~ x * y, data=df, col.regions = grayvector)
print foo

在使用rpy2时,我无法设置col.regions这个参数。根据文档,rpy2应该会把函数参数中的.转换成_。但这似乎没有生效,因为使用col_regions时这个参数被忽略了。下面是生成水平图的python代码,但没有灰度效果:

from __future__ import division
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
r = ro.r
lattice = importr("lattice")

grayvector = r.gray( r.seq(0, 1, 1/100))   
x = r.rep(r.seq(1,10), each=10)
y = r.rep(r.seq(1,10), 10)
z = r.abs(r.rnorm(100))

df = {'x': x, 'y' :y, 'z':z}
df = ro.DataFrame(foo)

formula = ro.Formula('z ~ x * y')
formula.getenvironment()['z'] = df.rx2('z')
formula.getenvironment()['y'] = df.rx2('y')
formula.getenvironment()['z'] = df.rx2('z')

foo = lattice.levelplot(formula, data=df, col_regions = grayvector)
print foo

有没有人知道如何在rpy2中使用带有.的lattice函数参数?

1 个回答

4

你需要手动指定参数的映射:

from rpy2.robjects.functions import SignatureTranslatedFunction
lattice = importr("lattice")
lattice.levelplot = SignatureTranslatedFunction(lattice.levelplot,
                                                init_prm_translate={'col_regions': 'col.regions'})
foo = lattice.levelplot(formula, data=df, col_regions=grayvector)

还有,看看这个链接: http://rpy.sourceforge.net/rpy2/doc-2.2/html/robjects_functions.html

理解这一点很重要:翻译是通过查看R函数的签名来完成的,而当R函数中出现省略号‘...’时,很多内容是无法猜测的。

撰写回答