使用geom_point和geom_tile进行离散比例时变换图例(ggplot2)

时间:2015-02-07 02:33:22

标签: r ggplot2 legend

我试图从不同的模拟中绘制降水趋势。我有一个这样的数据框,叫做df:

    Type season     X       Y     Val
1 25 Ana Annual 76000 2393000  9.724501  
2 25 Ana Annual 76000 2401000 30.416625 
3 25 Ana Annual 84000 2361000  9.724501  
4 25 Ana Annual 84000 2401000  8.234632  
5 25 Ana Annual 84000 2409000 30.416625 
6 25 Ana Annual 84000 2417000 30.416625 
...

类型可以有四个不同的值:25 Ana,SST80 T25,25 CD,Hom

季节可以有五个不同的值:年度,春季,夏季,秋季,冬季

X和Y是覆盖法国的坐标

Val是趋势

我不想绘制连续值,因此我创建了具有离散比例的类。我为季节=年度和季节=(春季或夏季或秋季或冬季)创建两个不同的量表,因为趋势不具有相同的数量级。

coup_a <- c(-127.0405, -110.0000, -100.0000,  -90.0000,  -80.0000,  -70.0000,  -60.0000,  -50.0000,  -40.0000,  -30.0000,  -20.0000,  -10.0000,    0.0000, 10.0000,   20.0000,   30.0000,   40.0000,   50.0000,   60.0000,   70.0000,   80.0000,   90.0000,  100.0000,  110.0000,  127.0405)
lab_a <- c("-110", "-100", "-90",  "-80",  "-70",  "-60",  "-50",  "-40",  "-30",  "-20",  "-10",  "0",    "10",   "20",   "30",   "40",   "50",   "60",  "70", "80", "90",   "100",  "110",  " ")

coup_s <-  c(-72.60114, -40.0000, -35.0000, -30.0000, -25.0000, -20.0000, -15.0000, -10.0000, -5.0000,  0.0000, 5.0000, 10.0000, 15.0000,  20.0000,  25.0000, 30.0000, 35.0000,  40.0000, 72.60114)
lab_s <- c("-40", "-35", "-30", "-25",  "-20", "-15",  "-10", "-5",  "0",  "5",  "10", "15",  "20",  "25", "30", "35", "40",   " ")

pl_a <- df[df$season=="Annual",]
pl_s <- df[df$season=="Spring" | df$season=="Summer" | df$season=="Autumn" | df$season=="Winter",]

现在由于我的两个尺度,我创建了离散类:

pl_a$Val2 <- cut(pl_a$Val, breaks=coup_a, labels =lab_a) 
pl_s$Val2 <- cut(pl_s$Val, breaks=coup_s, labels =lab_s) 

将colorbrewer颜色插值为具有与类相同数量的颜色

getPalette <- colorRampPalette(brewer.pal(11, "RdYlBu"))
colors_a <- getPalette(length(lab_a))
colors_s <- getPalette(length(lab_s))

情节:

p <- ggplot()
p <- (p    
      + theme_bw()
      + facet_grid(saison ~ Type))

p <- (p  + scale_y_continuous(limits=c(1580000,2730000),
                              breaks=seq(1600000,2700000, 200000), 
                              labels= seq(1600,2700,200), expand=c(0,0))
      + scale_x_continuous(limits=c(0,1250000), 
                           breaks= seq(0,1250000, 400000), 
                           labels= seq(0,1250, 400), expand=c(0,0))
      + theme(panel.grid.major = element_blank(), axis.ticks=element_blank(), axis.title=element_blank(), axis.text=element_blank(), legend.key.size=unit(0.5, "cm"), legend.position="bottom")
      + coord_fixed(ratio=1, xlim=c(0, 1100000), ylim=c(1600000, 2730000)))



p1 <- (p
       + scale_fill_manual(name = "Trend", values = setNames(colors_a, lab_a), limits=lab_a, breaks=rev(lab_a), labels=rev(tex_a), na.value="black", guide=guide_legend(label.hjust=-2, label.position="bottom"))
       + geom_tile(data = pl_a[pl_a$Type=="25 Ana" | pl_a$Type=="SST80 T25" | pl_a$Type=="25 CD" | pl_a$Type=="Safran"),], aes(x=X, y=Y, fill= Val2))
       + geom_point(data = pl_a[pl_a$Type=="Hom",], aes(x=X, y=Y, fill= Val2), shape=21, size=2))

p2 <- (p
       + scale_fill_manual(name = "Trend", values = setNames(colors_s, lab_s), limits=lab_s, breaks=rev(lab_s), labels=rev(tex_s), na.value="black", guide=guide_legend(label.hjust=-2, label.position="bottom"))
       + geom_tile(data = pl_s[(pl_s$Type=="25 Ana" | pl_s$Type=="SST80 T25" | pl_s$Type=="25 CD" | pl_s$Type=="Safran"),], aes(x=X, y=Y, fill= Val2))
       + geom_point(data = pl_s[pl_s$Type=="Hom",], aes(x=X, y=Y, fill= Val2), shape=21, size=2))

grid.arrange(p1,p2, heights=c(1, 2.64))

tex_s和tex_a只是两个向量,如lab_s和lab_a(相同的长度),但每个类只有一个值,以便具有可读的比例:

tex_s <- c("-40", " ", "-30", " ",  "-20", " ",  "-10", " ",  "0",  " ",  "10", " ",  "20",  " ", "30", " ", "40",   " ")

它给了我:

enter image description here

正如你所看到的,我有一个特例,因为我在法国只有少数点为Type = Hom,而所有法国都有其他类型。这就是为什么我需要使用geom_tile和三种类型,geom_point使用type = Hom。

我有三个问题:

1)如何删除图例中的黑色圆圈而不在地图中删除它们?

2)我使用grid.arrange和高度(1,2.64)但实际上我只是测试了数字与年度地图和其他地图的大小大致相同,但我并不是真的了解它代表什么。如果有人可以告诉我?

3)为了简化比例,我使用&#34; lab&#34;但是为了得到正确的比例,值应该在两个类之间移动,如下所示(值与此不匹配):

enter image description here

当我的图例位于地图的右侧时(不使用legend.position =&#34; bottom&#34;)我可以使用legend.vjust = +/- 1.5来移动值,并且效果很好。但是当图例位于地图下方时,我会尝试使用legend.hjust,但它不起作用。正如你所看到的,0从两个班级转移而其他数字仍在同一个位置......我该怎么办?

感谢您的帮助

0 个答案:

没有答案