ggplot2回顾(8): 标度
其实在看这一章之前,我还不怎么能理解“标度”这个词到底指什么。现在有些想法了,比如将一个离散型变量向颜色这个图形属性做映射,变量有几种值就会选用几种颜色,问题是“用什么颜色?”
这就是标度,它被用来完成图形属性映射之后的一些事情。再比如,将一个连续型变量映射给x轴,x轴上面哪些地方有无刻度,x轴的显示范围都需要“标度”来控制。
这张图很有用,你能很清楚的知道图形属性和变量类型一定时,默认的标度是什么,可选的标度有哪些。当然有一些不太常用。
1. 举个例子——关于图例
1.1 修改标度的参数以改变图例的标题和标签
ggplot(data = msleep, aes(x = sleep_total, y = sleep_cycle, color = vore)) +
geom_point() +
scale_color_hue(
"legend of vore",
breaks = c("carni", "herbi", "insecti", "omni", NA),
labels = c("a", "b", "c", "d", "e")
)
怎么知道是scale_color_hue()这个标度函数的,根据上面的表格。
1.2 改变颜色
如果不设置na.value,最后值为NA的点不会画出来
ggplot(data = msleep, aes(x = sleep_total, y = sleep_cycle, color = vore)) +
geom_point() +
scale_color_brewer(palette = "Set1", na.value = "#FC8D62")
breaks, labels, na.value后面会多次提到
2. 标度的通用参数(对x,y,color这些图形属性都适用)
2.1 name
用法:类似scale_x_continuous("xxx")或xlab("xxx"),一种简写。上文中改写图例的名称也用到了。
2.2 limits
用法:类似scale_x_continuous(limits = c(0,15))或xlim(0,15);离散变量是xlim(c("Good","Fair"))
作用:一般用来限定坐标轴的范围,只有处于这个范围内的数据会被拿来画图。
2.3 breaks
作用:设置刻度出现的位置
用法:scale_x_continuous(breaks = c(0,2,4))
2.4 labels
作用:断点处显示的标签
用法:必须和breaks同时存在,scale_x_continuous(breaks = c(0,2,4),labels = c("a","b","c"))
2.5 na.value的妙用
如果想在画图过程中,将超过某一范围的点全都重置为边界值,可以使用它。下图将x=(0,3)之外的点全都画到x=0的位置。
diamonds%>%ggplot(aes(x=carat,y=price))+geom_point()+scale_x_continuous(limits = c(0,3),na.value = 0)
一个重要参数expand
通常图画完之后,画板的范围并不是我们指定的范围,拿上面的图为例,我规定的是x=(0,3),但是两边还是有一些空白区域。一般空白区域是左右各延伸5%的自变量范围。
expand=c(a,b)
扩展画板的范围,假设变量范围是(d=max-min),现在画板的范围是
从min-(a*d+b)到max+(a*d+b)
test_df2 <- data.frame(
x=c(1,2),
y=c(100,200)
)
test_df2%>%ggplot(aes(x,y))+geom_point(size=4)+
scale_x_continuous(expand = c(3,1))
#现在x轴的范围是-3到6
3. 位置标度
3.1 连续型
scale_x_continuous()
scale_y_continuous()
trans参数的使用
3.2 日期和时间
p <- economics%>%ggplot(aes(date,psavert))+geom_line()+geom_hline(yintercept=0,color="grey")
p
p+scale_x_date(breaks = date_breaks("10 years"))
p+scale_x_date(
limits = as.Date(c("2004-1-1","2005-1-1")),
labels = date_format()
)
3.3 离散型
4. 颜色标度
4.1 连续型
双色梯度(low high两个参数)
scale_color_gradient()
scale_fill_gradient()
三色梯度(low mid high三个参数)
scale_color_gradient2()
scale_color_gradient2()
n色梯度
scale_color_gradientn()
scale_fill_gradientn()
一个例子
faithful%>%ggplot(aes(eruptions,waiting))+geom_point()
f2d <- with(faithful,MASS::kde2d(eruptions,waiting,h=c(1,10),n=50))
df <- with(f2d,cbind(expand.grid(x,y),as.vector(z)))
colnames(df) <- c("eruptions","waiting","density")
erupt <- df%>%ggplot(aes(waiting,eruptions))+geom_tile(aes(fill=df$density))+
scale_x_continuous(expand = c(0,0))+
scale_y_continuous(expand = c(0,0))
erupt+scale_fill_gradient(limits=c(0,0.04))
erupt+scale_fill_gradient(limits=c(0,0.04),low="black",high="red")
erupt+scale_fill_gradient2(limits=c(-0.04,0.04),midpoint = mean(df$density),low = "green",high = "red",mid = "black")
#midpoint可以理解为中间色,默认情况下0赋给中间色,此处调整后均值赋给中间色
erupt+scale_fill_gradientn(colors=c("red","black","green","yellow"),limits=c(-0.04,0.04))
纯黑色并不是对应0,而是0上面一点点,这个值是均值。
其实可以看出来,瓦片图可以用来画热图。
4.2 离散型
使用RColorBrewer
scale_color_brewer(palette = "Set1")
scale_fill_brewer(palette = "Set1")
手动更改
scale_color_manual(values = c(......))
下文有
5. 手动离散型标度(重要参数values=c(...))
scale_shape_manual()
scale_linetype_manual()
scale_color_manual()
huron <- data.frame(year = 1875:1972, level = LakeHuron)
ggplot(huron, aes(year)) +
geom_line(aes(y = level - 5,color="a")) +
geom_line(aes(y = level + 5,color="b"))+
scale_color_manual("legend",values=c("a"="blue","b"="red","NA"="orange"))
除了手动离散型标度外,这段代码还有另一个知识点:在aes()里面给一个图形属性映射单个值,可以生成图例。
6. 坐标轴与图例
6.1 通用参数
name: 坐标轴和图例的标题
breaks, labels
上文有
6.2 整体外观(由theme控制)
theme(axis.*,
legend.*)
6.3 网格线的设置
theme(panel.grid.minor = element_blank(),
panel.grid.major = element_blank())
6.4 图例的位置(可选:"right","left","top","bottom","none",c(0.5,0.5))
theme(legend.position =)