rm(list=ls(all=T))
options(digits=4, scipen=12)
library(dplyr)
library(ggplot2)
library(maps)
library(ggmap)
library(reshape2)

7.3 加強基本圖表

library(ggplot2)
# Load our data, which lives in intl.csv
intl = read.csv("data/intl.csv")
str(intl)
'data.frame':   8 obs. of  2 variables:
 $ Region       : Factor w/ 8 levels "Africa","Asia",..: 2 3 6 4 5 1 7 8
 $ PercentOfIntl: num  0.531 0.201 0.098 0.09 0.054 0.02 0.015 0.002
7.3.1 Bar Plot with Quantities
# We want to make a bar plot with region on the X axis
# and Percentage on the y-axis.
ggplot(intl, aes(x=Region, y=PercentOfIntl)) +
  geom_bar(stat="identity") +
  geom_text(aes(label=PercentOfIntl))

7.3.2 Reorder by Column
# Make Region an ordered factor
# We can do this with the re-order command and transform command. 
intl = transform(intl, Region = reorder(Region, -PercentOfIntl))
# Make the percentages out of 100 instead of fractions
intl$PercentOfIntl = intl$PercentOfIntl * 100
# Make the plot
ggplot(intl, aes(x=Region, y=PercentOfIntl)) +
  geom_bar(stat="identity", fill="dark blue") +
  geom_text(aes(label=PercentOfIntl), vjust=-0.4) +
  ylab("Percent of International Students") +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(angle = 45, hjust = 1))



7.3 全球國際學生數量

7.3.3 Data for Intl’ Students
library(ggmap)
# Load in the international student data
intlall = read.csv("data/intlall.csv",stringsAsFactors=FALSE)
# Lets look at the first few rows
# head(intlall)
# Those NAs are really 0s, and we can replace them easily
intlall[is.na(intlall)] = 0
# Now lets look again
head(intlall) 
7.3.4 World Map
# Load the world map
world_map = map_data("world")
str(world_map)
'data.frame':   99338 obs. of  6 variables:
 $ long     : num  -69.9 -69.9 -69.9 -70 -70.1 ...
 $ lat      : num  12.5 12.4 12.4 12.5 12.5 ...
 $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ region   : chr  "Aruba" "Aruba" "Aruba" "Aruba" ...
 $ subregion: chr  NA NA NA NA ...
7.3.5 Merge Map with Data
# Lets merge intlall into world_map using the merge command
world_map = merge(world_map, intlall, by.x ="region", by.y = "Citizenship")
# merge():「查表」的動作(顏色的資料框+多邊形形式的行政區界圖)
# 資料框 by.x 、 by.y 必須要輸入,才能讓不同格式的資料抄過來~(因為是by region而不是by citizen)
str(world_map)
'data.frame':   63634 obs. of  12 variables:
 $ region         : chr  "Albania" "Albania" "Albania" "Albania" ...
 $ long           : num  20.5 20.4 19.5 20.5 20.4 ...
 $ lat            : num  41.3 39.8 42.5 40.1 41.5 ...
 $ group          : num  6 6 6 6 6 6 6 6 6 6 ...
 $ order          : int  789 822 870 815 786 821 818 779 879 795 ...
 $ subregion      : chr  NA NA NA NA ...
 $ UG             : num  3 3 3 3 3 3 3 3 3 3 ...
 $ G              : num  1 1 1 1 1 1 1 1 1 1 ...
 $ SpecialUG      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ SpecialG       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ ExhangeVisiting: num  0 0 0 0 0 0 0 0 0 0 ...
 $ Total          : int  4 4 4 4 4 4 4 4 4 4 ...
# 當所列的國家結果查不到,R內部預設的做法:「查不到會把資料丟掉」,所以obs資料量變少
7.3.6 Plot the Map
ggplot(world_map, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill="white", color="black") +
  coord_map("mercator")

# 資料一定要先進行整理(re-order),否則圖片會長得很可怕QAQ
7.3.7 Polygon points need to be ordered by Group
# Reorder the data (必做re-order!)
world_map = world_map[order(world_map$group, world_map$order),]
# Redo the plot
ggplot(world_map, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill="white", color="black")

  # + coord_map("mercator")
7.3.8 Identify and Fix Mismatchs between Map and Data
# Lets look for China (找出資料框中所有包含「China」的字眼,之後改名完再做才會出現)
grep("China", intlall$Citizenship, ignore.case=T, value=T) 
[1] "China (People's Republic Of)"
grep("China", unique(map_data("world")$region), ignore.case=T, value=T) 
[1] "China"
# Lets "fix" that in the intlall dataset
intlall$Citizenship[intlall$Citizenship=="China (People's Republic Of)"] = 
  "China"
# We'll repeat our merge and order from before
world_map = merge(map_data("world"), intlall, 
                  by.x ="region",
                  by.y = "Citizenship")
world_map = world_map[order(world_map$group, world_map$order),]
ggplot(world_map, aes(x=long, y=lat, group=group)) +
  geom_polygon(aes(fill=Total), color="black") #+

  #coord_map("mercator")
7.3.9 Different Orientations
# We can try other projections - this one is visually interesting
ggplot(world_map, aes(x=long, y=lat, group=group)) +
  geom_polygon(aes(fill=Total), color="black") +
  coord_map("ortho", orientation=c(20, 30, 0))

ggplot(world_map, aes(x=long, y=lat, group=group)) +
  geom_polygon(aes(fill=Total), color="black") +
  coord_map("ortho", orientation=c(-37, 175, 0))

# 【 行政區套圖 】
###   資料框之間的名稱一定要一致
###   merge是以查表的方式來把不同的資料框合併在一起



7.3 資料結構轉換

7.3.10 Reshaping before Ploting
library(ggplot2)
library(reshape2)
# Now lets load our dataframe
households = read.csv("data/households.csv")
str(households)
'data.frame':   8 obs. of  7 variables:
 $ Year          : int  1970 1980 1990 1995 2000 2005 2010 2012
 $ MarriedWChild : num  40.3 30.9 26.3 25.5 24.1 22.9 20.9 19.6
 $ MarriedWOChild: num  30.3 29.9 29.8 28.9 28.7 28.3 28.8 29.1
 $ OtherFamily   : num  10.6 12.9 14.8 15.6 16 16.7 17.4 17.8
 $ MenAlone      : num  5.6 8.6 9.7 10.2 10.7 11.3 11.9 12.3
 $ WomenAlone    : num  11.5 14 14.9 14.7 14.8 15.3 14.8 15.2
 $ OtherNonfamily: num  1.7 3.6 4.6 5 5.7 5.6 6.2 6.1
# Plot it
melt(households, id="Year") %>% 
  ggplot(aes(x=Year, y=value, color=variable)) +
  geom_line(size=2) + geom_point(size=5) +  
  ylab("Percentage of Households")








LS0tCnRpdGxlOiAiQVM3LTBDIOS4lueVjOWcsOWcliIKYXV0aG9yOiAiTTA2NDYxMDAyMSDmpYrlh7HlgKssIDIwMTgvMDcvMzEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxicj4KCmBgYHtyIGVjaG89VCwgbWVzc2FnZT1GLCBjYWNoZT1GLCB3YXJuaW5nPUZ9CnJtKGxpc3Q9bHMoYWxsPVQpKQpvcHRpb25zKGRpZ2l0cz00LCBzY2lwZW49MTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KHJlc2hhcGUyKQpgYGAKCi0gLSAtCgojIyMgNy4zIOWKoOW8t+WfuuacrOWcluihqAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgTG9hZCBvdXIgZGF0YSwgd2hpY2ggbGl2ZXMgaW4gaW50bC5jc3YKaW50bCA9IHJlYWQuY3N2KCJkYXRhL2ludGwuY3N2IikKc3RyKGludGwpCmBgYAoKIyMjIyMgNy4zLjEgQmFyIFBsb3Qgd2l0aCBRdWFudGl0aWVzCmBgYHtyfQojIFdlIHdhbnQgdG8gbWFrZSBhIGJhciBwbG90IHdpdGggcmVnaW9uIG9uIHRoZSBYIGF4aXMKIyBhbmQgUGVyY2VudGFnZSBvbiB0aGUgeS1heGlzLgpnZ3Bsb3QoaW50bCwgYWVzKHg9UmVnaW9uLCB5PVBlcmNlbnRPZkludGwpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1QZXJjZW50T2ZJbnRsKSkKYGBgCgojIyMjIyA3LjMuMiBSZW9yZGVyIGJ5IENvbHVtbgpgYGB7cn0KIyBNYWtlIFJlZ2lvbiBhbiBvcmRlcmVkIGZhY3RvcgojIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIHJlLW9yZGVyIGNvbW1hbmQgYW5kIHRyYW5zZm9ybSBjb21tYW5kLiAKaW50bCA9IHRyYW5zZm9ybShpbnRsLCBSZWdpb24gPSByZW9yZGVyKFJlZ2lvbiwgLVBlcmNlbnRPZkludGwpKQoKIyBNYWtlIHRoZSBwZXJjZW50YWdlcyBvdXQgb2YgMTAwIGluc3RlYWQgb2YgZnJhY3Rpb25zCmludGwkUGVyY2VudE9mSW50bCA9IGludGwkUGVyY2VudE9mSW50bCAqIDEwMAoKIyBNYWtlIHRoZSBwbG90CmdncGxvdChpbnRsLCBhZXMoeD1SZWdpb24sIHk9UGVyY2VudE9mSW50bCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImRhcmsgYmx1ZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPVBlcmNlbnRPZkludGwpLCB2anVzdD0tMC40KSArCiAgeWxhYigiUGVyY2VudCBvZiBJbnRlcm5hdGlvbmFsIFN0dWRlbnRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCjxicj4KCi0gLSAtCgojIyMgNy4zIOWFqOeQg+Wci+mam+WtuOeUn+aVuOmHjwoKIyMjIyMgNy4zLjMgRGF0YSBmb3IgSW50bCcgU3R1ZGVudHMKYGBge3J9CmxpYnJhcnkoZ2dtYXApCgojIExvYWQgaW4gdGhlIGludGVybmF0aW9uYWwgc3R1ZGVudCBkYXRhCmludGxhbGwgPSByZWFkLmNzdigiZGF0YS9pbnRsYWxsLmNzdiIsc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKCiMgTGV0cyBsb29rIGF0IHRoZSBmaXJzdCBmZXcgcm93cwojIGhlYWQoaW50bGFsbCkKCiMgVGhvc2UgTkFzIGFyZSByZWFsbHkgMHMsIGFuZCB3ZSBjYW4gcmVwbGFjZSB0aGVtIGVhc2lseQppbnRsYWxsW2lzLm5hKGludGxhbGwpXSA9IDAgICAjIOaKiuaJgOacieeahE5B5YC85LulMOWPluS7owoKIyBOb3cgbGV0cyBsb29rIGFnYWluCmhlYWQoaW50bGFsbCkgCmBgYAoKIyMjIyMgNy4zLjQgV29ybGQgTWFwCmBgYHtyfQojIExvYWQgdGhlIHdvcmxkIG1hcAp3b3JsZF9tYXAgPSBtYXBfZGF0YSgid29ybGQiKQpzdHIod29ybGRfbWFwKQpgYGAKCiMjIyMjIDcuMy41IE1lcmdlIE1hcCB3aXRoIERhdGEKYGBge3J9CiMgTGV0cyBtZXJnZSBpbnRsYWxsIGludG8gd29ybGRfbWFwIHVzaW5nIHRoZSBtZXJnZSBjb21tYW5kCndvcmxkX21hcCA9IG1lcmdlKHdvcmxkX21hcCwgaW50bGFsbCwgYnkueCA9InJlZ2lvbiIsIGJ5LnkgPSAiQ2l0aXplbnNoaXAiKSAgICMg5ZCI5L215Zyw5ZyWCiMgbWVyZ2XvvIjvvIk644CM5p+l6KGo44CN55qE5YuV5L2c77yI6aGP6Imy55qE6LOH5paZ5qGG77yL5aSa6YKK5b2i5b2i5byP55qE6KGM5pS/5Y2A55WM5ZyW77yJCiMg6LOH5paZ5qGGIGJ5Lngg44CBIGJ5Lnkg5b+F6aCI6KaB6Ly45YWl77yM5omN6IO96K6T5LiN5ZCM5qC85byP55qE6LOH5paZ5oqE6YGO5L6G772e77yI5Zug54K65pivYnkgcmVnaW9u6ICM5LiN5pivYnkgY2l0aXplbu+8iQpzdHIod29ybGRfbWFwKQojIOeVtuaJgOWIl+eahOWci+Wutue1kOaenOafpeS4jeWIsO+8jFLlhafpg6jpoJDoqK3nmoTlgZrms5XvvJrjgIzmn6XkuI3liLDmnIPmioros4fmlpnkuJ/mjonjgI3vvIzmiYDku6VvYnPos4fmlpnph4/ororlsJEKYGBgCgojIyMjIyA3LjMuNiBQbG90IHRoZSBNYXAKYGBge3J9CmdncGxvdCh3b3JsZF9tYXAsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpICsKICBnZW9tX3BvbHlnb24oZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgY29vcmRfbWFwKCJtZXJjYXRvciIpCiMg6LOH5paZ5LiA5a6a6KaB5YWI6YCy6KGM5pW055CG77yIcmUtb3JkZXLvvInvvIzlkKbliYflnJbniYfmnIPplbflvpflvojlj6/mgJVRQVEKYGBgCgojIyMjIyA3LjMuNyBQb2x5Z29uIHBvaW50cyBuZWVkIHRvIGJlIG9yZGVyZWQgYnkgR3JvdXAKYGBge3J9CiMgUmVvcmRlciB0aGUgZGF0YSAo5b+F5YGacmUtb3JkZXLvvIEpCndvcmxkX21hcCA9IHdvcmxkX21hcFtvcmRlcih3b3JsZF9tYXAkZ3JvdXAsIHdvcmxkX21hcCRvcmRlciksXQoKIyBSZWRvIHRoZSBwbG90CmdncGxvdCh3b3JsZF9tYXAsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpICsKICBnZW9tX3BvbHlnb24oZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKQogICMgKyBjb29yZF9tYXAoIm1lcmNhdG9yIikKYGBgCgojIyMjIyA3LjMuOCBJZGVudGlmeSBhbmQgRml4IE1pc21hdGNocyBiZXR3ZWVuIE1hcCBhbmQgRGF0YQpgYGB7cn0KIyBMZXRzIGxvb2sgZm9yIENoaW5hICjmib7lh7ros4fmlpnmoYbkuK3miYDmnInljIXlkKvjgIxDaGluYeOAjeeahOWtl+ecvO+8jOS5i+W+jOaUueWQjeWujOWGjeWBmuaJjeacg+WHuuePvikKZ3JlcCgiQ2hpbmEiLCBpbnRsYWxsJENpdGl6ZW5zaGlwLCBpZ25vcmUuY2FzZT1ULCB2YWx1ZT1UKSAKZ3JlcCgiQ2hpbmEiLCB1bmlxdWUobWFwX2RhdGEoIndvcmxkIikkcmVnaW9uKSwgaWdub3JlLmNhc2U9VCwgdmFsdWU9VCkgCmBgYAoKYGBge3J9CiMgTGV0cyAiZml4IiB0aGF0IGluIHRoZSBpbnRsYWxsIGRhdGFzZXQKaW50bGFsbCRDaXRpemVuc2hpcFtpbnRsYWxsJENpdGl6ZW5zaGlwPT0iQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIE9mKSJdID0gCiAgIkNoaW5hIiAgICMg6Kq/5pW0TUlU6LOH5paZKOWboOeCuuS4reWci+mAmeeoruiCr+Wumuacg+acieWci+mam+WtuOeUn+S+hueahOWci+WutuS4jeimi+S6hu+8gSkKCiMgV2UnbGwgcmVwZWF0IG91ciBtZXJnZSBhbmQgb3JkZXIgZnJvbSBiZWZvcmUKd29ybGRfbWFwID0gbWVyZ2UobWFwX2RhdGEoIndvcmxkIiksIGludGxhbGwsIAogICAgICAgICAgICAgICAgICBieS54ID0icmVnaW9uIiwKICAgICAgICAgICAgICAgICAgYnkueSA9ICJDaXRpemVuc2hpcCIpCndvcmxkX21hcCA9IHdvcmxkX21hcFtvcmRlcih3b3JsZF9tYXAkZ3JvdXAsIHdvcmxkX21hcCRvcmRlciksXQoKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKwogIGdlb21fcG9seWdvbihhZXMoZmlsbD1Ub3RhbCksIGNvbG9yPSJibGFjayIpICMrCiAgI2Nvb3JkX21hcCgibWVyY2F0b3IiKQpgYGAKCiMjIyMjIDcuMy45IERpZmZlcmVudCBPcmllbnRhdGlvbnMKYGBge3J9CiMgV2UgY2FuIHRyeSBvdGhlciBwcm9qZWN0aW9ucyAtIHRoaXMgb25lIGlzIHZpc3VhbGx5IGludGVyZXN0aW5nCmdncGxvdCh3b3JsZF9tYXAsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpICsKICBnZW9tX3BvbHlnb24oYWVzKGZpbGw9VG90YWwpLCBjb2xvcj0iYmxhY2siKSArCiAgY29vcmRfbWFwKCJvcnRobyIsIG9yaWVudGF0aW9uPWMoMjAsIDMwLCAwKSkKYGBgCgpgYGB7cn0KZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKwogIGdlb21fcG9seWdvbihhZXMoZmlsbD1Ub3RhbCksIGNvbG9yPSJibGFjayIpICsKICBjb29yZF9tYXAoIm9ydGhvIiwgb3JpZW50YXRpb249YygtMzcsIDE3NSwgMCkpCgojIOOAkCDooYzmlL/ljYDlpZflnJYg44CRCiMjIyAgIOizh+aWmeahhuS5i+mWk+eahOWQjeeoseS4gOWumuimgeS4gOiHtAojIyMgICBtZXJnZeaYr+S7peafpeihqOeahOaWueW8j+S+huaKiuS4jeWQjOeahOizh+aWmeahhuWQiOS9teWcqOS4gOi1twoKYGBgCjxicj4KCi0gLSAtCgojIyMgNy4zIOizh+aWmee1kOani+i9ieaPmwoKIyMjIyMgNy4zLjEwIFJlc2hhcGluZyBiZWZvcmUgUGxvdGluZwpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQojIE5vdyBsZXRzIGxvYWQgb3VyIGRhdGFmcmFtZQpob3VzZWhvbGRzID0gcmVhZC5jc3YoImRhdGEvaG91c2Vob2xkcy5jc3YiKQpzdHIoaG91c2Vob2xkcykKYGBgCgpgYGB7cn0KIyBQbG90IGl0Cm1lbHQoaG91c2Vob2xkcywgaWQ9IlllYXIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9dmFsdWUsIGNvbG9yPXZhcmlhYmxlKSkgKwogIGdlb21fbGluZShzaXplPTIpICsgZ2VvbV9wb2ludChzaXplPTUpICsgIAogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgSG91c2Vob2xkcyIpCiMgbWVsdCgpOiDkvp3mrKHlsI3lkITntq3luqbnmoTlkI3nqLHpgLLooYzntYTlkIjlsIcg5pW45pOa6YCy6KGM57ea5oCnL+WQkemHj+WMlgpgYGAKPGJyPgoKLSAtIC0KCjxicj48YnI+PGJyPjxicj48YnI+Cgo8c3R5bGU+Ci5jYXB0aW9uIHsKICBjb2xvcjogIzc3NzsKICBtYXJnaW4tdG9wOiAxMHB4Owp9CnAgY29kZSB7CiAgd2hpdGUtc3BhY2U6IGluaGVyaXQ7Cn0KcHJlIHsKICB3b3JkLWJyZWFrOiBub3JtYWw7CiAgd29yZC13cmFwOiBub3JtYWw7CiAgbGluZS1oZWlnaHQ6IDE7Cn0KcHJlIGNvZGUgewogIHdoaXRlLXNwYWNlOiBpbmhlcml0Owp9CnAsbGkgewogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9CgoucnsKICBsaW5lLWhlaWdodDogMS4yOwp9Cgp0aXRsZXsKICBjb2xvcjogI2NjMDAwMDsKICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsKfQoKYm9keXsKICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsKfQoKaDEsaDIsaDMsaDQsaDV7CiAgY29sb3I6ICMwMDg4MDA7CiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7Cn0KCmgzewogIGNvbG9yOiAjYjM2YjAwOwogIGJhY2tncm91bmQ6ICNmZmUwYjM7CiAgbGluZS1oZWlnaHQ6IDI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmg1ewogIGNvbG9yOiAjMDA2MDAwOwogIGJhY2tncm91bmQ6ICNmZmZmZTA7CiAgbGluZS1oZWlnaHQ6IDI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmVtewogIGNvbG9yOiAjMDAwMGMwOwogIGJhY2tncm91bmQ6ICNmMGYwZjA7CiAgfQo8L3N0eWxlPgoK