Arhn - архитектура программирования

Переменный порядок на графике

Я использую ggplot2 для рисования линий. Я хотел бы изменить этикетки. Мои данные имеют две переменные, x1 и x2.

Вопрос в том, как мне присвоить метки в правильном порядке х1 и х2, чтобы одна метка была присвоена х1, а другая — х2, а не наоборот. Например, я хотел бы назначить «AAAA» в качестве метки для x1 и «BBBB» в качестве метки для x2, а НЕ «BBBB» для x1 и «AAAA» для x2. Следующий пример показывает, что я имею в виду:

set.seed(1)
test <- data.table(x = rnorm(29*2),var=c(rep("x1",29),rep("x2",29)),
                   time=rep(seq(as.Date("1983/12/31"),as.Date("2011/12/31"), "year"),2))


library(ggplot2);library(scales)
ggplot(data=test, aes(x=time, y=x, colour=var)) + 
  geom_line() +
  scale_color_manual(labels = c("AAAA","BBBB"),values=c("blue","red"))

Я почти уверен, что в приведенном выше примере «AAAA» присваивается x1, потому что x1 идет первым в данных. Но я не всегда уверен, какая переменная идет первой. Есть ли лучший способ для более прямого назначения? Или как сохранить контроль?

Спасибо за любые подсказки.

07.06.2020

Ответы:


1

Без scale_color_manual у вас будут разные цвета, автоматически назначенные каждой из включенных переменных.

Я думаю, что вам следует изменить значения переменной, которую вы хотите поставить «новые метки».

Эта работа для вас?:

test$var <- as.factor(test$var) # It's a categorical variable.
levels(test$var) <- c("AAAA","BBBB") # We change x1 and x2 by AAAA and BBBB

ggplot(data=test, aes(x=time, y=x, colour=var)) + 
  geom_line()

Отныне все ваши графики, использующие var, будут иметь x1 как AAAA и x2 как BBBB.

С другой стороны, если вы хотите принудительно выполнить эти изменения, не просматривая код вручную (потому что вы не хотите, чтобы вам не повезло из-за порядка значений в столбце), я предлагаю вам иметь таблицу где каждая строка имеет исходное значение и значение, которое было бы у вас в качестве словаря. (В моем примере я создаю его в коде transf_vals, но это может быть и внешняя таблица)

Затем используйте это, а не то, что было выставлено ранее:

transf_vals = data.frame("original" = c("x1", "x2"), "new" = c("AAAA","BBBB")) #This could be a .csv or excel file 

test$var <- sapply(test$var, FUN = function(x){
  transf_vals$new[which(transf_vals$original == x)]
})

ggplot(data=test, aes(x=time, y=x, colour=var)) + 
  geom_line()

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

С sapply я делаю следующее:

  1. Для каждого значения (строки) столбца test$var
  2. Проверьте, где находится в моей справочной таблице transf_vals
  3. Поскольку в этой таблице есть исходное и новое значение, просто измените исходное значение на новое, которое находится в другом столбце transf_vals.
07.06.2020
  • Спасибо, ваш код выдает ошибку. Я имею в виду, что вам нужно удалить test$var <- as.factor(test$var) и levels(test$var) <- c("AAAA","BBBB") для запуска второго блока. 07.06.2020
  • Конечно, это два варианта, используйте один, а не оба. Я делаю это более ясным в редактировании. 07.06.2020

  • 2

    Просто чтобы предложить вам альтернативу ответа Дэйва. Вы также можете использовать именованные векторы как для меток, так и для цветов, используя имена переменных в качестве имен объектов в векторах.

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

    При таком подходе ваш код будет выглядеть следующим образом (обратите внимание, что я просто немного подправил ваш код):

    library(ggplot2)
    library(scales)
    library(data.table)
    
    set.seed(1)
    test <- data.table(x = rnorm(29*2),var=c(rep("x1",29),rep("x2",29)),
                       time=rep(seq(as.Date("1983/12/31"),as.Date("2011/12/31"), "year"),2))
    
    #Declaring named vector of labels 'plabels'
    plabels <- c('x1' = "AAAA",
                 'x2' = "BBBB")
    
    #Declaring named vector of colors 'pcolors'
    pcolors <- c('x1' = "green",
                 'x2' = "blue")
    
    #Plotting
    ggplot(data=test, aes(x=time, y=x, colour=var)) + 
      geom_line() +
      scale_color_manual(labels = plabels, values=pcolors)
    

    В результате чего:

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

    07.06.2020
  • Спасибо очень интересно! Я бы принял оба ответа, если бы мог. 07.06.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..