如何绘制以angles为横轴、necrosis密度为纵轴的密度曲线
解决方案
要画横轴为angles、纵轴为necrosis密度的图,给你两种实用方法:
方法一:基于你已汇总的频率数据转成密度曲线
你已经处理好的df数据框(带angles、necrosis和Freq列),只需把频率转成密度就能画曲线:
- 计算密度值
密度公式是:密度 = 频率 / (总观测数 × 组距),组距取angles相邻值的间隔:
# 计算总观测数 total_obs <- sum(df$Freq) # 获取angles的组距(假设数据为等间隔) unique_angles <- sort(unique(df$angles)) bin_width <- unique_angles[2] - unique_angles[1] # 计算necrosis的密度 df$necrosis_density <- df$Freq / (total_obs * bin_width)
- 绘制密度曲线
library(ggplot2) ggplot(df, aes(x = angles, y = necrosis_density)) + geom_line(color = "#2c3e50", linewidth = 1) + geom_point(color = "#e74c3c", size = 2) + # 可选,添加数据点增强可读性 labs(x = bquote("Tree stem angles" (theta)), y = "Necrosis Density") + scale_x_continuous(limits = c(0, 360), breaks = seq(0, 360, 40)) + theme_bw()
方法二:基于原始数据画条件密度(Ridges图)
如果想直观展示每个angle对应的necrosis完整密度分布,用ggridges包画ridges图,转置后刚好符合横轴为angles的需求:
使用你手上的
filter_df原始数据框(无需转换为频率表)安装并加载
ggridges包
install.packages("ggridges") library(ggridges)
- 绘制转置的ridges图
ggplot(filter_df, aes(x = as.factor(angles), y = stat(density))) + geom_density_ridges_gradient( aes(group = angles, fill = stat(density)), scale = 3, rel_min_height = 0.01, orientation = "y" ) + labs(x = bquote("Tree stem angles" (theta)), y = "Necrosis Density") + scale_x_discrete(breaks = seq(0, 360, 40)) + scale_fill_viridis_c(name = "Density") + theme_bw()
这个图会在每个angles位置展示对应的necrosis密度分布,颜色深浅代表密度高低,能清晰对比不同角度下坏死程度的分布差异。
内容的提问来源于stack exchange,提问作者Raquel Feltrin
相关产品推荐
相关产品推荐

