在一个图中多个filled.contour图

时间:2013-01-16 17:10:28

标签: r graph plot contour

我有一个包含连续变量x,因子y和连续变量z

的数据框

为了说明假设

x <- 1:5
y <- c("A", "B", "C", "D", "E")

z.a<-sort(sample(x=seq(0,1,0.1),size=5, replace=F))
z.b<-sort(sample(x=seq(0,1,0.1),size=5, replace=F))
z.c<-sort(sample(x=seq(0,1,0.1),size=5, replace=F))
z.d<-sort(sample(x=seq(0,1,0.1),size=5, replace=F))
z.e<-sort(sample(x=seq(0,1,0.1),size=5, replace=F))

现在我想构建以下情节

plot(x,y, yaxt="n", type="n",ylim=c(0,5),yaxs="i")
axis(2, at=seq(0.5,4.5,1), labels=c("A", "B", "C", "D", "E"))
abline(h=0:5)

enter image description here

现在,对于y的每个级别(在y轴上显示),我希望根据相应的z值将框填充颜色。例如,地图的A应填充z.aB填充z.b

所有z包含相同比例(0,1)的值,并且随着x

递减而逐渐减少

是否有任何包执行这些类型的图?如果没有,我怎么能在基础R中编码?

我更喜欢基础R解决方案,但如果不可能有任何其他解决方案。

或者,该图可以被视为y的每个级别的水平条形图,范围为x的整个范围,其颜色将归因于z(每个x)

1 个答案:

答案 0 :(得分:1)

以下是使用ggplot2库的解决方案。

首先,将所有数据放入一个数据框中。

df<-data.frame(x = rep(1:5,times=5),
               y = rep(c("A", "B", "C", "D", "E"),each=5),
               z= c(sort(sample(x=seq(0,1,0.1),size=5, replace=F)),
                    sort(sample(x=seq(0,1,0.1),size=5, replace=F)),
                    sort(sample(x=seq(0,1,0.1),size=5, replace=F)),
                    sort(sample(x=seq(0,1,0.1),size=5, replace=F)),
                    sort(sample(x=seq(0,1,0.1),size=5, replace=F))))

然后使用geom_tile()y的每个级别获取颜色,具体取决于z值。

library(ggplot2)
ggplot(df,aes(x=x,y=y,fill=z))+geom_tile()+
  scale_x_continuous(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0))

enter image description here

更新 - 使用功能图像的解决方案

类似的结果可以通过基本系统的函数image()获得。

首先,使用函数z将所有cbind()值放在一个数据框中。还制作了新的x和y值。

z2<-cbind(z.a,z.b,z.c,z.d,z.e)
x2<-1:5
y2<-1:5

使用函数z绘制image()值。然后使用函数axis()添加轴。要使用库image.plot()中的图例功能fields。在这两个函数中,应使用相同的col=设置。 image.plot()可以生成整个图,但此功能不允许正确修改轴。

par(mar=c(5,5,5,8)) #sets space for legend on right side
image(x2,y2,z2,axes=F,col=rainbow(10))
axis(1,at=1:5)
axis(2,at=1:5,labels=c("A", "B", "C", "D", "E"))
box()
library(fields)
image.plot(x2,y2,z2,legend.only=T,col=rainbow(10))

enter image description here