ggplot2:图例中的虚线

9

我想要创建一个同时包含两个核密度曲线的直方图。问题在于,我希望其中一条曲线是虚线,虽然虚线能够正常出现,但是在图例中它却不会显示,就像下面这个示例

x<-sort(rnorm(1000))
data<-data.frame(x=x,Normal=dnorm(x,mean(x),sd=sd(x)),Student=dt(x,df=3))

ggplot(data,aes(y=x))+geom_histogram(aes(x=x,y=..density..),
color="black",fill="darkgrey")+geom_line(aes(x=x,y=Normal,color="Normal"),size=1,
linetype=2)+ylab("")+xlab("")+labs(title="Density estimations")+geom_line(aes(x=x,y=Student,color="Student"),size=1)+
scale_color_manual(values=c("Student"="black","Normal"="black"))

有什么办法可以在图例中加入虚线?非常感谢!Rainer Example Plot
2个回答

6

“ggplot”的一般做法是喜欢将数据呈现为“长”格式,并使用单独的列来指定每个美学元素。在这种情况下,线条类型应被解释为一种审美元素。处理此类问题的最简单方法是使用reshape2软件包将您的数据转换为适当的格式:

library(reshape2)
data.m <- melt(data, measure.vars = c("Normal", "Student"), id.vars = "x")

然后,您需要修改您的绘图代码,使其类似于以下内容:
ggplot(data,aes(y=x)) +
  geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey") +
  geom_line(data = data.m, aes(x = x, y = value, linetype = variable), size = 1) +
  ylab("") +
  xlab("") +
  labs(title="Density estimations")

结果如下图所示:

在此输入图片描述


+1 你本可以提醒我添加库调用,哈哈。 - Brandon Bertelsen
@BrandonBertelsen - 那完全是两个独立天才的作品...当我试图保存/上传我的答案时,我看到了你和 Stephen 的答案。 - Chase
让它变成三个。我们都在几分钟内发布了帖子。 - Brandon Bertelsen

1

您想将此转换为长格式...使其更简单

x<-sort(rnorm(1000))
Normal=dnorm(x,mean(x),sd=sd(x))
Student=dt(x,df=3)
y= c(Normal,Student)
DistBn= rep(c('Normal', 'Student'), each=1000)
# don't call it 'data' that is an R command
df<-data.frame(x=x,y=y, DistBn=DistBn)

head(df)
          x           y DistBn
1 -2.986430 0.005170920 Normal
2 -2.957834 0.005621358 Normal
3 -2.680157 0.012126747 Normal
4 -2.601635 0.014864165 Normal
5 -2.544302 0.017179353 Normal
6 -2.484082 0.019930239 Normal   



ggplot(df,aes(x=x, y=y))+
  geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey")+
  geom_line(aes(x=x,y=y,linetype=DistBn))+
  ylab("")+xlab("")+labs(title="Density estimations")+
  scale_color_manual(values=c("Student"="black","Normal"="black"))

Rplot


不要贬低F分布!?df也是R命令 :) - Chase
我的情况也是如此,直到有人指出这一点为止......这里在SO上有一篇相当详细的文章,说明覆盖R函数名称实际上并不是那么糟糕,因为R在弄清楚您真正想要做什么方面非常聪明......最好还是避免这种情况,但对于有4000多个贡献包和更多函数的情况来说是不可避免的。 - Chase
非常感谢你们两位!回答得非常好。 - rainer

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