ggplot2 | Как настроить порядок строковых значений в легенде? - PullRequest
2 голосов
/ 11 июля 2020

Продолжая мой предыдущий вопрос , у меня возникли проблемы с упорядочиванием легенд. Первоначально опубликованный вопрос имел порядковые (упорядоченные) значения и, следовательно, работал отлично. В реальном времени данные, отображаемые в легенде, упорядочиваются в алфавитном порядке.

library(ggplot2)
library(tidyverse)
library(reshape2)

#Creating a dataframe with use-case specific variables. 
df = data.frame(
  Year = 2006:2025,
  
  Survey = c(40.5, 39.0, NA, NA, NA, NA, 29.9, NA, NA, NA, 21.6,
             NA, NA, NA, NA, NA, NA, NA, NA, NA),
  
  Projected1 = c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
             NA, NA, NA, NA, NA, NA, NA, NA, 14.9),
  
   WhatIf= c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
             NA, NA, NA, NA, NA, NA, NA, NA, 13.0),
  
  Projected2 = c(NA, NA, NA, NA, NA, NA, 29.9, 27.6, 25.4, 23.4, 21.6,
             19.9, 18.4, 16.9, 15.6, 14.4, 13.3, NA, 12.2, 11.3)
)

#Transforming data
df <- melt(df,id.vars = "Year")

ggplot(data = NULL, aes(x=factor(Year), y=value, group=variable)) +
  geom_line(data = df[!is.na(df$value) & df$variable != "Survey",],
            aes(linetype=variable, color = variable), size = 1, linetype = "dashed")+
  geom_point(data = df[!is.na(df$value) & df$variable == "Survey",], 
             aes(color = variable), size = 4) +
  scale_color_manual(values=c('#999999', 'orange2','turquoise2','blue2'))+
  guides(color = guide_legend(override.aes = list(linetype = c("blank", "dashed", "dashed", "dashed"),
                                                  shape = c(16, NA, NA, NA)))) +
  scale_y_continuous(
    breaks=seq(0,100, 10), labels = seq(0, 100, 10), limits=c(0,70),
    sec.axis = dup_axis()) +
  theme(
    legend.position = 'bottom', legend.direction = 'horizontal',
    panel.grid.major.y = element_line(color='gray85'),
    axis.title = element_text(face='bold')) +
  
  labs(x='Year', y='measure (%)')

  Created on 2020-07-11 by the reprex package (v0.3.0)

Выход

введите описание изображения здесь

Цель: последовательность в легенде и на соответствующих графиках должна быть следующей: c («Survey», «WhatIf», «Projected1», «Projected2»)

В качестве альтернативы я пробовал следующие методы, но результат не отличался.

  1. df$variable <- factor(df$variable, levels = c("Survey", "WhatIf", "Projected1", "Projected2" ))

  2. scale_fill_discrete(breaks = c("Survey", "WhatIf", "Projected1", "Projected2" ))

Я мог бы упустить один тривиальный шаг, и любые предложения были бы очень полезны.

1 Ответ

2 голосов
/ 11 июля 2020

Вам просто нужно добавить аргумент breaks = в scale_color_manual и изменить порядок values = , чтобы он соответствовал, потому что у вас есть ведущий аргумент, установленный на color =:

scale_color_manual(breaks = c("Survey", "WhatIf", "Projected1", "Projected2" ),
                   values=c('turquoise2','blue2','#999999', 'orange2'))+

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...