2017-04-25 1 views
2

아래 그림과 같은 몇 개의 그림이 있습니다. 내 문제는 geom_vline() (유형)에 대한 범례가 때로는 아래의 '평균'범례 위에 나타나는 경우가 있습니다.geom_vline() 범례의 위치가 바뀜

geom_vline() 범례 (또는 다른 범례)의 위치를 ​​지정하여 용지에 플롯간에 변형이 없도록 어떻게 지정할 수 있습니까?

set.seed(1234) 
data <- data.frame(value = rnorm(n = 10000, mean = 50, sd = 20), 
        Type = sample(letters[1:2], size = 10000, replace = TRUE)) 
data$value[data$Type == "b"] <- data$value[data$Type == "b"] + 
    rnorm(sum(data$Type == "b"), mean = 55) 

gp <- ggplot(data = data, aes_string(x = "value")) 
gp <- gp + geom_density(aes_string(fill = "Type"), alpha = 0.3) 

vlines <- data.frame(value = c(mean(data$value[data$Type == "a"]), 
           mean(data$value[data$Type == "b"])), 
        Mean = c("A", "B")) 

gp2 <- gp + geom_vline(data = vlines, aes(xintercept = value, colour = Mean), 
         size = 1.05, linetype = "dashed", show.legend = TRUE) 
gp3 <- gp2 + geom_vline(xintercept = (50 + 55 + 50)/2, size = 1.05) 

gp3 

답변

2

당신은 당신이 재 배열 할 가이드의 scale_* 기능의 guide 매개 변수에 전달 guide_legendorder 매개 변수를 전달할 수 있습니다.

library(ggplot2) 
set.seed(1234) 

data <- data.frame(value = rnorm(n = 10000, mean =50, sd = 20), 
        Type = sample(letters[1:2], size = 10000, replace = TRUE)) 
data$value[data$Type == "b"] <- data$value[data$Type == "b"] + 
    rnorm(sum(data$Type == "b"), mean = 55) 

vlines <- data.frame(value = c(mean(data$value[data$Type == "a"]), 
           mean(data$value[data$Type == "b"])), 
        Mean = c("A", "B")) 

ggplot(data, aes(x = value)) + 
    geom_density(aes(fill = Type), alpha = 0.3) + 
    geom_vline(data = vlines, aes(xintercept = value, colour = Mean), 
       size = 1.05, linetype = "dashed", show.legend = TRUE) + 
    geom_vline(xintercept = (50 + 55 + 50)/2, size = 1.05) + 
    scale_fill_discrete(guide = guide_legend(order = 1)) + # fill first 
    scale_color_discrete(guide = guide_legend(order = 2))  # color second 

ggplot(data, aes(x = value)) + 
    geom_density(aes(fill = Type), alpha = 0.3) + 
    geom_vline(data = vlines, aes(xintercept = value, colour = Mean), 
       size = 1.05, linetype = "dashed", show.legend = TRUE) + 
    geom_vline(xintercept = (50 + 55 + 50)/2, size = 1.05) + 
    scale_fill_discrete(guide = guide_legend(order = 2)) + # now fill second 
    scale_color_discrete(guide = guide_legend(order = 1))  # and color first 

: 예를 들어,