2017-09-01 4 views
1

質問1:私はggplot2パッケージを使用しています。グローバル水域(変数1)とグローバルランド(変数2)の2つの異なるラスタ変数をマップしたいと思います。私はそれぞれに2つの異なる色のスケールが必要です。私が知る限り、ggplot2を使用すると、1つのカラースケールしか受け入れられません。私は2つのカラーパレット "jet.colors"と "YlOrBr"を持っています。私はそれぞれを変数の1つに割り当てたいと思います。 These figures show spatial coverage of the two variables using solid colors and just one color palette(jet.colors)。変数1にjet.colorsを割り当て、変数2に YlOrBrを割り当てたいと思います。コードとデータが提供されています。質問2:私のプロジェクトでは、variable1とvariable2の両方に3つのディメンションがあり、このディメンションは時間を意味します(3ディメンションのサイズは50です)。私は50の地図をプロットしたい。私は、すべてのマップの各変数に1つの色のスケールを持たせることに興味があります。カラースケールの最大値および最小値は、max(variable1 [、3、]、na.rm = TRUE)およびmin(variable1 [、3、]、na.rm = TRUE)およびmax(variable2 [ ]、na.rm = TRUE)、min(variable2 [、3、]、na.rm = TRUE)をそれぞれ変数1と変数2とする。各変数のカラースケールを取得するには、元のデータに基づいて2つの変数の最大値と最小値を求めた後、variable1 [、3]とvariable3 [、3、]をリサイズしました。私はあなたの助けに感謝します。ラスタデータのマッピング複数の色の縮尺でggplot2を使用する

jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", 
"#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) 
YlOrBr <- c("#FFFFD4", "#FED98E", "#FE9929", "#D95F0E", "#993404") 
Variable1 <- read.table("Variable1.txt",header = TRUE, sep = "\t"); 
Variable2 <- read.table("Variable2.txt",header = TRUE, sep = "\t"); 

Variable1=as.data.frame(Variable1) 
Variable2=as.data.frame(Variable2) 

librray(ggplot2) 
map.world <- map_data("world") 
gg <- ggplot() 
gg <- gg + geom_raster(data= Variable1, aes( Variable1$V2, 
Variable1$V1,fill= Variable1$V3)) 
gg <- gg + geom_raster(data= Variable2, aes( Variable2$V2, 
Variable2$V1,fill= Variable2$V3)) 
gg <- gg +scale_fill_gradientn(colours=jet.colors(7)) 
gg <- gg + geom_map(dat=map.world, map = map.world, aes(map_id=region), 
fill="NA", color="black",size=0.4) 
gg <- gg + expand_limits(x = map.world$long, y = map.world$lat) 
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank()) 
gg <- gg + theme(axis.ticks=element_blank(), axis.text=element_blank()) 
gg <- gg + theme(legend.position="right",plot.title = element_text(size = 10, 
face = "bold")) 
gg <- gg 
+theme(axis.title.x=element_blank())+theme(axis.title.y=element_blank()) 
gg <- gg+ coord_equal() 
gg 

You can get the data here

答えて

0

私は非重複領域に塗りつぶしをマッピングすることによって、ggplotでこの制限を回避ました:

library(ggplot2) 
library(scales) 
library(gridExtra) 
library(grid) 

jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) 
YlOrBr <- c("#FFFFD4", "#FED98E", "#FE9929", "#D95F0E", "#993404") 
Variable1 <- read.table("Variable1.txt",header = TRUE, sep = "\t"); 
Variable2 <- read.table("Variable2.txt",header = TRUE, sep = "\t"); 

Variable1=as.data.frame(Variable1) 
Variable2=as.data.frame(Variable2) 
Variable1$V3_rescale = rescale(Variable1$V3) 
Variable2$V3_rescale = rescale(Variable2$V3)+100 # Map to non-overlapping range 


map.world <- map_data("world") 
gg <- ggplot() + 
    geom_raster(data= Variable1, aes(V2,V1,fill=V3_rescale)) + 
    geom_raster(data=Variable2, aes(V2,V1,fill=V3_rescale)) + 
    scale_fill_gradientn(
    colours=c(jet.colors(7),YlOrBr), 
    values = rescale(
     c(rescale(seq(from = min(Variable1$V3), # range for Variable 1 
        to = max(Variable1$V3), 
        length.out=7)), 
     rescale(seq(from = min(Variable2$V3), # range for Variable 2 
        to = max(Variable2$V3), 
        length.out = length(YlOrBr)))+100))) 

gg <- gg + geom_map(dat=map.world, map = map.world, aes(map_id=region), 
        fill="NA", color="black",size=0.4) 
gg <- gg + expand_limits(x = map.world$long, y = map.world$lat) 
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank()) 
gg <- gg + theme(axis.ticks=element_blank(), axis.text=element_blank()) 
gg <- gg + theme(legend.position="right",plot.title = element_text(size = 10, 
                    face = "bold")) 
gg <- gg +theme(axis.title.x=element_blank())+theme(axis.title.y=element_blank()) 
gg <- gg + coord_equal() + theme(legend.position = "none") # remove legend 

凡例を追加するには、私はこのポストInserting a table under the legend in a ggplot2 histogramから答えを変更:

# Make plot with only Variable 1 to extract legend 
Variable1_plot <- ggplot() + 
    geom_raster(data= Variable1, aes(V2,V1,fill=V3)) + 
    scale_fill_gradientn(colours = jet.colors(7)) + 
    guides(fill=guide_legend(title="Variable1")) 

# Make plot with only Variable 2 to extract legend 
Variable2_plot <- ggplot() + 
    geom_raster(data= Variable2, aes(V2,V1,fill=V3)) + 
    scale_fill_gradientn(colours = YlOrBr) + 
    guides(fill=guide_legend(title="Variable2")) 

#Extract Legend 
g_legend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend)} 

legend_Variable1 <- g_legend(Variable1_plot) 
legend_Variable2 <- g_legend(Variable2_plot) 

grid.newpage() 
vp1 <- viewport(width = 0.75, height = 1, x = 0.375, y = .5) 
vpleg <- viewport(width = 0.25, height = 0.5, x = 0.85, y = 0.75) 
subvp <- viewport(width = 0.3, height = 0.3, x = 0.85, y = 0.25) 
print(gg, vp = vp1) 
upViewport(0) 
pushViewport(vpleg) 
grid.draw(legend_Variable2) 
#Make the new viewport active and draw 
upViewport(0) 
pushViewport(subvp) 
grid.draw(legend_Variable1) 
+0

ありがとうございます実際の値(リスケール前の値)と別に地図の横に両方の色の尺度を持たせますか? – Sam

+0

@Sam編集された回答を参照してください。 –

+0

from = min(Variable1 $ V3_rescale)、Variable 1の範囲# 〜= max(Variable1 $ V3)、..... なぜV3_rescaleとV3の両方をここで使用しましたか? – Sam

関連する問題