如何让ggplot2绘图更漂亮?

7
我使用接下来的R代码生成了以下图表: alt text
ggplot(lengths, aes(length, fill = library)) + geom_density(alpha = 0.2) + coord_cartesian(xlim = c(0, 60000)) 

现在我想让图形更漂亮一些:
  1. 将x轴显示每5000个单位的长度(而不是每20000个单位)
  2. 在三个峰值(大约3000、5000和35000)上方添加x值。
我该怎么做呢? 更新 回应James: alt text

2
顺便说一句,那个绘图真的很吸引人。 - davidtbernal
你可以从峰值向 x 轴添加一条竖线。 geom_segment(data = peakdat, aes(x=x, xend=x, y=y, yend=0)) 可以实现这一点,其中 peakdat 是来自 Ben B 的答案。 - Richie Cotton
2个回答

11

怎么样:

(首先创建一个可复制的示例)

set.seed(1001)
lengths <- data.frame(length=c(rgamma(1000,shape=10,scale=500),
                    10000+rgamma(1000,shape=5,scale=700),
                    rnorm(500,mean=30000,sd=2000)),
                  library=factor(rep(2:1,c(2000,500))))

(可爱的东西,用于查找峰值位置和高度)

peakfun <- function(x) {
  d <- density(x$length)
  peaks <- which(diff(sign(diff(d$y)))==-2)
  data.frame(x=d$x[peaks],y=d$y[peaks])
}

peakdat <- ddply(lengths,.(library),peakfun)
peakdat <- peakdat[-1,] ## drop spurious peak

(绘制图表)

library(ggplot2)
ggplot(lengths, aes(length, fill = library)) +
  geom_density(alpha = 0.2) +
  scale_x_continuous(limits = c(0,60000),
                     breaks = seq(0,60000,by=5000))+
  geom_text(data=peakdat,aes(x=x,y=y,label=round(x)),vjust=1)

你可能想微调标签的垂直高度。


6

1: + scale_x_continuous(breaks=rep(5000,12))

您还可以使用limits在此处放置xlim声明,例如:

+ scale_x_continuous(breaks=rep(5000,12),limits=c(0,60000))

2: 对于标签,您可以使用annotate()geom_text()。有关示例,请参见帖子。不过,您需要自己计算数值。


添加xlim声明似乎不起作用。查看原帖以了解我得到的内容。 - David B
抱歉,这里使用的是 limits 而不是 xlim,已经编辑原帖以更好地解释。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接