5

我正在创建许多直方图,我想在图表顶部添加注释。我正在使用 for 循环绘制这些,因此我需要一种方法将注释放在顶部,即使我的 ylims 从一个图形更改为另一个图形。如果我可以将每个图形的 ylim 存储在循环中,我可以使注释的 y 坐标根据当前图形而变化。我在注释中包含的 y 值必须随着循环在迭代中的进行而动态变化。这是一些示例代码来演示我的问题(注意注释是如何移动的。我需要根据每个图的 ylim 来更改它):

library(ggplot2)

cuts <- levels(as.factor(diamonds$cut))

pdf(file = "Annotation Example.pdf", width = 11, height = 8,
    family = "Helvetica", bg = "white")

for (i in 1:length(cuts)) {
  by.cut<-subset(diamonds, diamonds$cut == cuts[[i]])
  print(ggplot(by.cut, aes(price)) +
    geom_histogram(fill = "steelblue", alpha = .55) +
  annotate ("text", label = "My annotation goes at the top", x = 10000 ,hjust = 0, y = 220, color = "darkred"))
}    
dev.off()
4

2 回答 2

9

ggplot在其位置中使用Inf来表示绘图范围的极值,而不更改绘图范围。因此y可以将注解的值设置为Infvjust也可以调整参数以获得更好的对齐。

...
print(ggplot(by.cut, aes(price)) +
      geom_histogram(fill = "steelblue", alpha = .55) +
      annotate("text", label = "My annotation goes at the top", 
               x = 10000, hjust = 0, y = Inf, vjust = 2, color = "darkred"))
...

对于i<-2,这看起来像:

在此处输入图像描述

于 2012-06-13T18:13:45.013 回答
1

可能有一种更简洁的方法,但您可以获得最大计数并使用它y在注释调用中进行设置:

for (i in 1:length(cuts)) {

  by.cut<-subset(diamonds, diamonds$cut == cuts[[i]])

  ## get the cut points that ggplot will use. defaults to 30 bins and thus 29 cuts
  by.cut$cuts <- cut(by.cut$price, seq(min(by.cut$price), max(by.cut$price), length.out=29))

  ## get the highest count of prices in a given cut.
  y.max <- max(tapply(by.cut$price, by.cut$cuts, length))

  print(ggplot(by.cut, aes(price)) +
    geom_histogram(fill = "steelblue", alpha = .55) +
    ## change y = 220 to y = y.max as defined above
    annotate ("text", label = "My annotation goes at the top", x = 10000 ,hjust = 0, y = y.max, color = "darkred"))
}  
于 2012-06-13T17:11:57.510 回答