Skip to content

Latest commit

 

History

History
484 lines (362 loc) · 15.6 KB

ggplot2笔记.md

File metadata and controls

484 lines (362 loc) · 15.6 KB

目录

ggplot2笔记

ggplot2笔记

直方图:geom_histogram 目录

分组直方图的排列方式

  • position="dodge"
ggplot(small)+geom_histogram(aes(x=price, fill=cut), position="dodge")

  • position="fill"
ggplot(small)+geom_histogram(aes(x=price, fill=cut), position="fill")

柱状图:geom_bar 目录

柱状图两个要素,一个是分类变量,一个是数目,也就是柱子的高度。数目在这里不用提供,因为ggplot2会通过x变量计算各个分类的数目。

当然你想提供也是可以的,通过stat参数,可以让geom_bar按指定高度画图,比如以下代码:

ggplot()+geom_bar(aes(x=c(LETTERS[1:3]),y=1:3), stat="identity")

区分柱状图和直方图:

柱状图和直方图是很像的,直方图把连续型的数据按照一个个等长的分区(bin)来切分,然后计数,画柱状图。而柱状图是分类数据,按类别计数

控制整体图形属性 目录

标尺(Scale) 目录

在对图形属性进行映射之后,使用标尺可以控制这些属性的显示方式,比如坐标刻度,可能通过标尺,将坐标进行对数变换 scale_y_log10();比如颜色属性,也可以通过标尺,进行改变 scale_colour_manual(values=rainbow(7))

标题 目录

设置图像标题:ggtitle()

设置X轴标题:xlab()

设置Y轴标题:ylab()

p + ggtitle("Price vs Cut")+xlab("Cut")+ylab("Price")

同时设置图像标题、X轴标题、Y轴标题:labs

labs(x="Cut",y="Price",title="Price vs Cut")

标题居中:theme(plot.title=element_text(hjust=0.5))

图例 目录

隐藏图例:theme(legend.position="none")

图例的安放:用 themeguides 来调整legend的位置和布局:

原图

将图例放在图下方,且为了防止它按照默认的组织方式——按两列展开,这样会影响整体布局的美观,可以按照指定行数去展开:

... + theme(legend.position="bottom") +
  guides(fill=guide_legend(nrow=2))

统计变换(Statistics) 目录

统计变换对原始数据进行某种计算,然后在图上表示出来

对散点图上加一条回归线 stat_smooth()

ggplot(small, aes(x=carat, y=price))+geom_point()+scale_y_log10()+stat_smooth()

坐标系统(Coordinante) 目录

坐标系统控制坐标轴,可以进行变换,例如XY轴翻转,笛卡尔坐标和极坐标转换,以满足我们的各种需求。

坐标轴翻转由coord_flip()实现

ggplot(small)+geom_bar(aes(x=cut, fill=cut))+coord_flip()

转换成极坐标可以由coord_polar()实现:

ggplot(small)+geom_bar(aes(x=factor(1), fill=cut))+coord_polar(theta="y")

饼图实际上就是柱状图,只不过是使用极坐标而已,柱状图的高度,对应于饼图的弧度

分面(Facet) 目录

分面可以让我们按照某种给定的条件,对数据进行分组,然后分别画图 facet_wrap(~cut)

在统计变换一节中,提到如果按切工分组作回归线,显然图会很乱,有了分面功能,我们可以分别作图

ggplot(small, aes(x=carat, y=price))+geom_point(aes(colour=cut))+scale_y_log10() +facet_wrap(~cut)+stat_smooth()

作分组箱线图并添加均值点连线及显著性程度标注 目录

从头实现(不推荐) 目录

简单来说,就是需要自己计算获得均值和显著性水平,然后利用ggplot2的图层叠加画出想要的效果

先产生测试数据:

Group1 <- data.frame(A=runif(100,15,90),
	B=rnorm(100,30,3),
	C=runif(100,30,60),
	D=rexp(100,0.1),
	E=rpois(100,10),
	group=1)
Group2 <- data.frame(A=runif(100,0,100),
	B=rnorm(100,50,2),
	C=runif(100,40,70),
	D=rexp(100,0.3),
	E=rpois(100,20),
	group=2)
b <- rbind(Group1,Group2)

	数据长这样:
	         A        B        C          D group
	1 54.22714 29.68265 58.79358  4.0479914     1
	2 65.97848 32.77361 52.92247  0.5999792     1
	3 44.70824 35.41883 56.19580  1.7838666     1
	4 78.40606 34.67005 52.77656 12.8923074     1
	5 51.26713 28.62068 43.12467  2.7550948     1
	6 16.67529 30.38058 38.92073  0.1057046     1

将数据框宽格式变长格式方便制图:

library(data.table)
b <- melt(b,id.vars = c("group"))
b$group<-as.factor(b$group)

	转换后长这样:
	  group variable    value
	1     1        A 54.22714
	2     1        A 65.97848
	3     1        A 44.70824
	4     1        A 78.40606
	5     1        A 51.26713
	6     1        A 16.67529

由于要做每个箱线图的均值点及均值连线,需要获得每个组每个属性的均值,并且定义每个组每个属性的X坐标为固定值

# 每个组每个属性的均值
c1 <- tapply(b[b$group==1,"value"],b[b$group==1,"variable"],mean)
c2 <- tapply(b[b$group==2,"value"],b[b$group==2,"variable"],mean)
c3 <- rbind(data.frame(variable=names(c1),value=c1,group=1),
	data.frame(variable=names(c2),value=c2,group=2))
c3$group<-as.factor(c3$group)


	   variable     value group
	A         A 52.039882     1
	B         B 30.269285     1
	C         C 45.875787     1
	D         D  9.376955     1
	A1        A 49.942698     2
	B1        B 50.089608     2
	C1        C 54.646858     2
	D1        D  3.240988     2


# 定义每个组每个属性的X坐标为固定值
c3$variable2 <- NA
c3[c3$group==1&c3$variable=="A","variable2"] <- 0.795
c3[c3$group==1&c3$variable=="B","variable2"] <- 1.795
c3[c3$group==1&c3$variable=="C","variable2"] <- 2.795
c3[c3$group==1&c3$variable=="D","variable2"] <- 3.795
c3[c3$group==1&c3$variable=="E","variable2"] <- 4.795

c3[c3$group==2&c3$variable=="A","variable2"] <- 1.185
c3[c3$group==2&c3$variable=="B","variable2"] <- 2.185
c3[c3$group==2&c3$variable=="C","variable2"] <- 3.185
c3[c3$group==2&c3$variable=="D","variable2"] <- 4.185
c3[c3$group==2&c3$variable=="E","variable2"] <- 5.185

	   variable     value group variable2
	A         A 52.039882     1     0.795
	B         B 30.269285     1     1.795
	C         C 45.875787     1     2.795
	D         D  9.376955     1     3.795
	A1        A 49.942698     2     1.185
	B1        B 50.089608     2     2.185
	C1        C 54.646858     2     3.185
	D1        D  3.240988     2     4.185

做两组每个属性的箱线图:

p1 <- ggplot(b)+
	# 绘制箱型图
  geom_boxplot(aes(x=variable,y=value,fill=group),
	width=0.6,
	position = position_dodge(0.8),
	outlier.size = 0,
	outlier.color = "white")+
	# 设置箱型图的填充类型及图例
  scale_fill_manual(values = c("red", "blue"),
	breaks=c("1","2"),
	labels=c("Group 1","Group 2"))+
	# 画出每个组每个属性的均值的散点
  geom_point(data=c3,
	aes(x=variable2,
	y=value,
	color=group),
	shape=15,
	size=1)+
	# 画出每个组每个属性的均值的散点的连线
  geom_line(data=c3,
	aes(x=variable2,y=value,color=group),
	size=1,
	linetype = "dotted")+
  labs(x="",y="")+
  scale_y_continuous(limits = c(0,110),breaks=seq(0,110,5)) +
	# 绘制显著性标识
  geom_signif(stat="identity",
			data=data.frame(x=c(0.795,1.795,2.795,3.795), 
					xend=c(1.185, 2.185,3.185,4.185),
					y=c(106,66,70,30),
					annotation=c("***", " *** ","  ***  ","    **    ")),
			aes(x=x,xend=xend, y=y, yend=y, annotation=annotation)) +
	# 主题风格设置
  theme_bw()+
  theme(
    legend.position = "top",
    legend.background=element_blank(),
    legend.key = element_blank(),
    legend.margin=margin(0,0,0,0,"mm"),
    axis.text.x=element_text(size=rel(1.1),face="bold"),
    axis.line.x = element_line(size = 0.5, colour = "black"),
    axis.line.y = element_line(size = 0.5, colour = "black"),
    legend.text=element_text(size=rel(1.1)),
    legend.title=element_blank(),
    panel.border = element_blank(),
    panel.grid = element_blank()
  )+
	# 移除颜色图例,保留填充图例
  guides(color=FALSE)

然后做两组整体水平的箱线图:

p2<-ggplot(b)+
	# 画箱型图
  geom_boxplot(aes(x=group,y=value,fill=group),
	width=0.8,
	position=position_dodge(1))+
  stat_summary(fun.y = mean, geom = "point", aes(x=group,y=value,color=group),shape=15)+
  scale_fill_manual(values = c("red", "blue"),
	breaks=c("1","2"),
	labels=c("Group 1","Group 2"))+
  scale_x_discrete(breaks=c("1","2"),
	labels=c("Group 1","Group 2"))+
  scale_y_continuous(limits = c(0,110),breaks=seq(0,110,5)) +
	# 绘制显著性标识
  geom_signif(stat="identity",
              data=data.frame(x=c(1), xend=c(2),
                              y=c(106), annotation=c("**")),
              aes(x=x,xend=xend, y=y, yend=y, annotation=annotation))+
  theme_bw()+
  theme(
    legend.position = "top",
    legend.background=element_blank(),
    legend.key = element_blank(),
    legend.margin=margin(0,0,0,0,"mm"),
    axis.text.x=element_text(size=rel(1.1),face="bold"),
    axis.line.x = element_line(size = 0.5, colour = "black"),
    axis.line.y = element_blank(),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    legend.text=element_text(size=rel(1.1)),
    legend.title=element_blank(),
    plot.margin = margin(11.5,0,7,0,"mm"),
    panel.border = element_blank(),
    panel.grid = element_blank()
  )+
  guides(fill=F,color=F)

合并两个图像:

# 如果没有安装则install.packages("gridExtra")
library(gridExtra)
# 合并两个图:
grid.arrange(p1, p2, nrow=1, ncol=2,widths=c(3.5,1),heights=c(4))

使用ggsiginf包 目录

官方文档:https://cran.r-project.org/web/packages/ggsignif/vignettes/intro.html

简单使用——就两步:

(1) 导入需要的包

library(ggplot2)
library(ggsignif)

(2) 画图

ggplot(iris, aes(x=Species, y=Sepal.Length)) + 
 geom_boxplot() +
 geom_signif(comparisons = list(c("versicolor", "virginica")), map_signif_level=TRUE)

高级用法:

  • (对连个比较对象)全部自行设置显著性标注

    geom_signif(y_position=c(5.3, 8.3), xmin=c(0.8, 1.8), xmax=c(1.2, 2.2), annotation=c("**", "NS"), tip_length=0)
  • 设定多个两两比较

    comparisons=lists(c('c1', 'c2'), c('c1', 'c3'), ...)

使用 RColorBrewer 扩展调色板 目录

通过运行 display.brewer.all() ,可以查看RColorBrewer中提供的标准配色方案:

则在用ggplot2绘图时只需要在其中加上这样一句:

... + scale_fill_brewer(palette="Set1") + ...

通过设置palette参数来选择合适的配色方案

有时会遇到这样的情况:需要的颜色种类和提供的配色方案中所具有的颜色种类不匹配,一般是需要的颜色种类对于所能提供的,此时就可能报错:

ggplot(mtcars) + 
  geom_bar(aes(factor(hp), fill=factor(hp))) +
  scale_fill_brewer(palette="Set2")

Warning message:
In RColorBrewer::brewer.pal(n, pal) : n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

此时,RColorBrewer为我们提供了一种通过使用构造函数colorRampPalette插入现有调色板来生成更大调色板的方法

colourCount = length(unique(mtcars$hp))
getPalette = colorRampPalette(brewer.pal(9, "Set1"))
 
ggplot(mtcars) + 
  geom_bar(aes(factor(hp)), fill=getPalette(colourCount)) + 
  theme(legend.position="right")

虽然我们解决了颜色不足的问题,但其他有趣的事情发生了:虽然所有的柱子都回来了并且涂上了不同颜色,但是我们也失去了颜色图例。我故意添加主题(legend.position = ...)来展示这个事实:尽管有明确的位置请求,但图例不再是图形的一部分

原因在于:fill参数移动到柱状图aes函数之外 - 这有效地从ggplot的美学数据集中删除了fill信息。因此,legend没有应用到任何东西上

要修复它,请将fill放回到aes中并使用scale_fill_manual()定义自定义调色板:

ggplot(mtcars) + 
  geom_bar(aes(factor(hp), fill=factor(hp))) + 
  scale_fill_manual(values = getPalette(colourCount))

使用ggbiplot画PCA图 目录

安装

library(devtools)
install_github("vqv/ggbiplot")

基本使用:

library(ggbiplot)
data(wine)
wine.pca <- prcomp(wine, scale. = TRUE)
ggbiplot(wine.pca, obs.scale = 1, var.scale = 1,
  groups = wine.class, ellipse = TRUE, circle = TRUE) +
  scale_color_discrete(name = '') +
  theme(legend.direction = 'horizontal', legend.position = 'top')


参考资料:

(1) Y叔博客:Use ggplot2

(2) 生信杂谈:ggplot2作分组箱线图并添加均值点连线及显著性程度标注

(3) 使用 ggplot2 和 RColorBrewer 扩展调色板

(4) ggbiplot README