可能有问题,但它为我完成了工作。首先,我定义了一个函数,以 rworldmap 同意的形式给我一个调色板。
mkrwg <- function( plotvar, length.out= 100, col.neg= "red", col.zero= gray(0.9), col.pos= "blue" ) {
rl <- abs(min(plotvar))/(max(plotvar) - min(plotvar))
rr <- abs(max(plotvar))/(max(plotvar) - min(plotvar))
rw <- head(colorRampPalette(c(col.neg, grey(0.9)))( rl * (length.out+1) ), -1) ## remove one duplicate to merge
wg <- colorRampPalette(c(gray(0.9), col.pos))( rr * (length.out+1) )
c(rw,wg)
}
## test out color range
plotvar <- c(-0.1,0.1,seq( -20, 5, 1 )) ## more range on the left
rwg <- mkrwg( plotvar )
o <- as.data.frame(do.call("rbind", lapply( 1:length(plotvar), function(wi) {
## cnvx is a little big buggy here, because -0.1 should be E6E6E6 rather than E6E3E3
## but this is just a test function
cnvx <- function(x) (x - min(plotvar))/(max(plotvar)-min(plotvar))
mci <- as.integer(cnvx( plotvar[wi] )*(length( rwg )-1)) + 1
data.frame(obs=wi, val=plotvar[wi], calcindex=mci, coli=rwg[mci])
})))
print(o)
plot( o$val, (1:length(o$val)) %% 2, col=o$coli, cex=5, pch=16 ) ## zero value in gray
这产生
好的,我们将零值与我们非常浅的灰色相匹配。现在添加以下内容:
################################################################
## now integrate into rworldmap
################################################################
dev.new() ## draw another figure now
plot.world <- function( ccode3, plotvar ) {
dcs <- data.frame( ccode3, plotvar )
sPDF <- joinCountryData2Map( dcs, joinCode = "ISO3", nameJoinColumn = "ccode3")
sPDF <- sPDF[-which(getMap()$ADMIN=="Antarctica"),]
rwgp <- mkrwg( plotvar )
#better: par(mar= c(0,0,8,0), mai= c(0.3,0,0,0))
mapCountryData( sPDF,
mapTitle="",
colourPalette=rwgp,
nameColumnToPlot= "plotvar",
numCats=max(10,length(plotvar)),
catMethod= "pretty",
#addLegend=F,
oceanCol='lightblue', borderCol="black", missingCountryCol="black" )
iaw$hline( 0, lwd=0.5 )
iaw$hline( c(-23.5, 23.5, 66.6), lwd=0.5, lty=3 )
}
library("rworldmap")
plot.world(c("USA", "MEX", "BRA", "RUS", "SDN", "CHN", "NZL", "AUS"),
c(-4, -3, -3, -2, -1, 0, 0.5, 1) )
这产生
在这个例子中,中国是零。
小号: