R语言数据可视化教程(ggplot2)_控制图形的整体外观及增加图例

# 9.控制图形的整体外观
# 9.1 设置图形标题
# 使用ggtitle()设置标题
library(ggplot2)
library(gcookbook)
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()
p + ggtitle("Age and Height of Schoolchildren")
# 使用\n来换行
p +ggtitle("Age and Height\nof Schoolchildren")
# 使用ggtitle()与使用labs(title="标题文本")是等价的


# 如果希望将标题移动到绘图区域内部,可以使用两种方法
# 第一种方法是将一个负的vjust值与ggtitle()配合使用,这种方法的缺点是在绘图区域的上方仍然会有空白的空间。
# 第二种方式则是使用一个文本注解,设定其x的位置为x值域的中间,y的位置为Inf,这样就会将其置于绘图区域的顶部。这种方法需要同时使用vjust为正值,以使文本完全落入绘图区域
# 移动标题到内部
p+ ggtitle("Age and Height of Schoolchildren")+theme(plot.title = element_text(vjust=-2.5))
# 或使用一个文本型注解
p+ annotate("text",x=mean(range(heightweight$ageYear)),y=Inf,label="Age and Height of Schoolchildren",vjust=1.5,size=6)


# 9.2修改文本外观
# 要设置如标题、坐标轴标签和坐标轴刻度线等主题项目(theme item)的外观,使用theme()并通过element_text()设定对应项目的属性即可
library(gcookbook)
# 基本图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()
# 主题项目外观的控制
p+theme(axis.title.x = element_text(size = 16,lineheight = .9,family = "Times",face = "italic",colour = "red"))
p+ggtitle("Age and Height\nof Schoolchildren")+theme(plot.title = element_text(size = rel(1.5),lineheight = .9,family = "Times",face = "bold.italic",colour = "red"))
# rel(1.5)表示字体大小将为当前主题基准字体大小的1.5倍
# 对于主题元素来说,字体大小(size)的单位为磅(pt)
# 要设置文本几何对象的外观,只需设置其文本属性即可
p+annotate("text",x=15,y=53,label="Some text",size=7,family="Times",fontface="bold.italic",colour="red")
p+geom_text(aes(label=weightLb),size=4,family="Times",colour="red")
# 对于文本几何对象,字体大小的单位为毫米(mm)
# 在ggplot2中,文本项目分为两类:主题元素和文本几何对象。主题元素包括图形中的所有非数据元素:如标题、图例和坐标轴。文本几何对象则属于图形本身的一部分.


# 9.3使用主题
# 要使用预制的主题,向图形添加theme_bw()或theme_grey()即可
library(gcookbook)
#基本图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()
# (默认的)灰色主题
p+theme_grey()
# 黑白主题
p+theme_bw()
# ggplot2()中主题元素的某些常用属性是通过theme()来控制的。其中的多数属性,如标题、图例和坐标轴,位于绘图区域的外部,但另一些则位于绘图区域的内部,如网格线和背景色
# ggplot2()的两套自带主题是theme_grey()和theme_bw()
# 可以自行设置两个内置主题的基本字体和字体大小(默认的基本字体为无衬线的Helvetica,默认大小为12)
p+theme_grey(base_size = 16,base_family = "Times")
# 使用theme_set()设置当前R回话下的默认主题:
theme_set(theme_bw())
# 将使用theme_bw()
p
# 将默认主题重置回theme_grey()
theme_set(theme_grey())


# 9.4修改主题元素的外观
# 要修改一套主题,配合相应的element_xx对象添加theme()函数即可。element_xx对象包括element_line、element_rect以及element_text。
library(gcookbook)
# 基本图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=sex))+geom_point()
# 绘图区域的选项
p + theme(
  panel.grid.major = element_line(colour = "red"),
  panel.grid.minor = element_line(colour = "red",linetype = "dashed",size = 0.2),
  panel.background = element_rect(fill = "lightblue"),
  panel.border = element_rect(colour = "blue",fill = NA,size = 2)
)
# 文本项目的选项
p+ggtitle("Plot title here")+theme(
  axis.title.x = element_text(colour = "red",size = 14),
  axis.text.x = element_text(colour = "blue"),
  axis.title.y = element_text(colour = "red",size = 14,angle = 90),
  axis.text.y = element_text(colour = "blue"),
  plot.title = element_text(colour = "red",size = 20,face = "bold")
)
# 图例选项
p +theme(
  legend.background = element_rect(fill = "grey85",colour = "red",size = 1),
  legend.title = element_text(colour = "blue",face = "bold",size = 14),
  legend.text = element_text(colour = "red"),
  legend.key = element_rect(colour = "blue",size = 0.25)
)
# 分面选项
p+facet_grid(sex~.)+theme(
  strip.background = element_rect(fill = "pink"),
  strip.text.y = element_text(size = 14,angle = -90,face = "bold")
)
# 如果希望使用一套现成的主题并使用theme()微调其中一些部分,则theme()必须接在指定主题的语句之后,否则,任何theme()的设定都会被添加的主题所还原
# 如果在添加一套完整的主题之前使用,theme()将没有效果
p+theme(axis.title.x = element_text(colour = "red"))+theme_bw()
# 在完整的主题后使用,theme()可以正常工作
p+theme_bw()+theme(axis.title.x = element_text(colour = "red",size = 12))


# 9.5创建自定义主题
# 可以通过向一套现成主题添加元素的方式创建自定义主题
library(gcookbook)
# 从theme_bw()入手,修改一些细节
mytheme <- theme_bw()+theme(text = element_text(colour = "red"),axis.title = element_text(size = rel(1.25)))
# 基本图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()
# 使用修改后的主题绘图
p+mytheme
# 可以添加新的主题元素或者修改现有的值,并将修改全部应用到多幅图形或者只应用到单幅图形上。


# 9.6 隐藏网格线
# 主网格线(与刻度线对其的那些)可通过panel.grid.major来控制,次网格线(位于主网格线之间的那些)则通过panel.grid.minor来控制。
library(gcookbook)
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()
p+theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank())


# 通过使用panel.grid.major.x、panel.grid.major.y、panel.grid.minor.x、panel.grid.minor.y,只隐藏纵向或横向网格线
# 隐藏纵向网格线(与x轴交汇的那些)
p + theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
# 隐藏横向网格线(与y轴交汇的那些)

p+theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())

# 10.图例
# 10.1移除图例
# 使用guides(),并指定需要移除图例的标度
# 基本图形(含图例)
p <-ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p
# 移除标度fill的图例
p + guides(fill=FALSE)
# 移除某个图例的另一种方式是在对应标度中设置guide=FALSE.
# 移除标度fill的图例
p+scale_fill_discrete(guide=FALSE)
# 还有一种移除图例的方法是使用主题系统。如果有多于一种带有图例的图形属性映射,这样做将会移除所有图例
p+theme(legend.position = "none")


# 当某个变量被映射到图形属性fill上时,默认使用的标度为scale_fill_discrete()(与scale_fill_hue()等价),这会将不同的因子水平映射到色环上均匀分布的颜色值上。
# 对于fill来说,也有其他的标度可用,如scale_fill_manual()。如果要使用其他图形属性的标度,如colour(针对线和点)或shape(针对点),则必须使用合适的对应标度。


# 10.2 修改图例的位置
# 使用theme(legend.position=...)即可。通过指定位置参数为top、left、right或bottom,图例即可被放置在顶部、左侧、右侧或底部
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()+scale_fill_brewer(palette = "Pastel2")
p+theme(legend.position = "top")
# 通过指定像legend.position=c(0,1)这样的位置坐标,图例也可被置于绘图区域内部。
# 坐标空间左下角为原点(0,0),右上角为(1,1)。
# 可以使用legend.justification来指定图例框的哪一部分被放置到legend.position所指定的位置上。默认情况下,图例的中心(0.5,0.5)被置于给定的坐标处,但是指定一个不同的点往往是有用的。
# 将图例的右下角(1,0)置于绘图区域的右下角(1,0)
p + theme(legend.position = c(1,0),legend.justification = c(1,0))
# 将图例的右上角置于绘图区域的右上角
p+theme(legend.position = c(1,1),legend.justification = c(1,1))


# 在绘图区域内放置图例时,添加一个不透明的边界使其与图形分开可能会有所帮助
p+theme(legend.position = c(.85,.2))+theme(legend.background = element_rect(fill = "white",colour = "black"))
# 移除图例元素周围的边界以使其融入图形
p+theme(legend.position = c(.85,.2))+theme(legend.background = element_blank())+theme(legend.key = element_blank())


# 10.3修改图例项目的顺序
# 将对应标度的参数limits设置为理想的顺序即可
# 基本图形
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p
# 修改项目顺序
p+scale_fill_discrete(limits=c("trt1","trt2","ctrl"))
# 注意:x轴上项目的顺序并没有改变。要修改这个顺序,需要设置scale_x_discrete()的limits参数,或者修改数据,使其拥有一个不同的因子水平顺序
# 使用灰色调色板
p+scale_fill_grey(start = .5,end = 1,limits=c("trt1","trt2","ctrl"))
# 使用RColorBrewer中的调色板
p+scale_fill_brewer(palette = "Pastel2",limits=c("trt1","trt2","ctrl"))
# 以上都是针对图形属性fill的,要使用其他图形属性的标度,如colour(针对线和点)或shape(针对点),则必须使用合适的对应标度。
# 默认情况下,使用scale_fill_discrete()与使用scale_fill_hue()是等价的。这对于颜色标度也成立。


# 10.4反转图例项目的顺序
# 添加guides(fill=guide_legend(reverse=TRUE))以反转图例的顺序。
# 基本图形
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p
# 反转图例顺序
p+guides(fill=guide_legend(reverse = TRUE))
# 在设定标度的同时也可以控制图例
p+scale_fill_hue(guide=guide_legend(reverse = TRUE))


# 10.5修改图例标题
# 使用函数labs()并设定fill、colour、shape或任何对于图例来说合适的图形属性的值
# 基本图形
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p
# 设置图例标题为“Condition"
p+labs(fill="Condition")
# 在设定标度时也可以设置图例标题。由于图例和坐标轴均为引导元素,这样做与设置x轴或y轴标题的原理是相同的。
p+scale_fill_discrete(name="Condition")
# 如果有多个变量被映射到带有图例的图形属性,可以分别设置每个图例的标题。
library(gcookbook)
# 绘制基本图形
hw <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=sex))+geom_point(aes(size=weightLb))+scale_size_continuous(range=c(1,4))
hw
# 使用新的图例标题
hw + labs(colours="Male/Female",size="Weight\n(pounds)")
# 如果有一个变量被分别映射到两个图形属性,则默认会生成一个组合了两种情况的图例。
hw1 <- ggplot(heightweight,aes(x=ageYear,y=heightIn,shape=sex,colour=sex))+geom_point()
hw1
# 要修改图例标题,需要同时设置二者的标题。如果只修改其中一个,则会得到两个分离的图例
# 仅修改shape的标题
hw1+labs(shape="Male/Female")
# 同时修改shape和colour的标题
hw1 +labs(shape="Male/Female",colour="Male/Female")
# 使用函数guides()来控制图例标题
p+guides(fill=guide_legend(title = "Condition"))


# 10.6修改图例标题的外观
# 使用theme(legend.title=element_text())
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p+theme(legend.title = element_text(face = "italic",family = "Times",colour = "red",size = 14))
# 通过guides()来指定图例标题的外观。
p+guides(fill=guide_legend(title.theme = element_text(face = "italic",family = "times",colour = "red",size = 14,angle = 90)))


# 10.7移除图例标题
# 添加语句guides(fill=guide_legend(title=NULL))可以从图例中移除标题。
p+guides(fill=guide_legend(title = NULL))
# 在设置标度的同时也可以控制图例标题。
p+scale_fill_hue(guide=guide_legend(title = NULL))


# 10.8修改图例标签
# 设置标度中的labels参数即可
library(gcookbook)
# 基本图形
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
p
# 修改图例标签
p+scale_fill_discrete(labels=c("Control","Treatment 1","Treatment 2"))
# 注意:x轴的标签并没有改变。要修改它,需要设置scale_x_discrete()中的标签,或者修改数据让其拥有不同的因子水平名称
p+scale_fill_grey(start = .5,end = 1,labels=c("Control","Treatment 1","Treatment 2"))
# 如果同时修改了图例项目的顺序,则标签会依照位置顺序与项目进行匹配
p+scale_fill_discrete(limits=c("trt1","trt2","ctrl"),labels=c("Treatment 1","Treatment 2","Control"))
# 如果有一个变量被分别映射到两个图形属性,则默认会生成一个组合了两种情况的图例。
# 如果要修改图例标签,则必须同时修改两种标度中的标签,否则将得到两个分离的图例
# 基本图形
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn,shape=sex,colour=sex))+geom_point()
p
# 修改一个标度中的标签
p+scale_shape_discrete(labels=c("Female","Male"))
# 同时修改两个标度中的标签
p+scale_shape_discrete(labels=c("Female","Male"))+scale_color_discrete(labels=c("Female","Male"))


# 10.9修改图例标签的外观
# 使用theme(legend.text=element_text())
# 基本图形
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
# 修改图例标签的外观
p+theme(legend.text = element_text(face = "italic",family = "Times",colour = "red",size = 14))
# 也可以通过guides()来指定图例标签的外观。
# 修改fill对应图例标签文本的外观
p+guides(fill=guide_legend(label.theme = element_text(face = "italic",family = "Times",colour = "red",size = 14,angle = 45)))
# 10.10使用含多行文本的标签
# 在相应标度中设置labels参数,使用\n来表示新行。
p <- ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()
# 含有多于一行文本的标签
# 使用scale_fill_discrete()来控制标度fill的图例
p+scale_fill_discrete(labels=c("Control","Type 1\ntreatment","Type 2\ntreatment"))
# 默认设置下,使用多于一行文本的标签时,各行文本将相互叠加。
# 可以使用theme()增加图例说明的高度并减小各行的间距
# 要实现这个操作,需要使用grid包中的unit()函数来指定高度
library(grid)
p+scale_fill_discrete(labels=c("Control","Type 1\ntreatment","Type 2\ntreatment"))+theme(legend.text = element_text(lineheight = .8),legend.key.height = unit(1,"cm"))

你可能感兴趣的:(数据挖掘与分析策略)