R中的image.plot无法在颜色比例尺边缘显示颜色刻度值

7

[这里是R 3.2.5的顶部图像输出,同样的代码在R 2.15.2中产生底部图像,请注意右侧颜色标尺标签的差异。我想解决顶部图形标签的“偏移”问题。此查询中提供的示例代码用于生成两个图形。

请注意两个图像上颜色比例尺标签的差异。顶部图像是R 3.2.5的输出,同样的代码在R 2.15.2中产生底部图像。我想解决顶部图形标签的“偏移”问题,以匹配底部图像。此查询中提供的示例代码用于生成这两个图形。

我正在尝试使用image.plot绘制地图,但颜色比例尺的最小值和最大值未能准确显示。我在R版本3.2.5(2016-04-14);平台:x86_64-w64-mingw32 / x64(64位),以及库包'fields' Spam version 1.4-0(2016-08-29)遇到了此问题

相比之下,相同的命令在R版本2.15.2(2012-10-26);平台:x86_64-w64-mingw32 / x64(64位),以及“fields”包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))

嗨,有人能帮我吗?我也尝试了R版本3.3.1,但遇到了类似的问题。 - Munish
我没有可用的R-2.15.2进行测试,因此无法比较结果。我不知道你所说的“恰好在顶部”是什么意思。你能提供两个版本的图像,并清楚描述问题区域吗? - r2evans
嗨,我在问题中添加了两个版本的输出截图。 - Munish
也许这是个人意见的问题,但我认为最上面(最近的)图像更具代表性:由于渐变被离散化了,0.04和0.8与各自颜色的样本完美对齐(在垂直中心)。话虽如此,我会看看是否能找到调整它的方法... - r2evans
请提出您认为有用的任何建议。 - Munish
我从 fields 包的创建者那里得到了答案。将其粘贴如下。感谢大家的关注。 - Munish
2个回答

6
我能做的最好的回答这个问题就是逃离image.plot()的限制,并在ggplot2中重新编码热图。我编写的代码应该会将您的刻度线重新定位到适当的位置。请注意,在ggplot对象p中,"Var1""Var2"可以根据您希望显示数据的方式进行切换。我使用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)

5
我得到了fields包的创建者的答案。将示例代码粘贴在这里供其他人参考。
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)
     )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接