不知道是不是 Liechi 老师的回复被我的 3 楼覆盖掉了 >-<
谢谢 Liechi 老师的回复,
KikuYoung
均匀分布的密度挺好算,用 geom_hline
画条线就可以了。如果觉得看起来不好,可以用这个:
ggplot() +
stat_function(fun = dunif, args = list(min = 0, max = 100),
geom = "line", color = "red") +
stat_function(fun = dunif, args = list(min = 0, max = 100),
geom = "area", fill = "gray")
可能我例子有点不恰当,我真正要处理的数据不是完美的均匀分布,但边界的这种截断方式依然让我非常头疼。
在一些具有周期性的问题中,如绘制角度分布 [-180°, 180°],我们知道 -180° 和 180° 处的数据应该一致且在这里连续可导,但由于 density() 函数在边界截断存在问题,势必导致这种周期性被破坏。我可以提供一个修改后的例子
# test 为一组测试中各个角度出现的次数
library("ggplot2")
test <- data.frame(degree = c(-180:180,-30:30))
# 左图
ggplot() + geom_density(data = test, aes(x = degree))
# 中图,在某些情况,这个问题会造成一些误导,比如在极坐标下作图出现的 ♥
ggplot() + geom_density(data = test, aes(x = degree)) + coord_polar()
# 右图,这个情况下改用 histogram 似乎能更正确地表现数据
ggplot() + geom_histogram(data = test, aes(x = degree), binwidth = 30 ,boundary = 0) + coord_polar()
左图在横坐标首尾截断处理想状态应该是直线,但 density 在边缘的处理并不是这样;这个问题在某些情况下,如在极坐标下作图,会导致明显的信息传达上的问题,也就是中图。