如何扩展ggplot密度曲线使其延伸至坐标轴边缘并趋近于0
解决密度曲线截断问题的两种方法
要让密度曲线延伸到指定的x轴边缘(-4到0),可以用以下两种简单方案:
- 方法一:扩展原始数据集
直接在你的两个数据框中分别加入对应x轴边界值、count为0的行(注意要转换为原始frequency单位,因为绘图时用了log10()转换),这样密度计算会包含这些边界点,曲线自然延伸到图表边缘:
# 扩展onlyOne数据集 onlyOne_extended <- rbind(onlyOne, data.frame(frequency = 10^-4, count = 0), # log10(10^-4) = -4 data.frame(frequency = 10^0, count = 0)) # log10(10^0) = 0 # 扩展tableOfGraphData数据集 tableOfGraphData_extended <- rbind(tableOfGraphData, data.frame(frequency.x = 10^-4, count.x = 0), data.frame(frequency.x = 10^0, count.x = 0)) # 使用扩展后的数据集绘图 ggplot()+ geom_density(data = onlyOne_extended, aes(x = log10(frequency), weight = count), bw = 0.2, fill="black", alpha = 0.5)+ geom_density(data = tableOfGraphData_extended, aes(x = log10(frequency.x), weight = count.x), bw = 0.2, fill = "red", alpha = 0.5)+ coord_cartesian(xlim = c(-4, 0))+ theme_light()
- 方法二:手动计算密度曲线数据
用density()函数直接指定计算范围(from=-4,to=0),生成完整的密度曲线数据后用geom_area绘制,这种方式对曲线范围的控制更直接:
# 计算onlyOne的密度曲线数据 dens_onlyOne <- density(log10(onlyOne$frequency), weights = onlyOne$count, bw = 0.2, from = -4, to = 0) dens_df_onlyOne <- data.frame(x = dens_onlyOne$x, y = dens_onlyOne$y) # 计算tableOfGraphData的密度曲线数据 dens_table <- density(log10(tableOfGraphData$frequency.x), weights = tableOfGraphData$count.x, bw = 0.2, from = -4, to = 0) dens_df_table <- data.frame(x = dens_table$x, y = dens_table$y) # 绘制曲线 ggplot() + geom_area(data = dens_df_onlyOne, aes(x = x, y = y), fill = "black", alpha = 0.5) + geom_area(data = dens_df_table, aes(x = x, y = y), fill = "red", alpha = 0.5) + coord_cartesian(xlim = c(-4, 0)) + theme_light()
两种方法都能解决曲线截断的问题,方法一更贴近你原有的代码逻辑,方法二对曲线范围的控制更精准。
内容的提问来源于stack exchange,提问作者3luke33
相关产品推荐
相关产品推荐

