我有一个包含连续变量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)
现在,对于y
的每个级别(在y轴上显示),我希望根据相应的z值将框填充颜色。例如,地图的A
应填充z.a
,B
填充z.b
所有z
包含相同比例(0,1)的值,并且随着x
是否有任何包执行这些类型的图?如果没有,我怎么能在基础R中编码?
我更喜欢基础R解决方案,但如果不可能有任何其他解决方案。
或者,该图可以被视为y的每个级别的水平条形图,范围为x的整个范围,其颜色将归因于z(每个x)
答案 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))
类似的结果可以通过基本系统的函数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))