2017-02-17 3 views
1

У меня есть фигура, как показано ниже, и я хотел бы изменить порядок цветных линий от синего -> зеленого -> красного до r-> g-> b, так что это так же, как и приказ легенды. Я нашел несколько руководств для изменения порядка легенд, но я хочу сохранить его порядок в этом случае (так как они 1, 2 и 3).ggplot2: Измените порядок `color`

Figure

Вот код для генерации данных и фигуры.

population_num <- 100 
population <- tibble(
    gender = as.numeric(rbinom(population_num, 1, 0.5)), 
    age=rnorm(population_num, mean=50, sd=20), 
    score=rnorm(population_num, mean=80, sd=30), 
    setid=sample(c(1,2,3), size=population_num, replace=T) 
    ) 
temp <- population %>% 
    group_by(setid) %>% 
    do(model1 = tidy(lm(score ~ age, data = .)), 
    model2 = tidy(lm(score ~ age + gender, data = .))) %>% 
    gather(model_name, model, -setid) %>%      
    unnest() %>%            
    filter(term == "age")          

interval1 <- -qnorm((1-0.9)/2) 

ggplot(temp, aes(colour = as.factor(setid))) + 
    geom_hline(yintercept = 0, colour = gray(1/2), lty = 2) + 
    geom_linerange(aes(x = model_name, ymin = estimate - std.error*interval1, 
        ymax = estimate + std.error*interval1), 
       lwd = 1, position = position_dodge(width = 1/2)) + 
scale_x_discrete(limits=c("model2", "model1"), labels=c("M2", "M1")) + 
    coord_flip() 

(этот вопрос как-то спросил в японском Stackoverflow, но не могли получить ответы.)

+0

Какой пакет является 'tidy' функция от? Я уверен, что я это уже видел, но «tidyverse» не дает результата – GGamba

+0

@GGamba, это должно быть «метлой». – thepule

+4

Просто измените 'position' на' position_dodge (width = -1/2) ' – alistaire

ответ

1

Вы можете изменить параметр position_dodgewidth к отрицательным. Это производит предупреждение:

Warning message: 
position_dodge requires non-overlapping x intervals 

но участки штраф:

ggplot(temp, aes(colour = as.factor(setid))) + 
    geom_hline(yintercept = 0, colour = gray(1/2), lty = 2) + 
    geom_linerange(aes(x = model_name, ymin = estimate - std.error*interval1, 
         ymax = estimate + std.error*interval1), 
        lwd = 1, position = position_dodge(width = -1/2)) + 
    scale_x_discrete(limits=c("model2", "model1"), labels=c("M2", "M1")) + 
    coord_flip() 

Смежные вопросы