2017-02-10 93 views
7

[Here top images is output from R 3.2.5, same code produces bottom image in R 2.15.2, notice the diff in color scale labels on the right side. I want to resolve the 'shift' of labels in the top plot. Sample code given in this query was used to generate both plots.image.plot中的R在色標邊緣

通知的差異在色標上標籤的兩個圖像不顯示colorscale值。頂部圖像是R 3.2.5的輸出,相同的代碼在R 2.15.2中產生底部圖像。我想要解決頂部情節中標籤的'移位'以匹配底部標籤。此查詢中給出的示例代碼用於生成兩個圖。

我正在嘗試使用image.plot繪製地圖,但colorscale的最小值和最大值並不完全顯示在提示處。我在R版本3.2.5(2016-04-14)中遇到了這個問題;平臺:x86_64-w64-mingw32/x64(64位)和庫包'字段'垃圾版本1.4-0(2016-08-29)

相比之下,相同的命令可以正確顯示最小和最大R版本2.15.2(2012-10-26),平臺:x86_64-w64-mingw32/x64(64位)和'字段'包0.41-0(2014-02-26) 。這裏是示例代碼:

library(fields) 
temp <- matrix(data=rexp(200, rate=10), nrow=180, ncol=360) 
min(temp) 
max(temp) 
color_plate <- c("#FF0000", "#FF4D00", "#FF7000", "#FF8A00", "#FFA800", "#FFBF00", "#FFF000", "#FFFF54", "#AAFFFF","#7FFFFF", "#55FFFF", "#2AFFFF", "#00CFFF", "#20BFFF", "#209FFF", "#2060FF") 

zlim <- seq(0.08,0.40,by=0.04) 
temp[temp<min(zlim)] <- min(zlim) 
temp[temp>max(zlim)] <- max(zlim) 

image.plot(temp,col=color_plate, 
      axis.args=list(cex.axis =1,at=zlim, labels=zlim,mgp=c(1, 0, 0),tck=0.1)) 
+0

嗨,誰能幫助我,我也試過[R版本3.3.1和獲得類似的問題.. – Munish

+0

我沒有R-2.15.2可用於測試,所以我不能比較的結果。我不知道你的意思是「正好在提示」。您是否可以提供來自兩個版本的圖像並清楚描述問題區域? – r2evans

+0

嗨,我在問題中添加了兩個版本的輸出截圖。 – Munish

回答

4

我從字段包的包創建者得到的答案。這裏粘貼示例代碼爲其他..

library(fields) 

temp <- matrix(seq(0,.5,,80), 8,10) 

colTab <- c("#FF0000", "#FF4D00","#FF7000", "#FF8A00", "#FF7000") 

N<- length(colTab) 

breaks <- seq(0.08, 0.40, length.out= N+1) 

image.plot(temp, col=colTab, breaks=breaks, 
      axis.args=list(cex.axis =1, at=breaks, labels= breaks, mgp=c(1, 0, 0), tck=0.1) 
    ) 
6

我可以做些什麼來回答這個問題最好是逃跑的image.plot()界限和重新編碼的熱圖中ggplot2。我寫的代碼應該將你的刻度標記重定位到適當的位置。請注意,根據您希望如何顯示數據,可以切換"Var1""Var2"中的ggplot對象p。我用melt()來轉換temp對象,這意味着原來的行/列名稱會丟失。我不確定在image.plot()函數的x/y軸上繪製了哪一個,所以如果我選擇了錯誤的,請確保切換爲"Var1""Var2"

我希望這有助於!

library(fields) 
library(reshape2) 
library(ggplot2) 
library(grid) 

temp <- matrix(data=rexp(200, rate=10), nrow=180, ncol=360) 

color_palette <- c("#FF0000", "#FF4D00", "#FF7000", "#FF8A00", 
     "#FFA800", "#FFBF00", "#FFF000", "#FFFF54", "#AAFFFF","#7FFFFF", 
     "#55FFFF", "#2AFFFF", "#00CFFF", "#20BFFF", "#209FFF", "#2060FF") 

zlim <- seq(0.08,0.40,by=0.04) 
zlim2 <- seq(0.08,0.40,by=0.02) 

temp[temp<min(zlim)] <- min(zlim) 
temp[temp>max(zlim)] <- max(zlim) 
rownames(temp) <- seq(0,1,1/(length(temp[,1])-1)) 
colnames(temp) <- seq(0,1,1/(length(temp[1,])-1)) 

tdm <- melt(temp) 

tdm$val_for_color <- NA 
##can change this as long as you end up with 17 classes (labeled 1-17) for color assignment 
for(i in 1:(length(zlim2)-1)){ 
    tdm$val_for_color[which(tdm$value >= zlim2[[i]] & tdm$value <= zlim2[[i+1]])] <- i 
} 

p <- ggplot(tdm, aes(x = Var1, y = Var2, fill = val_for_color)) + 
     geom_raster() + scale_fill_gradientn(breaks=seq(1,length(zlim),1),colors=color_palette, labels=zlim)+ 
     scale_x_continuous(expand=c(0,0)) + 
     scale_y_continuous(expand=c(0,0)) + 
     guides(fill = guide_colorbar(draw.ulim = TRUE,draw.llim = FALSE, 
         barwidth = 0.7, barheight = 10, limits=c(min(zlim),max(zlim)), raster=FALSE, 
         ticks=FALSE, 
         title=NULL))+ 
     ylab(NULL)+ 
     xlab(NULL)+ 
     theme_bw() 

g <- ggplotGrob(p) 

#this shifts and spreads the labels 
d <-g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]] 
g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]] <- g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]]-d 
for(i in 2:length(g$grobs[[15]][[1]][[1]]$grobs[[3]]$y)){ 
    g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[i]] <- d*5*(i-1) 
} 

grid.draw(g)