วันศุกร์ที่ 6 พฤศจิกายน พ.ศ. 2558

สร้างแผนที่โลกด้วย rworldmap (How to make a world map in R)


 
     แพกเกจ rworldmap บน R ช่วยให้สามารถสร้างแผนที่โลกพร้อมกับการกระจายของข้อมูลที่สนใจดังตัวอย่าง




เช่น ข้อมูลการผลิตข้าวทั่วโลกจาก FAOSTAT ซึ่งเราสามารถดาวโหลดข้อมูลในรูปของไฟล์ csv ได้ ดังรูป


     จากไฟล์ csv ที่ดาวโหลดได้ดังรูป






    เราต้องการข้อมูลเพียงชื่อประเทศและตัวเลขปริมาณผลผลิตเท่านั้น ดังนั้นเราอาจจะลบข้อมูลคอลัมน์อื่นๆ ออกไปก่อนก็ได้ นอกจากนี้เราจำเป็นต้องใช้ code ของชื่อประเทศซึ่ง rworldmap แนะนำให้ใช้ code แบบ ISO3
ซึ่งสามารถหาได้จาก http://unstats.un.org/unsd/methods/m49/m49alpha.htm ซึ่งเราสามารถนำเอามาใส่คู่กับชื่อประเทศในตารางข้อมูลที่เรามีอยู่โดยอาจจะใช้ฟังก์ชั่น vlookup() ใน Excel ดังตัวอย่าง

=VLOOKUP(A2,$G$2:$H$242,2,FALSE)






      จากนั้นเราปรับแต่งข้อมูลให้เรียบร้อยหากมีการใส่ชื่อผิด เนื่องจากวิธีการเขียนชื่อที่แตกต่างกันในแต่ละแหล่งข้อมูล นอกจากนี้ผมได้ปรับให้หน่วยปริมาณการผลิตอยู่ในรุป ล้านตัน (MT) เพื่อความสะดวกในการอ่านค่า


  บน R console ติดตั้งแพกเจกที่ต้องใช้คือ rworldmap

> install.packages("rworldmap")
> library(rworldmap)


เลือกไฟล์ข้อมูล csv ที่เตรียมไว้
> file <-file.choose()
> data <-read.csv(file)
> data

                                     AreaName ISO3     Value         MT
1                                 Afghanistan  AFG    512094   0.512094
2                                     Albania  ALB         0   0.000000
3                                     Algeria  DZA       320   0.000320
4                                      Angola  AGO     37608   0.037608
 


   จากนั้น join ข้อมูลเข้ากับ map

> data.join <-joinCountryData2Map(data,joinCode ="ISO3",nameJoinColumn="ISO3",verbose=TRUE)
122 codes from your data successfully matched countries in the map
1 codes from your data failed to match with a country code in the map
     failedCodes
[1,] "REU"     
122 codes from the map weren't represented in your data


    ข้อความด้านล่างบอกให้ทราบว่ามี 1 code ในข้อมูลของเราที่ไม่สามารถ match กับชื่อในระบบของ rworldmap ได้คือ REU ซึ่งหมายถึงเกาะ Réunion ของฝรั่งเศส (ซึ่งไม่มีใน rworldmap)
     แสดงแผนที่

> mapDevice()
> mapCountryData(data.join, nameColumnToPlot="MT")





   เราสามารถปรับแต่งแผนที่ให้สวยงามและให้ข้อมูลมากขึ้นได้ โดยใช้แพจเกจเพิ่มเติมเช่น RColorBrewer ด้านล่างนี้เป็น code ที่ผมปรับแต่งมา

library(rworldmap)
library(RColorBrewer)
map <-function(){
    file <-file.choose()
    data <-read.csv(file)
    data.join <- joinCountryData2Map(data
    ,joinCode ="ISO3"
    ,nameJoinColumn="ISO3"
    ,verbose=TRUE)
    #getting color palette
    color <- brewer.pal(10,'Spectral')
    mapDevice()
    mapParams <-mapCountryData(data.join
            ,nameColumnToPlot="MT"
            ,catMethod=c(0,0.1,1,10,50,100,150,200,250)
            ,colourPalette=color
            ,mapTitle="World Rice Production")
    do.call(addMapLegend
          ,c(mapParams
          ,legendLabels="all"))
}



หรือแสดงเฉพาะบางพื้นที่ เช่น ในเอเชียเท่านั้น

library(rworldmap)
library(RColorBrewer)
map <-function(){
    file <-file.choose()
    data <-read.csv(file)
    data.join <- joinCountryData2Map(data
    ,joinCode ="ISO3"
    ,nameJoinColumn="ISO3"
    ,verbose=TRUE)
    #getting color palette
    color <- brewer.pal(10,'Spectral')
    mapDevice()
    mapParams <-mapCountryData(data.join
            ,nameColumnToPlot="MT"
            ,catMethod=c(0,0.1,1,10,50,100,150,200,250)
            ,colourPalette=color
            ,mapRegion="asia"
            ,mapTitle="Asia Rice Production")
    do.call(addMapLegend
          ,c(mapParams
          ,legendLabels="all"))
}





ไม่มีความคิดเห็น:

แสดงความคิดเห็น