将垂直线(均值)的图例项添加到现有图例

Adding legend item for vertical line (mean) to already existing legend

我正在生成这样的密度图:

# Density Plot ZOOM with no legend title and mean lines
ggplot(comb, aes(x=values, fill = type)) + 
  geom_density(alpha = 0.3) + 
  scale_x_continuous(limits=c(9, 15), expand = c(0, 0)) +
  xlab("Index Value") + 
  ylab("Density") +
  ggtitle(expression('TI versus TI'[u])) +
  theme(text = element_text(size=30),axis.text.x=element_text(angle=0,hjust=1,vjust=.9,size=20),
        axis.text.y=element_text(angle=0,hjust=1,vjust=.8,size=20),
        plot.title = element_text(size=40, face="bold", vjust=2),
        axis.title.x=element_text(size=25,face="bold",vjust=-0.5,hjust=0.5),
        axis.title.y=element_text(size=25,face="bold",vjust=1.5,hjust=0.5),
        legend.position = c(.87,.90),
        legend.text.align = 0) + 
  scale_fill_manual(values=c('red','blue'),
                    labels=c(expression('TI '),expression(TI[u]))) +
  guides(fill=guide_legend(title=NULL)) + 
  geom_vline(data=mean, aes(xintercept=values.mean,  colour=type),
             linetype="dashed", size=1)

这几乎生成了我想要的情节:

但还有几件事我想做:

  1. 有平均线的图例项
  2. 改变图例项的顺序,使线条与适当的密度图例项(Ti,平均 TI,TIu,平均 TIu)分组

当我尝试使用 show_guide=T:

将线条添加到图例中时

geom_vline(data=mean, aes(xintercept=values.mean, colour=type), 线型="dashed", 尺寸=1, show_guide=T)

我明白了:

我该怎么做?

编辑: 使用彼得的回答,我得到了这个:

# Density Plot ZOOM with no legend title and mean lines - double legend
ggplot(comb, aes(x=values, fill = type)) + 
  geom_vline(data=mean, aes(xintercept=values.mean,  colour=type),
             linetype="dashed", size=1, show_guide=T) + 
  geom_density(alpha = 0.3) + 
  scale_x_continuous(limits=c(9, 15), expand = c(0, 0)) +
  xlab("Index Value") + 
  ylab("Density") +
  ggtitle(expression('TI versus TI'[u])) +
  theme(text = element_text(size=30),axis.text.x=element_text(angle=0,hjust=1,vjust=.9,size=20),
        axis.text.y=element_text(angle=0,hjust=1,vjust=.8,size=20),
        plot.title = element_text(size=20,face="bold", vjust=1),
        axis.title.x=element_text(size=15,face="bold",vjust=-0.5,hjust=0.5),
        axis.title.y=element_text(size=15,face="bold",vjust=1.5,hjust=0.5),
        legend.position = c(0.15, 0.90),
        legend.text.align = 0,
        legend.box = 'horizontal',
        legend.margin = unit(45.0, 'line'),
        legend.text=element_text(size=12,vjust=0,hjust=0)) + 
  scale_color_hue(labels=c(expression(bar(TI)),
                           expression(bar(TI[u])))) +
  guides(color = guide_legend(title=NULL)) + 
  scale_fill_manual(values=c('red','blue'),
                    labels=c(expression(TI),
                             expression(TI[u]))) +
  guides(fill = guide_legend(title=NULL, override.aes = list(linetype = 0)))

图表:

只有我希望能弄清楚的其他项目:

  1. 获取每个图例周围的缓冲区足以连接两者并使它们显示为一个

我认为您可以通过调整 legend.box

来获得您想要的结果
library(ggplot2)
data('diamonds')

plot_data <- subset(diamonds, cut %in% c("Ideal", "Premium"))
means     <- aggregate( price ~ cut, plot_data, mean)

ggplot(plot_data, aes(x = price, fill = cut)) + 
  geom_density(alpha = 0.3) + 
  scale_x_continuous() + 
  geom_vline(data = means, aes(xintercept = price, color = cut), linetype = 2, show_guide = TRUE) + 
  scale_fill_manual(name = "", 
                    values=c('red','blue'), 
                    labels = c("Premium", "Ideal")) +
  scale_color_hue(name = " ",  
                  labels = c("Mean", "Mean")) +
  theme(legend.box = 'horizontal', 
        legend.position = c(0.75, 0.75)) + 
  guides(fill = guide_legend(override.aes = list(linetype = 0)))