annotation_raster函数用于添加单个带有颜色渐变效果的矩形。
library(magick) # 使用image_read
library(plothelper) # 使用enlarge_raster、shading_raster、geom_multi_raster
m1=color Ramp Palette(c("darkorange", "#EC4339", "#BE3F76"))(20)
m1=matrix(m1, nrow=1)
## raster参数应指向一个类型为"raster"或"matrix"的对象;xmin、xmax、ymin、ymax用来指定矩形的边界(图6-1-1a)
p=ggplot()+theme(axis.title=element_blank(), axis.text=element_
blank(), axis.ticks=element_blank())+xlim(0, 10)+ylim(0, 8) # 注意:若不用xlim等函数设定值域,矩形可能无法完整显示
p+annotation_raster(raster=m1, xmin=1, xmax=9, ymin=1, ymax=7)
## 要让渐变更加平滑,需设定interpolate=TRUE (图6-1-1b)
p+annotation_raster(m1, xmin=1, xmax=9, ymin=1, ymax=7, interpolate= TRUE)
##当将边界设置为正负无穷时,可在不设置值域的情况下使矩形延展至面板边缘(图6-1-1c)
m2=matrix(color Ramp Palette(rainbow(10))(30))
p+annotation_raster(m1, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf, interpolate=TRUE)+
annotation_raster(m2, xmin=6, xmax=Inf, ymin=-Inf, ymax=3, interpolate=TRUE)
##图片亦可被当成raster对象放置(图6-1-1d)
img=image_read("box money.jpg")
alp=scales::alpha("khaki", seq(0.1, 1, length.out=20)) # 可在图片上再覆盖一个半透明渐变矩形,以便于添加其他元素
alp=matrix(alp, nrow=1)
p+annotation_raster(img, xmin=0, xmax=10, ymin=0, ymax=8)+
annotation_raster(alp, xmin=0, xmax=10, ymin=0, ymax=8, interpolate= TRUE)
图6-1-1 左上=图a 设置边界,右上=图b 让渐变更加平滑,左下=图c 将边界设置为正无穷或负无穷,右下=图d 添加图片
##要使渐变更为平滑,可使用plothelper包中的enlarge_raster函数增加每行或每列的颜色数。在图6-1-2中,相较于左边的图片,右边的渐变因使用了更多颜色而更加平滑
m1=matrix(c("red", "red", "red", "red", "blue", "red", "red", "red","red"), nrow=3)
m2=enlarge_raster(m1, n=c(40, 50), space="Lab") # 将每行的颜色数增至40,将每列的颜色数增至50,颜色空间设为"Lab"(也可为"rgb")
p+annotation_raster(m1, xmin=0.1, xmax=4.9, ymin=0.1, ymax=7.9, interpolate=TRUE)+ # 不增加颜色
annotation_raster(m2, xmin=5.1, xmax=9.9, ymin=0.1, ymax=7.9, interpolate=TRUE) # 增加颜色(www.xing528.com)
图6-1-2 使用enlarge_raster函数
## 颜色渐变的方式取决于矩阵中颜色的排列(图6-1-3),这一点可通过以下示例中的m1、m2、m3、m4显示出来
m1=color Ramp Palette(c("red", "dodgerblue3"))(3)
m1=matrix(c(
m1[1], m1[2],
m1[2], m1[3]), nrow=2, byrow=TRUE)
m1=enlarge_raster(m1, c(40, 40))
图6-1-3 通过颜色的排列改变渐变方式
set.seed(831); m2=sample(c("skyblue", "lightskyblue", "white","grey95", "grey85"), 64, TRUE, prob=c(0.5, 0.1, 0.1, 0.1, 0.1))
m2=matrix(m2, nrow=8)
m2=enlarge_raster(m2, c(144, 144))
m3=matrix(
c("pink", "pink", "pink", "pink",
"pink", "white", "white", "pink",
"pink", "white", "white", "pink",
"pink", "pink", "pink", "pink"), nrow=4, byrow=TRUE)
m3=enlarge_raster(m3, c(40, 40))
##使用plothelper包中的shading_raster函数可以生成围绕中心点的渐变
m4=shading_raster(nr=41, nc=41, middle=c(1, 21), palette=c("khaki1","grey15"), FUN=sqrt) # 此处参数的含义是:生成一个41行和41列的矩阵,将单元格[1, 21]设为中心,并将其颜色设为"khaki1",其他单元格中的颜色取决于它们与这个中心的距离,距离越远,颜色越偏向"grey15",但在分配颜色前,距离值会被sqrt函数开方(参数FUN指向任意只带一个参数的函数)
p+annotation_raster(m1, xmin=0.1, xmax=4.9, ymin=0.1, ymax=3.9, interpolate=TRUE)+
annotation_raster(m2, xmin=5.1, xmax=9.9, ymin=0.1, ymax=3.9, interpolate=TRUE)+
annotation_raster(m3, xmin=0.1, xmax=4.9, ymin=4.1, ymax=7.9, interpolate=TRUE)+
annotation_raster(m4, xmin=5.1, xmax=9.9, ymin=4.1, ymax=7.9, interpolate=TRUE)
plothelper包中的geom_multi_raster能够代替annotation_raster,并可同时绘制多个渐变矩形,但它使用的数据必须是由tibble包生成的数据框。
dat=tibble::tibble(xmin=c(0.1, 5.1), xmax=c(4.9, 9.9), ymin=c(0.1, 0.1), ymax=c(4.1, 4.1), r=list(m1, m2))
p+geom_multi_raster(data=dat, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, raster=r), flip=FALSE) # 如果使用coord_flip函数,需同时将flip设为TRUE
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。