# 在背景设置中使用size=1使得分面标题背景轮廓线的粗细为1毫米.
# 12.配色
# 在ggplot2的图形语法中,颜色是一个图形属性(aesthetic)
# 12.1设置对象的颜色
# 对于几何对象(geom),设置colour或者fill参数的值
ggplot(mtcars,aes(x=wt,y=mpg))+geom_point(colour="red")
library(MASS)
ggplot(birthwt,aes(x=bwt))+geom_histogram(fill="red",colour="black")
# 在ggplot2中,设置和映射图形属性有非常重大的区别。
# 一般而言,colour参数控制的是线条、多边形轮廓的颜色,而fill参数控制的是多边形的填充色。
# 对于点形来说,情况略微不同,大多数的点形,整个点的颜色是由color控制的,而不是fill。
# 12.2将变量映射到颜色上
# 对于几何对象,将colour或fill参数的值设置为数据中某一列的列名即可
library(gcookbook)
# 这两种方法效果相同
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(colour="black",position = "dodge",stat = "identity")
ggplot(cabbage_exp,aes(x=Date,y=Weight))+geom_bar(aes(fill=Cultivar),colour="black",position = "dodge",stat = "identity")
# 这两种方法效果相同
ggplot(mtcars,aes(x=wt,y=mpg,colour=cyl))+geom_point()
ggplot(mtcars,aes(x=wt,y=mpg))+geom_point(aes(colour=cyl))
# ggplot()函数中的映射使用的是默认映射(所有几何对象都由此继承).
# 通过在geom系列函数中的具体设置,可以覆盖默认映射。
str(cabbage_exp)
# 在ggplot()中因子化
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl)))+geom_point()
# 另一个方法:在原数据中因子化
m <- mtcars
m$cyl <- factor(m$cyl)
ggplot(m,aes(x=wt,y=mpg,colour=cyl))+geom_point()
# 12.3 对离散型变量使用不同的调色板
# 使用默认调色板和ColorBrewer调色板
library(gcookbook)
# 基础图形
p <- ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+geom_area()
# 这三种方法效果相同
p
p+scale_fill_discrete()
p+scale_fill_hue()
# ColorBrewer调色板
p+scale_fill_brewer()
# 修改调色板就是修改填充色标度(fill)或轮廓色标度(colour):它会设计从连续型或离散型变量到图形属性上映射的改变。在颜色上有两个类型的标度,填充色标度和轮廓色标度。
# 函数scale_fill_hue()中颜色来自HCL色系(hue-chroma-lightness:色相-色度-亮度)的色轮,默认的亮度是65(取值为0~100)。
# 调整参数l(luminance/lightness)的值设置亮度
# 基本的散点图
h <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=sex))+geom_point()
# 默认亮度lightness=65
h
# 略微加深
h+scale_color_hue(l=45)
# ColorBrewer包提供了很多调色板
library(RColorBrewer)
display.brewer.all()
# ColorBrewer调色板可以通过名称来选择
p+scale_fill_brewer(palette = "Oranges")
# 使用灰度调色板,适合黑白打印。标度范围是0~1(其中0对应黑色,1对应白色),灰度调色板的默认范围是0.2~0.8,但可以修改
p+scale_fill_grey()
# 倒转方向并且更改灰度范围
p+scale_fill_grey(start = 0.7,end = 0)
# 12.4 对离散型变量使用自定义调色板
# 使用scale_colour_manual()函数来自定义颜色。其中的颜色可以使已命名的,也可以是RGB形式的
library(gcookbook)
# 基础图形
h <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=sex))+geom_point()
# 使用颜色名
h+scale_color_manual(values = c("red","blue"))
# 使用RGB值
h+scale_colour_manual(values = c("#CC6666","#7777DD"))
# 对于填充色标度,使用scale_fill_manual()代替即可
# 参数values向量中的元素顺序自动匹配离散标度对应因子水平的顺序。
levels(heightweight$sex)
# 如果变量是字符型向量而非因子形式,那么它会被自动转换为因子;顺序也默认地按照字母表排序。
# 如果想自定义颜色分配的顺序,可以使用带有名称的向量参数
h+scale_colour_manual(values = c(m="blue",f="red"))
# R中有很多已经命名的颜色
colors()
# RGB颜色:由6个数字构成(十六进制),每个颜色都由两个数字表示,范围从00到FF
# 调整RGB颜色的经验法则:
# 1.在一般情况下,较大的数字更明亮,较小的数字更暗淡。
# 2.如果要得到灰色,将三个颜色通道设置为相同的值。
# 3.和RGB对立的是CMY(印刷三原色):青(cyan)、品红(magenta)、黄(yellow)。红色通道值越高,颜色越红,越低则越青。
# 同样的法则适用于另外两组颜色对:绿色-品红、蓝色-黄色。
# 12.5使用色盲友好式的调色板
# 使用函数scale_fill_manual(),调色板(cb_palette)用自定义的
library(gcookbook)
# 基础图形
p <- ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+geom_area()
# 加入灰色到调色板
cb_palette <- c("#999999","#E69F00","#56B4E9","#009E73","#F0E442","#0072B2","#D55E00","#CC79A7")
# 将其使用到图形中
p+scale_fill_manual(values = cb_palette)
# 12.6对连续型变量使用自定义调色板
library(gcookbook)
# 基础图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=weightLb))+geom_point(size=3)
p
# 使用两种颜色的渐变色
p+scale_color_gradient(low = "black",high = "white")
# 渐变色中间用白色划分
library(scales)
p+scale_colour_gradient2(low = muted("red"),mid = "white",high = muted("blue"),midpoint = 110)
# n个颜色的渐变色
p+scale_color_gradientn(colours = c("darkred","orange","yellow","white"))
# 对于填充色标度,使用scale_fill_xxx()替换即可,这里xxx是gradient、gradient2或gradientn中的一个
# 将连续型变量映射到颜色标度上需要一组连续变化的颜色。
# muted()函数来自scales包,它会针对输入的颜色输出一个饱和度较低的颜色(RGB格式)
# 如果不想用连续标度,要使用离散(分类)标度,可以将数据重新编码呈分类值
# 12.7根据数值设定阴影颜色
# 增加一列来对y进行划分,然后将该列映射到填充色标度上。
library(gcookbook)
cb <- subset(climate,Source=="Berkeley")
cb$valence[cb$Anomaly10y>=0] <- "pos"
cb$valence[cb$Anomaly10y<0] <- "neg"
cb
ggplot(cb,aes(x=Year,y=Anomaly10y))+geom_area(aes(fill=valence))+geom_line()+geom_hline(yintercept = 0)
# approx()返回一个列表,包含x和y向量
interp <- approx(cb$Year,cb$Anomaly10y,n=1000)
# 放在一个数据框中并重新计算valence
cbi <- data.frame(Year=interp$x,Anomaly10y=interp$y)
cbi$valence[cbi$Anomaly10y>=0] <- "pos"
cbi$valence[cbi$Anomaly10y<0] <- "neg"
# 让阴影区域半透明、改变颜色、移除图例并删除填充区域左右两侧的空余
ggplot(cbi,aes(x=Year,y=Anomaly10y))+geom_area(aes(fill=valence),alpha=.4)+geom_line()+geom_hline(yintercept = 0)+scale_fill_manual(values = c("#CCEEFF","#FFDDDD"),guide=FALSE)+scale_x_continuous(expand = c(0,0))