从本期开始学习折线图的内容。
考虑gapminder数据集中每个国家的期望寿命随时间(年)的变化。 用geom_line()可以画折线图。 因为有许多国家,所以仅指定x、y变量无法得到所需图形,如:
p<- ggplot(data = gapminder,mapping=aes(x=year, y=lifeExp))p+ geom_line()
没有得出我们希望的每个国家一条曲线的效果。 这是因为程序中没有指定需要按照国家分组, 使得同一年的不同国家的坐标连成了一条竖线。要注意的是, geom_line()会自动将x坐标从小到大排序, 然后再连接相邻的点。 如果希望按输入数据的次序连接相邻的点, 需要用geom_path()函数。为了解决上图的问题, 加入按照国家分组的设定。 实际上, 分组(group)与x、y、color、fill一样可以映射到一个变量, 但仅能映射到分类变量。 上述程序的改进如下:
p<- ggplot(data = gapminder,mapping=aes(x=year, y=lifeExp,group=country))p+ geom_line()
结果图形中每一条曲线对应一个国家。 为了查探其中最下方的不稳定曲线是哪一个国家,使用筛选观测的功能:
gapminder %>%filter(lifeExp<30,year>= 1990)
## # A tibble: 1 x 6## country continent year lifeExp pop gdpPercap## <fct> <fct> <int> <dbl> <int> <dbl>## 1 Rwanda Africa 1992 23.6 7290203 737.
该国家为Rwanda。如果需要按照两个或多个分类变量交叉分组, 可以给group维指定interaction(...), 其中...是分类变量表。 geom_line()用来绘制从左向右连接的折线。 比如, 仅绘制Rwanda的期望寿命时间序列:
p<-ggplot(data=filter(gapminder,country=="Rwanda"),mapping=aes(x=year,y=lifeExp))p+geom_line()
如果需要每个点画出散点符号, 可以同时使用geom_point(),如:
p+ geom_line() + geom_point()
用geom_area()作类似图形, 但在折线下方填充颜色:
p<-ggplot(data=filter(gapminder,country=="Rwanda"),mapping=aes(x=year,y=lifeExp))p+geom_area(fill="darkseagreen1",alpha=0.5)
这种图形的纵坐标应该从0开始, 使得阴影部分的大小与纵坐标值成比例, 这也是ggplot2的默认做法。连线图还有一个问题, 就是如果x坐标不是数值型变量而是因子或者字符型, 则两点之间不会相连。 比如,将gapminder的Rwanda子集中的year转换成因子,再画折线图:
d <- gapminder %>%filter(country =="Rwanda") %>%mutate(year = factor(year, levels = seq(1952, 2007, by=5)))p <- ggplot(data = d, mapping = aes(x= year,y= lifeExp))p + geom_line()
## geom_path: Each group consists of only one observation. Do you need to## adjust the group aesthetic?
没有得到应有的结果。 这是因为因子year起到了分组作用, 相当于每个年份为一组, 连线只能在组内连, 但每组仅有一个观测。 这时, 显式地指定group变量可以解决问题:
d<-gapminder%>% filter(country == "Rwanda") %>% mutate(year = factor(year, levels = seq(1952, 2007, by=5)))p<-ggplot(data=d,mapping=aes(x=year,y=lifeExp,group=country))p+geom_line()