对数刻度密度图:ggplot2和freqpoly,但带有点而不是线

时间:2013-07-24 20:19:24

标签: r ggplot2 histogram

我真正想要做的是绘制直方图,y轴在对数刻度上。显然这是ggplot2 geom_histogram的一个问题,因为底部的条形图是零,并且这个日志会给你带来麻烦。

我的解决方法是使用freqpoly geom,并且更多或更少的工作。以下代码可以正常工作:

ggplot(zcoorddist) + 
  geom_freqpoly(aes(x=zcoord,y=..density..),binwidth = 0.001) + 
  scale_y_continuous(trans = 'log10')

问题在于,在我的数据的边缘,当在一个图中组合一堆这些freqpoly曲线时,我得到了几条花哨的垂直线,这些线在视觉上真的让你失望。我希望能够做的是在freqpoly曲线的每个顶点使用点,而不是连接它们的线。有没有办法轻松实现这一目标?

1 个答案:

答案 0 :(得分:2)

获得所需图表的最简单方法是重新制作数据。然后你可以使用geom_point。由于您没有提供示例,我使用geom_histogram的标准示例来显示:

# load packages
require(ggplot2)
require(reshape)
# get data
data(movies)
movies <- movies[, c("title", "rating")]
# here's the equivalent of your plot
ggplot(movies) + geom_freqpoly(aes(x=rating, y=..density..), binwidth=.001) +
  scale_y_continuous(trans = 'log10')
# recast the data
df1 <- recast(movies, value~., measure.var="rating")
names(df1) <- c("rating", "number")
# alternative way to recast data
df2 <- as.data.frame(table(movies$rating))
names(df2) <- c("rating", "number")
df2$rating <- as.numeric(as.character(df$rating))
# plot
p <- ggplot(df1, aes(x=rating)) + scale_y_continuous(trans="log10", name="density") 
# with lines
p + geom_linerange(aes(ymax=number, ymin=.9))
# only points
p + geom_point(aes(y=number))