求R语言优质等高线/密度图绘制方法,基于给定数据绘制等高线图
嘿,我来帮你搞定R里的等高线图和密度图,还有你提供的那组model1、model2数据的可视化需求!下面分步骤给你讲清楚方法,直接上手就能用。
在R中绘制优质等高线图与密度图的方法
一、等高线图(Contour Plot)绘制
等高线图适合展示二维空间中数值的变化趋势,常用的工具包括R基础绘图系统和ggplot2包,两种方式各有优势:
1. 基础绘图系统实现
如果你的数据已经是网格格式(即x、y坐标对应的z值矩阵),可以直接用contour()函数;如果是散点数据(比如你提供的model1、model2样本),需要先计算二维核密度估计,再绘制等高线。
散点转等高线示例(针对你的数据)
首先处理你给出的数据(注意最后一个model2值我暂时补为0.0070,你可以替换成实际完整值):
# 把数据转换成数据框 df <- data.frame( id = 1:17, model1 = c(0.006889929, 0.007700212, 0.008565160, 0.006881213, 0.008636678, 0.007141556, 0.008368942, 0.006818685, 0.006696313, 0.006268623, 0.007999088, 0.007532648, 0.006554138, 0.008131300, 0.006231241, 0.006426665, 0.008686260), model2 = c(0.005679936, 0.005249357, 0.004499936, 0.005151137, 0.006632931, 0.005622523, 0.005443024, 0.005273998, 0.006221722, 0.004654712, 0.005780017, 0.005547954, 0.006242407, 0.004914134, 0.004716008, 0.005245560, 0.0070) ) # 加载MASS包用于二维核密度估计 library(MASS) # 计算model1和model2的联合密度,n控制网格精细度 dens <- kde2d(df$model1, df$model2, n = 100) # 绘制基础等高线图,叠加原始散点更直观 contour(dens, xlab = "Model 1 Values", ylab = "Model 2 Values", main = "Contour Plot of Model1 vs Model2", col = "blue") points(df$model1, df$model2, pch = 16, col = "red")
自定义优化技巧
- 调整等高线数量:用
levels参数指定,比如contour(dens, levels = seq(0, max(dens$z), length.out = 10)) - 添加填充色:用
filled.contour()代替contour(),生成带颜色填充的等高线图 - 调整线条样式:
lwd控制线宽,lty控制线型
2. ggplot2包实现
ggplot2的语法更灵活,可视化效果更美观,适合做出版级别的图:
library(ggplot2) # 把kde2d的结果转换成ggplot兼容的数据框 dens_df <- data.frame( x = rep(dens$x, each = length(dens$y)), y = rep(dens$y, length(dens$x)), z = as.vector(dens$z) ) # 绘制带填充的等高线图,叠加散点 ggplot(dens_df, aes(x = x, y = y, z = z)) + geom_contour(color = "darkblue", size = 0.8) + geom_contour_filled(alpha = 0.7) + geom_point(data = df, aes(x = model1, y = model2), color = "red", size = 2) + labs(x = "Model 1 Values", y = "Model 2 Values", title = "Contour Plot of Model1 vs Model2 (ggplot2)") + theme_minimal() + scale_fill_viridis_c(name = "Density") # 色盲友好的配色方案
二、密度图(Density Plot)绘制
密度图用于展示单变量或双变量的分布情况,单变量密度图简单直观,双变量密度图和等高线图类似但侧重分布展示:
1. 单变量密度图(基础包)
# 绘制model1的密度图,填充曲线下面积 plot(density(df$model1), main = "Density Plot of Model1", xlab = "Model1 Values", col = "darkgreen", lwd = 2) polygon(density(df$model1), col = rgb(0, 0.5, 0, 0.3)) # 对比model1和model2的密度分布 plot(density(df$model1), main = "Density Comparison: Model1 vs Model2", xlab = "Values", col = "darkgreen", lwd = 2, ylim = c(0, max(density(df$model1)$y, density(df$model2)$y)*1.1)) lines(density(df$model2), col = "darkblue", lwd = 2) legend("topright", legend = c("Model1", "Model2"), col = c("darkgreen", "darkblue"), lwd = 2)
2. 单变量密度图(ggplot2)
ggplot(df) + geom_density(aes(x = model1, fill = "Model1"), alpha = 0.5) + geom_density(aes(x = model2, fill = "Model2"), alpha = 0.5) + labs(x = "Values", y = "Density", title = "Density Comparison: Model1 vs Model2") + theme_minimal() + scale_fill_manual(values = c("Model1" = "darkgreen", "Model2" = "darkblue")) + guides(fill = guide_legend(title = "Models"))
3. 双变量密度图(ggplot2,带等高线)
用geom_density_2d()可以直接基于散点生成密度等高线:
ggplot(df, aes(x = model1, y = model2)) + geom_density_2d(color = "darkred", size = 0.8) + geom_point(color = "black", size = 1.5) + labs(x = "Model1 Values", y = "Model2 Values", title = "Bivariate Density Contour Plot") + theme_bw()
三、注意事项
- 如果你有规则网格数据(比如x、y为连续网格坐标,每个点对应一个z值),可以直接用
contour(x, y, z),无需核密度估计 - 核密度估计的平滑程度可以通过
kde2d()的h参数调整,h越小越精细,越大越平滑 - 配色建议用viridis、RColorBrewer等包的方案,避免使用色盲识别困难的颜色组合
内容的提问来源于stack exchange,提问作者Gragbow
相关产品推荐
相关产品推荐

