面积图展现了数值型变量随着另外一个变量变化的趋势。一般都是变量随时间的变化。面积图其实就是折线图,只是在线和X轴之间填满了颜色。面积图一般分为两种:
R base包里面没有对面积图的支持。在ggplot2
里面,geom_area
是用来生成面积图的。
geom_area(mapping = NULL, data = NULL, stat = "identity",
position = "stack", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...)
数据是一个北方城市2019年一月份和2020年一月份的温度。我们用面积图看一下两年的高温趋势和差异。
处理数据的code:
newData2019<-data.frame(c(1:31),tempData2019[,2])
names(newData2019) <- c("date","high")
newData2020<-data.frame(c(1:31),tempData2020[,2])
names(newData2020) <- c("date","high")
newData <- rbind(newData2019, newData2020)
year<- vector(length=62, mode="integer")
year[1:31] <- 2019
year[31:62] <- 2020
newData <- cbind(newData,year)
newData$year <- as.factor(newData$year)
> head(newData)
date high year
1 1 4 2019
2 2 3 2019
3 3 2 2019
4 4 1 2019
5 5 5 2019
6 6 3 2019
geom_area默认是堆积面积图,所有我们需要将position设置成position_dodge()
绘制重叠面积图。
ggplot(newData, aes(x=date,y=high,fill=year)) +
geom_area(position = position_dodge())
重叠面积图会使一部分数值隐藏起来,我们可以设置透明度来解决这个问题。
ggplot2里面用alpha
设置。
ggplot(newData, aes(x=date,y=high,fill=year)) +
geom_area(position = position_dodge(), alpha = 0.5)
基于上面的数据,我们用默认的geom_area参数,画出来的就是堆积面积图。堆积面积图一般表示的是分组和总量的关系。两个温度的比较不是很合适。我们简单修改一下数据。假设是两种东西产品A和产品B的一个月销量。
newData2019<-data.frame(c(1:31),tempData2019[,2])
names(newData2019) <- c("date","sales")
newData2020<-data.frame(c(1:31),tempData2020[,2])
names(newData2020) <- c("date","sales")
newData <- rbind(newData2019, newData2020)
product<- vector(length=62, mode="character")
product[1:31] <- "producet A"
product[31:62] <- "producet B"
newData <- cbind(newData,product)
newData$product <- as.factor(newData$product)
ggplot(newData, aes(x=date,y=sales,fill=product)) +
geom_area()
基于堆积面积图的数据,将position
设置为position_fill()
。生成的就是百分比面积图。
ggplot(newData, aes(x=date,y=sales,fill=product)) +
geom_area(position = position_fill())
geom_ribbon绘制了一个有着最大ymax和最小ymin值的区间图。geom_area是geom_ribbon的一种特殊情况,它的ymin是0.
我找了一个北方城市2019年的一月份温度数据。我们来看看ribbon显示的最高温和最低温的区间图。在画这个图是遇到一个问题,图一直显示不出来,后来发现是日期变量不是POSIXct类型,是factor。转变成datetime类型后,图就成功了。
tempData <- read.csv("2019-01.csv", encoding="UTF-8")
tempData[,1] <- as.POSIXct(tempData[,1])
head(tempData)
日期 高温 低温
1 2019-01-01 4 -6
2 2019-01-02 3 -7
3 2019-01-03 2 -5
4 2019-01-04 1 -5
5 2019-01-05 5 -6
6 2019-01-06 3 -3
ggplot(tempData, aes(x=日期)) + geom_ribbon(aes(ymin=低温, ymax=高温))