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))

geom_bar()繪製長條圖 大规模地添加(譬如给每个点或者bar做标注),使用geom_text()


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) 

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")
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 ...

merge()用這個函數來結合,是一種查表的動作 by.x =“region”, by.y = “Citizenship”—>merge這兩種表

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")

7.3.7 Polygon points need to be ordered by Group
# Reorder the data
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
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"

grep(“China”, intlall$Citizenship, ignore.case=T, value=T) 過濾物件陣列保留特定類別,我要在字串中找到china的詞 這題住要是教如何用行政疆界套圖 1.放地圖的資料框是用多邊形的 2.兩張表的名稱要是一樣的,名稱不一樣就會merge不到

# 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))



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")








LS0tDQp0aXRsZTogIkFTNy0wQyDkuJbnlYzlnLDlnJYiDQphdXRob3I6ICLpmbPmgKHlrokgTTA2NDExMjAxNCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCjxicj4NCg0KYGBge3IgZWNobz1ULCBtZXNzYWdlPUYsIGNhY2hlPUYsIHdhcm5pbmc9Rn0NCnJtKGxpc3Q9bHMoYWxsPVQpKQ0Kb3B0aW9ucyhkaWdpdHM9NCwgc2NpcGVuPTEyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobWFwcykNCmxpYnJhcnkoZ2dtYXApDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KYGBgDQoNCi0gLSAtDQoNCiMjIyA3LjMg5Yqg5by35Z+65pys5ZyW6KGoDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIExvYWQgb3VyIGRhdGEsIHdoaWNoIGxpdmVzIGluIGludGwuY3N2DQppbnRsID0gcmVhZC5jc3YoImRhdGEvaW50bC5jc3YiKQ0Kc3RyKGludGwpDQpgYGANCg0KIyMjIyMgNy4zLjEgQmFyIFBsb3Qgd2l0aCBRdWFudGl0aWVzDQpgYGB7cn0NCiMgV2Ugd2FudCB0byBtYWtlIGEgYmFyIHBsb3Qgd2l0aCByZWdpb24gb24gdGhlIFggYXhpcw0KIyBhbmQgUGVyY2VudGFnZSBvbiB0aGUgeS1heGlzLg0KZ2dwbG90KGludGwsIGFlcyh4PVJlZ2lvbiwgeT1QZXJjZW50T2ZJbnRsKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1QZXJjZW50T2ZJbnRsKSkNCmBgYA0KDQojIyMjIyA3LjMuMiBSZW9yZGVyIGJ5IENvbHVtbg0KYGBge3J9DQojIE1ha2UgUmVnaW9uIGFuIG9yZGVyZWQgZmFjdG9yDQojIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIHJlLW9yZGVyIGNvbW1hbmQgYW5kIHRyYW5zZm9ybSBjb21tYW5kLiANCmludGwgPSB0cmFuc2Zvcm0oaW50bCwgUmVnaW9uID0gcmVvcmRlcihSZWdpb24sIC1QZXJjZW50T2ZJbnRsKSkNCg0KIyBNYWtlIHRoZSBwZXJjZW50YWdlcyBvdXQgb2YgMTAwIGluc3RlYWQgb2YgZnJhY3Rpb25zDQppbnRsJFBlcmNlbnRPZkludGwgPSBpbnRsJFBlcmNlbnRPZkludGwgKiAxMDANCg0KIyBNYWtlIHRoZSBwbG90DQpnZ3Bsb3QoaW50bCwgYWVzKHg9UmVnaW9uLCB5PVBlcmNlbnRPZkludGwpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iZGFyayBibHVlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPVBlcmNlbnRPZkludGwpLCB2anVzdD0tMC40KSArDQogIHlsYWIoIlBlcmNlbnQgb2YgSW50ZXJuYXRpb25hbCBTdHVkZW50cyIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KZ2VvbV9iYXIoKee5quijvemVt+aineWclg0K5aSn6KeE5qih5Zyw5re75Yqg77yI6K2s5aaC57uZ5q+P5Liq54K55oiW6ICFYmFy5YGa5qCH5rOo77yJ77yM5L2/55SoZ2VvbV90ZXh0KCkNCjxicj4NCg0KLSAtIC0NCg0KIyMjIDcuMyDlhajnkIPlnIvpmpvlrbjnlJ/mlbjph48NCg0KIyMjIyMgNy4zLjMgRGF0YSBmb3IgSW50bCcgU3R1ZGVudHMNCmBgYHtyfQ0KbGlicmFyeShnZ21hcCkNCg0KIyBMb2FkIGluIHRoZSBpbnRlcm5hdGlvbmFsIHN0dWRlbnQgZGF0YQ0KaW50bGFsbCA9IHJlYWQuY3N2KCJkYXRhL2ludGxhbGwuY3N2IixzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQ0KDQojIExldHMgbG9vayBhdCB0aGUgZmlyc3QgZmV3IHJvd3MNCiMgaGVhZChpbnRsYWxsKQ0KDQojIFRob3NlIE5BcyBhcmUgcmVhbGx5IDBzLCBhbmQgd2UgY2FuIHJlcGxhY2UgdGhlbSBlYXNpbHkNCmludGxhbGxbaXMubmEoaW50bGFsbCldID0gMA0KDQojIE5vdyBsZXRzIGxvb2sgYWdhaW4NCmhlYWQoaW50bGFsbCkgDQpgYGANCmludGxhbGzmmK/mjIflhajpg6jnmoTlnIvpmpvlrbjnlJ8NCg0KIyMjIyMgNy4zLjQgV29ybGQgTWFwDQpgYGB7cn0NCiMgTG9hZCB0aGUgd29ybGQgbWFwDQp3b3JsZF9tYXAgPSBtYXBfZGF0YSgid29ybGQiKQ0Kc3RyKHdvcmxkX21hcCkNCmBgYA0KDQojIyMjIyA3LjMuNSBNZXJnZSBNYXAgd2l0aCBEYXRhDQpgYGB7cn0NCiMgTGV0cyBtZXJnZSBpbnRsYWxsIGludG8gd29ybGRfbWFwIHVzaW5nIHRoZSBtZXJnZSBjb21tYW5kDQp3b3JsZF9tYXAgPSBtZXJnZSh3b3JsZF9tYXAsIGludGxhbGwsIGJ5LnggPSJyZWdpb24iLCBieS55ID0gIkNpdGl6ZW5zaGlwIikNCnN0cih3b3JsZF9tYXApDQpgYGANCm1lcmdlKCnnlKjpgJnlgIvlh73mlbjkvobntZDlkIjvvIzmmK/kuIDnqK7mn6XooajnmoTli5XkvZwNCiBieS54ID0icmVnaW9uIiwgYnkueSA9ICJDaXRpemVuc2hpcCItLS0+bWVyZ2XpgJnlhannqK7ooagNCg0KDQojIyMjIyA3LjMuNiBQbG90IHRoZSBNYXANCmBgYHtyfQ0KZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKw0KICBnZW9tX3BvbHlnb24oZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArDQogIGNvb3JkX21hcCgibWVyY2F0b3IiKQ0KYGBgDQoNCiMjIyMjIDcuMy43IFBvbHlnb24gcG9pbnRzIG5lZWQgdG8gYmUgb3JkZXJlZCBieSBHcm91cA0KYGBge3J9DQojIFJlb3JkZXIgdGhlIGRhdGENCndvcmxkX21hcCA9IHdvcmxkX21hcFtvcmRlcih3b3JsZF9tYXAkZ3JvdXAsIHdvcmxkX21hcCRvcmRlciksXQ0KDQojIFJlZG8gdGhlIHBsb3QNCmdncGxvdCh3b3JsZF9tYXAsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpICsNCiAgZ2VvbV9wb2x5Z29uKGZpbGw9IndoaXRlIiwgY29sb3I9ImJsYWNrIikNCiAgIyArIGNvb3JkX21hcCgibWVyY2F0b3IiKQ0KYGBgDQoNCiMjIyMjIDcuMy44IElkZW50aWZ5IGFuZCBGaXggTWlzbWF0Y2hzIGJldHdlZW4gTWFwIGFuZCBEYXRhDQpgYGB7cn0NCiMgTGV0cyBsb29rIGZvciBDaGluYQ0KZ3JlcCgiQ2hpbmEiLCBpbnRsYWxsJENpdGl6ZW5zaGlwLCBpZ25vcmUuY2FzZT1ULCB2YWx1ZT1UKSANCmdyZXAoIkNoaW5hIiwgdW5pcXVlKG1hcF9kYXRhKCJ3b3JsZCIpJHJlZ2lvbiksIGlnbm9yZS5jYXNlPVQsIHZhbHVlPVQpIA0KYGBgDQpncmVwKCJDaGluYSIsIGludGxhbGwkQ2l0aXplbnNoaXAsIGlnbm9yZS5jYXNlPVQsIHZhbHVlPVQpIOmBjua/vueJqeS7tumZo+WIl+S/neeVmeeJueWumumhnuWIpe+8jOaIkeimgeWcqOWtl+S4suS4reaJvuWIsGNoaW5h55qE6KmeDQrpgJnpoYzkvY/opoHmmK/mlZnlpoLkvZXnlKjooYzmlL/nlobnlYzlpZflnJYNCjEu5pS+5Zyw5ZyW55qE6LOH5paZ5qGG5piv55So5aSa6YKK5b2i55qEDQoyLuWFqeW8teihqOeahOWQjeeoseimgeaYr+S4gOaoo+eahO+8jOWQjeeoseS4jeS4gOaoo+Wwseacg21lcmdl5LiN5YiwDQpgYGB7cn0NCiMgTGV0cyAiZml4IiB0aGF0IGluIHRoZSBpbnRsYWxsIGRhdGFzZXQNCmludGxhbGwkQ2l0aXplbnNoaXBbaW50bGFsbCRDaXRpemVuc2hpcD09IkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBPZikiXSA9IA0KICAiQ2hpbmEiDQoNCiMgV2UnbGwgcmVwZWF0IG91ciBtZXJnZSBhbmQgb3JkZXIgZnJvbSBiZWZvcmUNCndvcmxkX21hcCA9IG1lcmdlKG1hcF9kYXRhKCJ3b3JsZCIpLCBpbnRsYWxsLCANCiAgICAgICAgICAgICAgICAgIGJ5LnggPSJyZWdpb24iLA0KICAgICAgICAgICAgICAgICAgYnkueSA9ICJDaXRpemVuc2hpcCIpDQp3b3JsZF9tYXAgPSB3b3JsZF9tYXBbb3JkZXIod29ybGRfbWFwJGdyb3VwLCB3b3JsZF9tYXAkb3JkZXIpLF0NCg0KZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKw0KICBnZW9tX3BvbHlnb24oYWVzKGZpbGw9VG90YWwpLCBjb2xvcj0iYmxhY2siKSAjKw0KICAjY29vcmRfbWFwKCJtZXJjYXRvciIpDQpgYGANCg0KIyMjIyMgNy4zLjkgRGlmZmVyZW50IE9yaWVudGF0aW9ucw0KYGBge3J9DQojIFdlIGNhbiB0cnkgb3RoZXIgcHJvamVjdGlvbnMgLSB0aGlzIG9uZSBpcyB2aXN1YWxseSBpbnRlcmVzdGluZw0KZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKw0KICBnZW9tX3BvbHlnb24oYWVzKGZpbGw9VG90YWwpLCBjb2xvcj0iYmxhY2siKSArDQogIGNvb3JkX21hcCgib3J0aG8iLCBvcmllbnRhdGlvbj1jKDIwLCAzMCwgMCkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3Qod29ybGRfbWFwLCBhZXMoeD1sb25nLCB5PWxhdCwgZ3JvdXA9Z3JvdXApKSArDQogIGdlb21fcG9seWdvbihhZXMoZmlsbD1Ub3RhbCksIGNvbG9yPSJibGFjayIpICsNCiAgY29vcmRfbWFwKCJvcnRobyIsIG9yaWVudGF0aW9uPWMoLTM3LCAxNzUsIDApKQ0KYGBgDQo8YnI+DQoNCi0gLSAtDQoNCiMjIyA3LjMg6LOH5paZ57WQ5qeL6L2J5o+bDQoNCiMjIyMjIDcuMy4xMCBSZXNoYXBpbmcgYmVmb3JlIFBsb3RpbmcNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCiMgTm93IGxldHMgbG9hZCBvdXIgZGF0YWZyYW1lDQpob3VzZWhvbGRzID0gcmVhZC5jc3YoImRhdGEvaG91c2Vob2xkcy5jc3YiKQ0Kc3RyKGhvdXNlaG9sZHMpDQpgYGANCg0KYGBge3J9DQojIFBsb3QgaXQNCm1lbHQoaG91c2Vob2xkcywgaWQ9IlllYXIiKSAlPiUgDQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PXZhbHVlLCBjb2xvcj12YXJpYWJsZSkpICsNCiAgZ2VvbV9saW5lKHNpemU9MikgKyBnZW9tX3BvaW50KHNpemU9NSkgKyAgDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgSG91c2Vob2xkcyIpDQpgYGANCjxicj4NCg0KLSAtIC0NCg0KPGJyPjxicj48YnI+PGJyPjxicj4NCg0KPHN0eWxlPg0KLmNhcHRpb24gew0KICBjb2xvcjogIzc3NzsNCiAgbWFyZ2luLXRvcDogMTBweDsNCn0NCnAgY29kZSB7DQogIHdoaXRlLXNwYWNlOiBpbmhlcml0Ow0KfQ0KcHJlIHsNCiAgd29yZC1icmVhazogbm9ybWFsOw0KICB3b3JkLXdyYXA6IG5vcm1hbDsNCiAgbGluZS1oZWlnaHQ6IDE7DQp9DQpwcmUgY29kZSB7DQogIHdoaXRlLXNwYWNlOiBpbmhlcml0Ow0KfQ0KcCxsaSB7DQogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOw0KfQ0KDQoucnsNCiAgbGluZS1oZWlnaHQ6IDEuMjsNCn0NCg0KdGl0bGV7DQogIGNvbG9yOiAjY2MwMDAwOw0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KYm9keXsNCiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7DQp9DQoNCmgxLGgyLGgzLGg0LGg1ew0KICBjb2xvcjogIzAwODgwMDsNCiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7DQp9DQoNCmgzew0KICBjb2xvcjogI2IzNmIwMDsNCiAgYmFja2dyb3VuZDogI2ZmZTBiMzsNCiAgbGluZS1oZWlnaHQ6IDI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpoNXsNCiAgY29sb3I6ICMwMDYwMDA7DQogIGJhY2tncm91bmQ6ICNmZmZmZTA7DQogIGxpbmUtaGVpZ2h0OiAyOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KZW17DQogIGNvbG9yOiAjMDAwMGMwOw0KICBiYWNrZ3JvdW5kOiAjZjBmMGYwOw0KICB9DQo8L3N0eWxlPg0KDQo=