0

我正在使用以下代码在地图上绘制条形图,如下所示:Bars to plotted over map

    ddf = read.table(header=T, sep=",", text="
    country, val1, val2, val3
    Nigeria,5,10,8
    China,25,12,20
    Brazil,50,9,20
    Italy,75,25,5
    Australia,100,5,25
    ")

ddf = structure(list(country = structure(c(5L, 3L, 2L, 4L, 1L), .Label = c("Australia", 
"Brazil", "China", "Italy", "Nigeria"), class = "factor"), val1 = c(5L, 
25L, 50L, 75L, 100L), val2 = c(10L, 12L, 9L, 25L, 5L), val3 = c(8L, 
20L, 20L, 5L, 25L)), .Names = c("country", "val1", "val2", "val3"
), class = "data.frame", row.names = c(NA, -5L))

    require (rworldmap)

    sPDF <- joinCountryData2Map(ddf
        , joinCode = "NAME"
        , nameJoinColumn = "country"
        , verbose = TRUE)

    plot(getMap())

    require(TeachingDemos)
    df <- cbind(ddf, sPDF@data[sPDF@data$ADMIN %in% ddf$country, c("LON", "LAT")])
    for (i in 1:nrow(df)) 
      subplot(barplot(height=unlist(df[i, 2:4], use.names=F), 
                      axes=F, 
                      col=rainbow(3), ylim=range(df[,2:4])),
              x=df[i, 'LON'], y=df[i, 'LAT'], size=c(.3, .3))

条形图绘制得非常好,但大小不对应。情节如下所示(注意最高的第一条在尼日利亚而不是澳大利亚和巴西的第一条应该比中国大):

在此处输入图像描述

4

1 回答 1

1

背后的原因是你在做盲目的 cbind ...并且返回的数据sPDF@data[sPDF@data$ADMIN %in% ddf$country, c("LON", "LAT")]与它们在 ddf 中的 seq 不同。试试这个

df <- merge(x = ddf, y = sPDF@data[sPDF@data$ADMIN %in% ddf$country, c('ADMIN',"LON", "LAT")],
            by.x= 'country', by.y = 'ADMIN')
for (i in 1:nrow(df)) 
  subplot(barplot(height=unlist(df[i, 2:4], use.names=F), 
                  axes=F, 
                  col=rainbow(3), ylim=range(df[,2:4])),
          x=df[i, 'LON'], y=df[i, 'LAT'], size=c(.3, .3))

之后的结果将是

在此处输入图像描述

在上图中,所有条形图的范围都相同,即您在代码片段中提到的 5 到 100。

于 2014-06-17T08:33:06.390 回答