如何修改R代码生成目标样式的等高线图?
修改R代码生成目标样式等高线图
我当前用以下R代码生成了线条式等高线图,希望调整代码生成填充式的目标等高线图:
library(MASS) library(ggplot2) # first contour m <- c(0,0) n<-c(2*sqrt(2),2*sqrt(2)) sigma <- matrix(c(2,0,.0,2), nrow=2) data.grid <- expand.grid(s.1 = seq(-6, 10, length.out=100), s.2 = seq(-6, 10, length.out=100)) q.samp <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = m, sigma = sigma)) ggplot(q.samp, aes(x = s.1, y = s.2, z = prob)) + stat_contour(color = 'red') + stat_contour(data = q.samp, aes(x = s.1, y = s.2, z = prob), color = 'green') #sigma1 <- matrix(c(1,-.5,-.5,1), nrow=2) set.seed(10) data.grid1 <- expand.grid(s.1 = seq(-6, 40, length.out=200), s.2 = seq(-6, 40, length.out=200)) q.samp1 <- cbind(data.grid1, prob = mvtnorm::dmvnorm(data.grid1, mean = n, sigma = matrix(c(2, 1.2, 1.2, 2), nrow = 2))) ggplot(q.samp1, aes(x = s.1, y = s.2, z = prob)) + stat_contour(color = 'red',bins = 12 ) + stat_contour(data = q.samp, aes(x = s.1, y = s.2, z = prob), color = 'green',bins = 12)+geom_point(aes(x = 0, y =0))+ geom_point(aes(x=2*sqrt(2),y=2*sqrt(2)))+xlab("Random slop")+ylab("Random intercept")
修改后的代码(匹配目标样式)
library(ggplot2) library(mvtnorm) # 定义两个二维正态分布参数 mean1 <- c(0, 0) sigma1 <- matrix(c(2, 0, 0, 2), nrow = 2) mean2 <- c(2*sqrt(2), 2*sqrt(2)) sigma2 <- matrix(c(2, 1.2, 1.2, 2), nrow = 2) # 生成统一网格,确保两个分布都在可视范围内 data.grid <- expand.grid(s.1 = seq(-6, 10, length.out = 200), s.2 = seq(-6, 10, length.out = 200)) # 计算两个分布的概率密度 q_samp1 <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = mean1, sigma = sigma1)) q_samp2 <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = mean2, sigma = sigma2)) # 绘制填充式等高线图 ggplot() + # 第一个分布的填充等高线(带透明度) stat_contour_filled(data = q_samp1, aes(x = s.1, y = s.2, z = prob), alpha = 0.6, bins = 12) + # 第二个分布的填充等高线(带透明度) stat_contour_filled(data = q_samp2, aes(x = s.1, y = s.2, z = prob), alpha = 0.6, bins = 12) + # 添加均值点(放大尺寸) geom_point(aes(x = mean1[1], y = mean1[2]), size = 3, color = "black") + geom_point(aes(x = mean2[1], y = mean2[2]), size = 3, color = "black") + # 添加点标签 geom_text(aes(x = mean1[1], y = mean1[2], label = "(0, 0)"), vjust = -1) + geom_text(aes(x = mean2[1], y = mean2[2], label = "(2.83, 2.83)"), vjust = -1) + # 坐标轴标签修正(原代码slop拼写错误) xlab("Random slope") + ylab("Random intercept") + # 简洁主题 theme_minimal() + # 区分度高的填充颜色 scale_fill_viridis_d(option = "plasma", guide = "none") + # 固定坐标轴范围 coord_cartesian(xlim = c(-6, 10), ylim = c(-6, 10))
关键修改说明
- 替换线条等高线为填充式等高线:用
stat_contour_filled替代stat_contour,生成目标图的填充色块样式 - 统一坐标轴范围:修正原代码中第二个图过大的坐标轴,确保两个分布都清晰展示
- 添加透明度:通过
alpha=0.6让两个分布的填充区域重叠时互不遮挡 - 优化均值点:放大点尺寸并添加标签,明确标注分布中心
- 修正拼写错误:将原代码的
Random slop改为Random slope - 调整颜色方案:使用
viridis色系,提升颜色区分度并隐藏冗余图例
内容的提问来源于stack exchange,提问作者saleh din
相关产品推荐
相关产品推荐

