目录
- 0.问题导入
- 1.示例数据
- 2.导入示例数据
- 3.离散类型连续化
- 4.绘图数据框构建
- 5.将密度图与点图叠加(图2)
- 6.总结
- 7.本文所使用的R-packages(没有的小伙伴需要使用install.packages()进行安装)
- 8.致谢
0. 问题导入
科研过程中,我们可能会遇到想把样本点放到总体的概率统计图上,同时体现样本点的类型,类似于下面两图的叠加(图1)。但这样会面临如下两个问题:
1. 如何绘制双坐标轴?
2. 如何将continuous 与 discrete 类型的坐标轴同时体现?
本篇给出解决方案~
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()
6. 总结
本篇通过将离散数据连续化,通过双坐标轴的形式将密度图与点图进行叠加绘制,主要解决了以下问题:
1. 如何绘制双坐标轴?
2. 如何将continuous 与 discrete 类型的坐标轴同时体现?
7. 本文所使用的R-packages(没有的小伙伴需要使用install.packages()进行安装)
library('ggplot2')
8. 致谢
首先,祝大家圣诞节快乐哈!!!
感谢大家的持续关注,小编会继续努力,持续更新下去的!
大家如果觉得有用,还麻烦大家转发点赞加关注哈,也可以扩散到朋友圈,多谢大家啦~
大家如果在使用本文代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~