0

1 つのデータ テーブルで 2 つのバージョンの世界地図を作成しようとしています。データ テーブルの列は次のとおりです。 Country Name iso3 FormDate FormDate 変数は日付です。この場合、国が正式に設立された日付です。(ここに見られるように - http://en.wikipedia.org/wiki/List_of_sovereign_states_by_date_of_formation )

formdate <- read.table(text="
ISO3\tCountry\tFormation Date
DZA\tAlgeria\t07-03-1962
AGO\tAngola\t11-11-1975
BWA\tBotswana\t09-30-1966
CMR\tCameroon\t01-01-1960
BGD\tBangladesh\t03-26-1971
IND\tIndia\t08-15-1947
ISR\tIsrael\t05-14-1948
LOS\tLaos\t10-22-1953
MYS\tMalaysia\t09-16-1963
SGP\tSingapore\t08-09-1965"
,sep="\t",header=TRUE)

> formdate
   ISO3    Country Formation.Date
1   DZA    Algeria     07-03-1962
2   AGO     Angola     11-11-1975
3   BWA   Botswana     09-30-1966
4   CMR   Cameroon     01-01-1960
5   BGD Bangladesh     03-26-1971
6   IND      India     08-15-1947
7   ISR     Israel     05-14-1948
8   LOS       Laos     10-22-1953
9   MYS   Malaysia     09-16-1963
10  SGP  Singapore     08-09-1965

作成したいマップは次のとおりです。

1: 各国が形成された年ごとに色分けされた要約マップで、たとえば 5 ~ 7 のカテゴリに自動的に分類されます。

2: 3 つ折りのファセット マップで、1945 年までに生まれた独立国、1945 年以降 1965 年まで、およびその後の任意の時期の独立国を示す個別のパネルを備えています。問題は、これらのカットオフ年を変更できるようにしたいということです.

この質問は、[R] maps パッケージの使用 - 世界地図上の特定の国での色付け 、独自の値で世界地図を作成する RScript 、および特定の国が記入された R で世界地図を作成する方法に関連していますか? 、私も独自の値でマップを作成しようとしています。

ここでの違いは、日付変数を使用する必要があることです。具体的には、これらの日付のビン化された値をプロットする必要があります。

ヘルプとアドバイスをいただければ幸いです。

4

2 に答える 2

1

rworldmap を使用したソリューションを次に示します。

ライブラリ(rworldmap)

#Your data
formdate <- read.table(text="
ISO3\tCountry\tFormation Date
DZA\tAlgeria\t07-03-1962
AGO\tAngola\t11-11-1975
BWA\tBotswana\t09-30-1966
CMR\tCameroon\t01-01-1960
BGD\tBangladesh\t03-26-1971
IND\tIndia\t08-15-1947
ISR\tIsrael\t05-14-1948
LOS\tLaos\t10-22-1953
MYS\tMalaysia\t09-16-1963
SGP\tSingapore\t08-09-1965"
,sep="\t",header=TRUE)

#just using year as a first step
formdate$Formation.Year<-year(formdate$Formation.Date)

#sPDF <- joinCountryData2Map( formdate, joinCode="ISO3", nameJoinColumn="ISO3")
#joining by country name works better because of incorrect ISO3 code for Laos in the data
sPDF <- joinCountryData2Map( formdate, joinCode="NAME", nameJoinColumn="Country")

#Using defaults, change catMethod, numCats & colourPalette to change map appearance
mapCountryData(sPDF, nameColumnToPlot="Formation.Year")

...そして 2 番目のビットでは、異なる年の地図を含む 3 つのパネルを作成します。

#I've used these breaks that work with your sample data, 
#simply cahnge to work with full dataset
yearBreak1 <- 1960
yearBreak2 <- 1970

oldPar <- par(mar=c(0.7, 0, 0, 0)) #set margins for subplots top,bottom,left,right
#use layout to set up 3 panels
nPanels <- layout( cbind(c(0,1:3))
                   , heights=c(lcm(0.5),c(1,1,1))
                   , respect=F )

#add a constant column to allow plotting all countries the same colour 
formdate$constant <- 1

#subet data by yearBreaks
dF1 <- formdate[ formdate$Formation.Year <= yearBreak1, ]  
dF2 <- formdate[ formdate$Formation.Year > yearBreak1 & formdate$Formation.Year <= yearBreak2, ]                          
dF3 <- formdate[ formdate$Formation.Year > yearBreak2, ]                          

#join to a map
sPDF1 <- joinCountryData2Map( dF1, joinCode="NAME", nameJoinColumn="Country")
sPDF2 <- joinCountryData2Map( dF2, joinCode="NAME", nameJoinColumn="Country")
sPDF3 <- joinCountryData2Map( dF3, joinCode="NAME", nameJoinColumn="Country")

#plot & add titles
mapCountryData(sPDF1, nameColumnToPlot="constant", catMethod='categorical', addLegend=FALSE, mapTitle="" )
mtext(paste("<=",yearBreak1))
mapCountryData(sPDF2, nameColumnToPlot="constant", catMethod='categorical', addLegend=FALSE, mapTitle="" )
mtext(paste(">",yearBreak1,"& <=",yearBreak1))
mapCountryData(sPDF3, nameColumnToPlot="constant", catMethod='categorical', addLegend=FALSE, mapTitle="" )     
mtext(paste(">",yearBreak2))

これを生成する必要があります: rworldmap プロット

于 2013-10-21T14:39:47.260 に答える
1

おそらく最も簡単な方法ではありませんが、最初のポイントに対する解決策は次のとおりです。

# First changing the class of the two columns we're going to use:
formdate$Formation.Date<-as.Date(formdate$Formation.Date, "%m-%d-%Y")
formdate$ISO3<-as.character(formdate$ISO3)
formdate$ISO3[8]<-"LAO" #Laos'ISO3 code is "LAO" and not "LOS" in the wrld_simpl data
# Make regular temporal interval
intval <- cut(formdate$Formation.Date, 
              breaks = seq(min(formdate$Formation.Date),max(formdate$Formation.Date),length=5), 
              right=TRUE, include.lowest=TRUE) # So that the intervals include the lowest date and the highest
# Make these values correspond with their polygons
library(maptools)
data(wrld_simpl)
f <- rep(NA,nrow(wrld_simpl@data))
f[sapply(formdate$ISO3,function(x)which(wrld_simpl$ISO3==x))] <- intval
# Plot
plot(wrld_simpl, col=(1:6)[f])

あなたの2番目のポイントについて:

#This time you can define your breakpoints before hand (don't forget to include a minimum age and a maximum age)
d <- c("1900/01/01","1945/01/01","1965/01/01","2020/01/01")
intval <- cut(formdate$Formation.Date, 
                  breaks = as.Date(d))
f <- rep(0,nrow(wrld_simpl@data))
f[sapply(formdate$ISO3,function(x)which(wrld_simpl$ISO3==x))] <- intval

そしてプロット:

par(mfcol=c(3,1)) #Here, three vertical panels
for(i in 1:3){
   par(mar=c(0,0,0,0))
   plot(wrld_simpl) #First plot the whole world
   if(any(f==i)){
       plot(wrld_simpl[f==i,],add=TRUE,col="red") #Then the countries that belong to the proper category
       }
   }
于 2013-10-21T08:16:13.123 に答える