将geom_hline添加到图例中

3

经过昨天和今天的网上搜索,我唯一找到一个让图例正常工作的方法是遵循'Brian Diggs'在这篇文章中提供的解决方案: Add legend to ggplot2 line plot

这给了我以下代码:

library(ggplot2)
ggplot()+
  geom_line(data=myDf, aes(x=count, y=mean, color="TrueMean"))+
  geom_hline(yintercept = myTrueMean, color="SampleMean")+
  scale_colour_manual("",breaks=c("SampleMean", "TrueMean"),values=c("red","blue"))+
  labs(title = "Plot showing convergens of Mean", x="Index", y="Mean")+
  theme_minimal()

如果我删除hline的颜色,一切都可以正常工作,但是如果我添加一个不是实际颜色的值(例如"SampleMean")到hline的颜色中,我会收到一个错误,指出它不是颜色(仅适用于hline)。

如何添加一个如此常见的图例却成为一个大问题?一定有更简单的方法吗?

要创建原始数据:

#Initial variables
myAlpha=2
myBeta=2
successes=14
n=20
fails=n-successes

#Posterior values
postAlpha=myAlpha+successes
postBeta=myBeta+fails

#Calculating the mean and SD
myTrueMean=(myAlpha+successes)/(myAlpha+successes+myBeta+fails)
myTrueSD=sqrt(((myAlpha+successes)*(myBeta+fails))/((myAlpha+successes+myBeta+fails)^2*(myAlpha+successes+myBeta+fails+1)))

#Simulate the data
simulateBeta=function(n,tmpAlpha,tmpBeta){
  tmpValues=rbeta(n, tmpAlpha, tmpBeta)
  tmpMean=mean(tmpValues)
  tmpSD=sd(tmpValues)
  returnVector=c(count=n, mean=tmpMean, sd=tmpSD)
  return(returnVector)
}

#Make a df for the data
myDf=data.frame(t(sapply(2:10000, simulateBeta, postAlpha, postBeta)))
1个回答

5

这个解决方案在大多数情况下有效,但对于geom_hlinevline)不起作用。对于它们,通常不需要使用aes,但是当您需要生成图例时,则必须将它们包装在aes中:

library(ggplot2)
ggplot() +
  geom_line(aes(count, mean, color = "TrueMean"), myDf) +
  geom_hline(aes(yintercept = myTrueMean, color = "SampleMean")) +
  scale_colour_manual(values = c("red", "blue")) +
  labs(title = "Plot showing convergens of Mean",
       x = "Index",
       y = "Mean",
       color = NULL) +
  theme_minimal()

在这里输入图片描述


查看原始数据,您可以使用 geom_point 进行更好的可视化(还添加了一些主题更改):

ggplot() +
  geom_point(aes(count, mean, color = "Observed"), myDf,
             alpha = 0.3, size = 0.7) +
  geom_hline(aes(yintercept = myTrueMean, color = "Expected"),
             linetype = 2, size = 0.5) +
  scale_colour_manual(values = c("blue", "red")) +
  labs(title = "Plot showing convergens of Mean",
       x = "Index",
       y = "Mean",
       color = "Mean type") +
  theme_minimal() +
  guides(color = guide_legend(override.aes = list(
    linetype = 0, size = 4, shape = 15, alpha = 1))
  )

enter image description here


谢谢,我会调查这个。我还添加了如何生成原始数据的步骤。 - Jesper.Lindberg
非常好,谢谢!只有一个注意事项,您在图例中将真实均值和样本均值交换了。 - Jesper.Lindberg
@Jesper.Lindberg 添加了一些视觉变化 :) - pogibas

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