在2个直方图分布的ggplot中标记单个裁剪的列

时间:2016-12-08 17:25:38

标签: r ggplot2 histogram density-plot

答案here似乎应该让我到达我想要的地方,但我在尝试应用错误时无法调试错误。

这里有一些代码(工作正常)可以将两个分布一起绘制,然后放大'放大'裁剪其中一个发行版的最高栏。

data(iris)

#Round Sepal.Length for Binning 
iris$Sepal.Length = round(iris$Sepal.Length)

#Drop versicolor rows so density plot comes out skewed like my data
iris <- iris[iris$Species!="versicolor",]

#Plot density plot, truncating 0.8 column at (setosa, 5) 
p <-ggplot(iris, aes(x=Sepal.Length, y=..density.., fill=Species)) +
  geom_histogram(binwidth=1, alpha=0.5, position = 'identity') +
  coord_cartesian(ylim = c(0, 0.6)) 

p

enter image description here

到目前为止一切顺利。除非我添加下面的代码来注释裁剪条的真实高度

p + geom_text(data=as.data.frame(ggplot_build(p)$data), 
              aes(x=5, y=0.5, label = paste0("Bar Height: ", max(density))))

我收到错误

  

eval(expr,envir,enclos)中的错误:object&#39; Species&#39;找不到

这是as.data.frame(ggplot_build(p)$data)$density

的输出
0.10 0.80 0.10 0.00 0.00 0.00 0.02 0.54 0.32 0.12

1 个答案:

答案 0 :(得分:2)

问题是您在fill语句中将审美ggplot()全局定义为Species。当您添加文本geom时,ggplot正在寻找&#34; Species&#34;确定第二个数据框中不存在的填充颜色。

您可以通过两种方式解决此问题: 将fill=Speciesggplot语句移至geom_histogram语句:

p <-ggplot(iris, aes(x=Sepal.Length, y=..density..)) +
geom_histogram(binwidth=1, alpha=0.5, position = 'identity', aes(fill=Species)) +
coord_cartesian(ylim = c(0, 0.6))

或覆盖geom_text来电中的填充美学:

p + geom_text(data=as.data.frame(ggplot_build(p)$data), 
          aes(x=5, y=0.5, fill='black', label = paste0("Bar Height: ", max(density))))

enter image description here

编辑:上面的图片是使用第二个选项生成的。正如你所看到的,ggplot添加了&#34; black&#34;作为传说中的第三个物种。要避免这种情况,请使用第一个选项。