很多人会问下面的图是怎么做出来的,其实实现的方法有好几种,接下来我们介绍一下几种做如下图的方法:
Rplot.png第一种
我们第一种画法来源是书上给的例子,这本书叫《R语言数据可视化之美》,这本有很多画图的例子,感兴趣的朋友们可以买一本多学习学习,话不多说,我们来看代码:
library(ggplot2)
library(RColorBrewer)
library(Cairo)
library(showtext)
mydata<- read.csv("Bar_Data.csv",stringsAsFactors=FALSE)
mydata$Team<-as.character(mydata$Team)
mydata<-transform(mydata, label1=ifelse(Difference>=0, Team, NA),
label2=ifelse(Difference>0, NA,Team))
mydata$Team <- factor(mydata$Team, levels = mydata$Team[order(mydata$Difference)])
#CairoPDF(file="图1-8-15(a)_条形图.pdf",width=5.28,height=5.47)
#showtext.begin()
ggplot(data = mydata, aes(x = Team, y = Difference,fill = Difference)) +
geom_bar(stat = "identity", width = 0.8,colour="black",size=0.25)+
scale_fill_gradient2(low=brewer.pal(7,"Set1")[2],mid="grey90",high=brewer.pal(7,"Set1")[1],midpoint=0)+
geom_text(aes(y = 0, label=label2),size=3,hjust=-0.1)+ #添加负值部分的数据标签
geom_text(aes(y = -0.001,label=label1),size=3,hjust= 1.1)+ #添加正值部分的数据标签
coord_flip() + #坐标轴翻转
ylim(-5,5)+
theme_minimal() + #图表主题设定
theme(
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line(colour = "grey80",size=.25),
panel.grid.minor.x = element_line(colour = "grey80",size=.25),
plot.title=element_text(size=15,hjust=.5),
axis.text.x = element_text(face="plain", color="black",
size=11, angle=0),
axis.text.y = element_blank(),
legend.position="right",
legend.text=element_text(size=10),
legend.title=element_text(size=10))
#showtext.end()
#dev.off()
书上的例子,大部分都很简单,其中主要是在图中添加文本的技巧,书上将添加文本运用的transform函数
mydata<-transform(mydata, label1=ifelse(Difference>=0, Team, NA),
label2=ifelse(Difference>0, NA,Team))
此时的label会依据Difference值的大小将标签设置为左或者右,在画图的时候:
geom_text(aes(y = 0, label=label2),size=3,hjust=-0.1)+ #添加负值部分的数据标签
geom_text(aes(y = -0.001,label=label1),size=3,hjust= 1.1)+ #添加正值部分的数据标签
会根据情况在左或者右添加标签。
第二种
第二种方法主要由简书上的尧小飞仁兄画的,他的代码是:
library(ggplot2)#用于可视化
library(dplyr)#用于数据处理
set.seed(1111)#此命令保证数据结果可以重现在任何电脑上
x <- 1980+1:36#赋值x
y <- round(100*rnorm(36))#赋值y
mydata <- data.frame(x=x, y=y)#创建数据集mydata
head(mydata)
mydata <- mydata%>%mutate(x_t=ifelse(y>=0,-4*nchar(x), 4*nchar(x))) #生成label的坐标
head(mydata)
max<-50
min<- -50
sig<-c()
for (i in mydata$y ){
print(i)
significant<-''
if(i>=max){significant<-'yes'}else if(i< 0 && abs(i)
>= max ){significant<-'no'}else if(min<i &&
i<max){significant<-'not significant'}else(print('yao'))
print(significant)
sig<-c(sig,significant)
}
mydata$x<-as.character(mydata$x) #将数字变量转换成字符串变量,防止画图自动排序
mydata<-mydata[order(mydata$y),]
mydata$significant<-sig
mydata$significant<-factor(mydata$significant,levels=c('yes','not significant','no'))#设置排序
mydata$x<-factor(mydata$x,levels=mydata$x)
ggplot(data=mydata,
aes(x=x, y=y, fill=significant))+geom_bar(stat = "identity",position =
"identity",width=0.9)+coord_flip()+scale_fill_manual(values =
c("purple",'grey', "blue"),
guide=FALSE)+xlab("Year")+geom_text(aes(y=x_t,label=x), vjust=0.3,
color="black",size=3)+geom_abline(linetype="dashed",intercept = 50,
slope = 0,size=1,colour='gray')+geom_abline(linetype="dashed",intercept =
-50, slope =
0,size=1,colour='gray')+theme(panel.grid=element_blank(),panel.border=element_blank(),axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())
这位仁兄的画法跟书上的例子稍有不同,他添加文本的方法是采画图的时候:
geom_text(aes(y=x_t,label=x), vjust=0.3, color="black",size=3)
采用了
mydata <- mydata%>%mutate(x_t=ifelse(y>=0,-4*nchar(x), 4*nchar(x)))
这样的用法来设置标签的左右位置,很精妙,值得学习。
至于柱形图的颜色怎么调,希望各位同道自己探索!
这种图可用的地方
做生信的朋友应该不会陌生,在做富集分析的时候,这种图可以同时展示上调和下调的通路情况,当然还有其他的作用,各位同道可以多多练习和交流。
网友评论