美文网首页R语言与统计分析数据-R语言-图表-决策-Linux-Pythonggplot2绘图
R-ggplot2-如何将点图与密度统计图通过双坐标轴的方式结合

R-ggplot2-如何将点图与密度统计图通过双坐标轴的方式结合

作者: TroyShen | 来源:发表于2019-12-24 15:33 被阅读0次

    目录

    • 0.问题导入
    • 1.示例数据
    • 2.导入示例数据
    • 3.离散类型连续化
    • 4.绘图数据框构建
    • 5.将密度图与点图叠加(图2)
    • 6.总结
    • 7.本文所使用的R-packages(没有的小伙伴需要使用install.packages()进行安装)
    • 8.致谢

    0. 问题导入

    科研过程中,我们可能会遇到想把样本点放到总体的概率统计图上,同时体现样本点的类型,类似于下面两图的叠加(图1)。但这样会面临如下两个问题:
    1. 如何绘制双坐标轴?
    2. 如何将continuous 与 discrete 类型的坐标轴同时体现?
    本篇给出解决方案~

    图1 示例问题说明

    1. 示例数据

    点击下载示例数据:
    用于绘制总体概率统计图的数据
    用于绘制具有类型特征样本点的数据

    2. 导入示例数据

    data1 = read.csv("NDVI_veg.csv", header = T)
    data2 = read.csv('NDVI_all.csv',header = T)
    head(data1)
      season  ndvi    sd types type
    1 Spring 0.418 0.105    PA    2
    2 Summer 0.742 0.127    PA    2
    3 Autumn 0.722 0.088    PA    2
    4 Winter 0.214 0.055    PA    2
    5 Spring 0.338 0.054    SA    4
    6 Summer 0.519 0.079    SA    4
     head(data2)
      season      NDVI
    1 spring 0.4492719
    2 spring 0.4492719
    3 spring 0.4597081
    4 spring 0.4492719
    5 spring 0.4350913
    6 spring 0.4685998
    

    3. 离散类型连续化

    这一步主要实现将data1中types进行连续化,为两图叠加做准备。

    tell_type <- function(x){
      b = 0
      if(x == 'PA'){
        b = 2
      }else if(x == 'SA'){
        b = 4
      }else if(x == 'SM'){
        b = 6    
      }else{
        b = 8
      }
    }
    
    data1$type = sapply(data1$types,tell_type)
    labels = unique(data1$types)
    

    4. 绘图数据框构建

    其中df1 主要用于绘制密度图,df2主要用于绘制点图,为保证df1与df2可以合并为一个df,则在df1中增加type项,并设置取值为NA。

    df1 = data.frame(NDVI = data2$NDVI,season = data2$season,type = NA)
    df2 = data.frame(NDVI = data1$ndvi,season = tolower(data1$season),type = data1$type )
    df = rbind(df1,df2)
    head(df)
           NDVI season type
    1 0.4492719 spring   NA
    2 0.4492719 spring   NA
    3 0.4597081 spring   NA
    4 0.4492719 spring   NA
    5 0.4350913 spring   NA
    6 0.4685998 spring   NA
    

    5. 将密度图与点图叠加(图2)

    p =ggplot()+
      geom_density(data = df,aes(x = NDVI,y= ..density..,fill = season),alpha = 0.5)+
      geom_point(data = df,aes(x = NDVI,y = type,color = factor(type)),size = 4)+
      scale_y_continuous(
        breaks = c(2,4,6,8),
        sec.axis = sec_axis( ~ . +0, breaks = c(2,4,6,8),labels = labels,
                             name = "Type")
      )+
      scale_color_manual(values = c('red','yellow','blue','green'))+
      theme_bw()+
      theme(
        axis.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
        axis.title = element_text(face = 'bold',color = 'black',size = 14,hjust = 0.5),
        legend.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
        legend.title = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
        legend.position = 'bottom',
        legend.direction = 'horizontal'
      )+
      ylab("NDVI")+
      xlab("Density")
    
    png('plot1.png',
        height = 20,
        width = 20,
        units = 'cm',
        res = 800)
    print(p)
    dev.off()
    
    图2 将密度图与点图结合结果图

    6. 总结

    本篇通过将离散数据连续化,通过双坐标轴的形式将密度图与点图进行叠加绘制,主要解决了以下问题:
    1. 如何绘制双坐标轴?
    2. 如何将continuous 与 discrete 类型的坐标轴同时体现?

    7. 本文所使用的R-packages(没有的小伙伴需要使用install.packages()进行安装)

    library('ggplot2')
    

    8. 致谢

    首先,祝大家圣诞节快乐哈!!!

    感谢大家的持续关注,小编会继续努力,持续更新下去的!

    大家如果觉得有用,还麻烦大家转发点赞加关注哈,也可以扩散到朋友圈,多谢大家啦~

    大家如果在使用本文代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~


    小编联系方式

    相关文章

      网友评论

        本文标题:R-ggplot2-如何将点图与密度统计图通过双坐标轴的方式结合

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