左右柱形图的画法

作者: 单细胞空间交响乐 | 来源:发表于2019-08-01 16:21 被阅读0次

    很多人会问下面的图是怎么做出来的,其实实现的方法有好几种,接下来我们介绍一下几种做如下图的方法:

    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)))
    
    

    这样的用法来设置标签的左右位置,很精妙,值得学习。

    至于柱形图的颜色怎么调,希望各位同道自己探索!

    这种图可用的地方

    做生信的朋友应该不会陌生,在做富集分析的时候,这种图可以同时展示上调和下调的通路情况,当然还有其他的作用,各位同道可以多多练习和交流。

    相关文章

      网友评论

        本文标题:左右柱形图的画法

        本文链接:https://www.haomeiwen.com/subject/tskcdctx.html