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


7.3 加強基本圖表

rr library(ggplot2) # Load our data, which lives in intl.csv intl = read.csv(/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

rr # 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=) + geom_text(aes(label=PercentOfIntl))

7.3.2 Reorder by Column

rr # 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=, fill=blue) + geom_text(aes(label=PercentOfIntl), vjust=-0.4) + ylab(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

rr library(ggmap) # Load in the international student data intlall = read.csv(/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)

          Citizenship UG  G SpecialUG SpecialG ExhangeVisiting Total
1             Albania  3  1         0        0               0     4
2 Antigua and Barbuda  0  0         0        1               0     1
3           Argentina  0 19         0        0               0    19
4             Armenia  3  2         0        0               0     5
5           Australia  6 32         0        0               1    39
6             Austria  0 11         0        0               5    16
7.3.4 World Map

rr # Load the world map world_map = map_data() 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

rr # Lets merge intlall into world_map using the merge command world_map = merge(world_map, intlall, by.x =, by.y = ) 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 ...
7.3.6 Plot the Map

rr ggplot(world_map, aes(x=long, y=lat, group=group)) + geom_polygon(fill=, color=) + coord_map()

7.3.7 Polygon points need to be ordered by Group

rr # 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=, color=)

rr # + coord_map()

7.3.8 Identify and Fix Mismatchs between Map and Data

rr # Lets look for China grep(, intlall$Citizenship, ignore.case=T, value=T)

[1] \China (People's Republic Of)\

rr grep(, unique(map_data()$region), ignore.case=T, value=T)

[1] \China\

rr # Lets  that in the intlall dataset intlall\(Citizenship[intlall\)Citizenship==(People’s Republic Of)] =
# We’ll repeat our merge and order from before world_map = merge(map_data(), intlall, by.x =, by.y = ) 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=) #+

rr #coord_map()

7.3.9 Different Orientations

rr # 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=) + coord_map(, orientation=c(20, 30, 0))

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



7.3 資料結構轉換

7.3.10 Reshaping before Ploting

rr library(ggplot2) library(reshape2) # Now lets load our dataframe households = read.csv(/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

rr # Plot it melt(households, id=) %>% ggplot(aes(x=Year, y=value, color=variable)) + geom_line(size=2) + geom_point(size=5) +
ylab(of Households)








LS0tCnRpdGxlOiAiQVM3LTBDIOS4lueVjOWcsOWcliIKYXV0aG9yOiAi5p6X5ZiJ5769IE0wNjQxMTEwMzgsIDIwMTgvMDgvMDEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxicj4KCmBgYHtyIGVjaG89VCwgbWVzc2FnZT1GLCBjYWNoZT1GLCB3YXJuaW5nPUZ9CnJtKGxpc3Q9bHMoYWxsPVQpKQpvcHRpb25zKGRpZ2l0cz00LCBzY2lwZW49MTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KHJlc2hhcGUyKQpgYGAKCi0gLSAtCgojIyMgNy4zIOWKoOW8t+WfuuacrOWcluihqAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgTG9hZCBvdXIgZGF0YSwgd2hpY2ggbGl2ZXMgaW4gaW50bC5jc3YKaW50bCA9IHJlYWQuY3N2KCJkYXRhL2ludGwuY3N2IikKc3RyKGludGwpCmBgYAoKIyMjIyMgNy4zLjEgQmFyIFBsb3Qgd2l0aCBRdWFudGl0aWVzCmBgYHtyfQojIFdlIHdhbnQgdG8gbWFrZSBhIGJhciBwbG90IHdpdGggcmVnaW9uIG9uIHRoZSBYIGF4aXMKIyBhbmQgUGVyY2VudGFnZSBvbiB0aGUgeS1heGlzLgpnZ3Bsb3QoaW50bCwgYWVzKHg9UmVnaW9uLCB5PVBlcmNlbnRPZkludGwpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1QZXJjZW50T2ZJbnRsKSkKYGBgCgojIyMjIyA3LjMuMiBSZW9yZGVyIGJ5IENvbHVtbgpgYGB7cn0KIyBNYWtlIFJlZ2lvbiBhbiBvcmRlcmVkIGZhY3RvcgojIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIHJlLW9yZGVyIGNvbW1hbmQgYW5kIHRyYW5zZm9ybSBjb21tYW5kLiAKaW50bCA9IHRyYW5zZm9ybShpbnRsLCBSZWdpb24gPSByZW9yZGVyKFJlZ2lvbiwgLVBlcmNlbnRPZkludGwpKQoKIyBNYWtlIHRoZSBwZXJjZW50YWdlcyBvdXQgb2YgMTAwIGluc3RlYWQgb2YgZnJhY3Rpb25zCmludGwkUGVyY2VudE9mSW50bCA9IGludGwkUGVyY2VudE9mSW50bCAqIDEwMAoKIyBNYWtlIHRoZSBwbG90CmdncGxvdChpbnRsLCBhZXMoeD1SZWdpb24sIHk9UGVyY2VudE9mSW50bCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImRhcmsgYmx1ZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPVBlcmNlbnRPZkludGwpLCB2anVzdD0tMC40KSArCiAgeWxhYigiUGVyY2VudCBvZiBJbnRlcm5hdGlvbmFsIFN0dWRlbnRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCjxicj4KCi0gLSAtCgojIyMgNy4zIOWFqOeQg+Wci+mam+WtuOeUn+aVuOmHjwoKIyMjIyMgNy4zLjMgRGF0YSBmb3IgSW50bCcgU3R1ZGVudHMKYGBge3J9CmxpYnJhcnkoZ2dtYXApCgojIExvYWQgaW4gdGhlIGludGVybmF0aW9uYWwgc3R1ZGVudCBkYXRhCmludGxhbGwgPSByZWFkLmNzdigiZGF0YS9pbnRsYWxsLmNzdiIsc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKCiMgTGV0cyBsb29rIGF0IHRoZSBmaXJzdCBmZXcgcm93cwojIGhlYWQoaW50bGFsbCkKCiMgVGhvc2UgTkFzIGFyZSByZWFsbHkgMHMsIGFuZCB3ZSBjYW4gcmVwbGFjZSB0aGVtIGVhc2lseQppbnRsYWxsW2lzLm5hKGludGxhbGwpXSA9IDAKCiMgTm93IGxldHMgbG9vayBhZ2FpbgpoZWFkKGludGxhbGwpIApgYGAKCiMjIyMjIDcuMy40IFdvcmxkIE1hcApgYGB7cn0KIyBMb2FkIHRoZSB3b3JsZCBtYXAKd29ybGRfbWFwID0gbWFwX2RhdGEoIndvcmxkIikKc3RyKHdvcmxkX21hcCkKYGBgCgojIyMjIyA3LjMuNSBNZXJnZSBNYXAgd2l0aCBEYXRhCmBgYHtyfQojIExldHMgbWVyZ2UgaW50bGFsbCBpbnRvIHdvcmxkX21hcCB1c2luZyB0aGUgbWVyZ2UgY29tbWFuZAp3b3JsZF9tYXAgPSBtZXJnZSh3b3JsZF9tYXAsIGludGxhbGwsIGJ5LnggPSJyZWdpb24iLCBieS55ID0gIkNpdGl6ZW5zaGlwIikKc3RyKHdvcmxkX21hcCkKYGBgCgojIyMjIyA3LjMuNiBQbG90IHRoZSBNYXAKYGBge3J9CmdncGxvdCh3b3JsZF9tYXAsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpICsKICBnZW9tX3BvbHlnb24oZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgY29vcmRfbWFwKCJtZXJjYXRvciIpCmBgYAoKIyMjIyMgNy4zLjcgUG9seWdvbiBwb2ludHMgbmVlZCB0byBiZSBvcmRlcmVkIGJ5IEdyb3VwCmBgYHtyfQojIFJlb3JkZXIgdGhlIGRhdGEKd29ybGRfbWFwID0gd29ybGRfbWFwW29yZGVyKHdvcmxkX21hcCRncm91cCwgd29ybGRfbWFwJG9yZGVyKSxdCgojIFJlZG8gdGhlIHBsb3QKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKwogIGdlb21fcG9seWdvbihmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpCiAgIyArIGNvb3JkX21hcCgibWVyY2F0b3IiKQpgYGAKCiMjIyMjIDcuMy44IElkZW50aWZ5IGFuZCBGaXggTWlzbWF0Y2hzIGJldHdlZW4gTWFwIGFuZCBEYXRhCmBgYHtyfQojIExldHMgbG9vayBmb3IgQ2hpbmEKZ3JlcCgiQ2hpbmEiLCBpbnRsYWxsJENpdGl6ZW5zaGlwLCBpZ25vcmUuY2FzZT1ULCB2YWx1ZT1UKSAKZ3JlcCgiQ2hpbmEiLCB1bmlxdWUobWFwX2RhdGEoIndvcmxkIikkcmVnaW9uKSwgaWdub3JlLmNhc2U9VCwgdmFsdWU9VCkgCmBgYAoKYGBge3J9CiMgTGV0cyAiZml4IiB0aGF0IGluIHRoZSBpbnRsYWxsIGRhdGFzZXQKaW50bGFsbCRDaXRpemVuc2hpcFtpbnRsYWxsJENpdGl6ZW5zaGlwPT0iQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIE9mKSJdID0gCiAgIkNoaW5hIgoKIyBXZSdsbCByZXBlYXQgb3VyIG1lcmdlIGFuZCBvcmRlciBmcm9tIGJlZm9yZQp3b3JsZF9tYXAgPSBtZXJnZShtYXBfZGF0YSgid29ybGQiKSwgaW50bGFsbCwgCiAgICAgICAgICAgICAgICAgIGJ5LnggPSJyZWdpb24iLAogICAgICAgICAgICAgICAgICBieS55ID0gIkNpdGl6ZW5zaGlwIikKd29ybGRfbWFwID0gd29ybGRfbWFwW29yZGVyKHdvcmxkX21hcCRncm91cCwgd29ybGRfbWFwJG9yZGVyKSxdCgpnZ3Bsb3Qod29ybGRfbWFwLCBhZXMoeD1sb25nLCB5PWxhdCwgZ3JvdXA9Z3JvdXApKSArCiAgZ2VvbV9wb2x5Z29uKGFlcyhmaWxsPVRvdGFsKSwgY29sb3I9ImJsYWNrIikgIysKICAjY29vcmRfbWFwKCJtZXJjYXRvciIpCmBgYAoKIyMjIyMgNy4zLjkgRGlmZmVyZW50IE9yaWVudGF0aW9ucwpgYGB7cn0KIyBXZSBjYW4gdHJ5IG90aGVyIHByb2plY3Rpb25zIC0gdGhpcyBvbmUgaXMgdmlzdWFsbHkgaW50ZXJlc3RpbmcKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwKSkgKwogIGdlb21fcG9seWdvbihhZXMoZmlsbD1Ub3RhbCksIGNvbG9yPSJibGFjayIpICsKICBjb29yZF9tYXAoIm9ydGhvIiwgb3JpZW50YXRpb249YygyMCwgMzAsIDApKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qod29ybGRfbWFwLCBhZXMoeD1sb25nLCB5PWxhdCwgZ3JvdXA9Z3JvdXApKSArCiAgZ2VvbV9wb2x5Z29uKGFlcyhmaWxsPVRvdGFsKSwgY29sb3I9ImJsYWNrIikgKwogIGNvb3JkX21hcCgib3J0aG8iLCBvcmllbnRhdGlvbj1jKC0zNywgMTc1LCAwKSkKYGBgCjxicj4KCi0gLSAtCgojIyMgNy4zIOizh+aWmee1kOani+i9ieaPmwoKIyMjIyMgNy4zLjEwIFJlc2hhcGluZyBiZWZvcmUgUGxvdGluZwpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQojIE5vdyBsZXRzIGxvYWQgb3VyIGRhdGFmcmFtZQpob3VzZWhvbGRzID0gcmVhZC5jc3YoImRhdGEvaG91c2Vob2xkcy5jc3YiKQpzdHIoaG91c2Vob2xkcykKYGBgCgpgYGB7cn0KIyBQbG90IGl0Cm1lbHQoaG91c2Vob2xkcywgaWQ9IlllYXIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9dmFsdWUsIGNvbG9yPXZhcmlhYmxlKSkgKwogIGdlb21fbGluZShzaXplPTIpICsgZ2VvbV9wb2ludChzaXplPTUpICsgIAogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgSG91c2Vob2xkcyIpCmBgYAo8YnI+CgotIC0gLQoKPGJyPjxicj48YnI+PGJyPjxicj4KCjxzdHlsZT4KLmNhcHRpb24gewogIGNvbG9yOiAjNzc3OwogIG1hcmdpbi10b3A6IDEwcHg7Cn0KcCBjb2RlIHsKICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsKfQpwcmUgewogIHdvcmQtYnJlYWs6IG5vcm1hbDsKICB3b3JkLXdyYXA6IG5vcm1hbDsKICBsaW5lLWhlaWdodDogMTsKfQpwcmUgY29kZSB7CiAgd2hpdGUtc3BhY2U6IGluaGVyaXQ7Cn0KcCxsaSB7CiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7Cn0KCi5yewogIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCnRpdGxlewogIGNvbG9yOiAjY2MwMDAwOwogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9Cgpib2R5ewogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9CgpoMSxoMixoMyxoNCxoNXsKICBjb2xvcjogIzAwODgwMDsKICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsKfQoKaDN7CiAgY29sb3I6ICNiMzZiMDA7CiAgYmFja2dyb3VuZDogI2ZmZTBiMzsKICBsaW5lLWhlaWdodDogMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKaDV7CiAgY29sb3I6ICMwMDYwMDA7CiAgYmFja2dyb3VuZDogI2ZmZmZlMDsKICBsaW5lLWhlaWdodDogMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKZW17CiAgY29sb3I6ICMwMDAwYzA7CiAgYmFja2dyb3VuZDogI2YwZjBmMDsKICB9Cjwvc3R5bGU+Cgo=