18

Вопрос по ggplot2, r – Заказ нескольких легенд / гидов (что такое автоматическая логика и как ее изменить?)

Я наткнулся на это странное поведение с упорядочением легенд ggplot2s и просто не могу понять, какова логика автоматического размещения легенд:

Моя цель: на графике с несколькими шкалами я хочу расположить их в другом (тематическом) порядке, чем автоматический. Но я не смог найти команду в opts () или guides (), чтобы сделать это для меня. И просто для ясности: я не хочу менять элементы в легендах, это прекрасно работает, но расположение нескольких полных легенд.

Итак, сначала я предположил, что они были упорядочены по типу, то есть по шкале, цвету и т. Д. Но это не так, их положение меняется (см. Ниже).

Alphabetical order? Нет.

    library(ggplot2) ## v0.9

    ## Scale_colour on top
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) +
    scale_size(name = "A") + scale_colour_discrete(name = "B")

    ## Reverse names --> scale_colour on bottom
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) +
    scale_size(name = "B") + scale_colour_discrete(name = "A")

    ## Change name B to C -->  scale_colour on bottom
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) +
    scale_size(name = "C") + scale_colour_discrete(name = "A")

    ## Change name B to D -->  scale_colour on top
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) +
    scale_size(name = "D") + scale_colour_discrete(name = "A")

Другие позиции scale_colour (для измененного имени scale_size)

  • "E": bottom
  • "F" - "L": top
  • "M" - "N": bottom

и он продолжает появляться сверху внизу.

Factorial order? Нет.

    ## From top to bottom: C - B - A
    fname <- factor(c("A","B","C"), levels = c("A","B","C"))
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) +
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3])

    ## From top to bottom: B - C - A
    fname <- factor(c("A","B","C"), levels = c("C","B","A"))
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) +
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3])

    ## From top to bottom: B - C - A
    fname <- factor(c("A","B","C"), levels = c("B","C","A"))
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3])

Length of title? Нет. Я остановлюсь пока на примере кода, но он также дает колеблющиеся порядки, не зависящие от длины символа.

Есть идеи?

  • Error: User Rate Limit Exceededstackoverflow.com/a/11397958/892313

    от
  • Интересно, что для вашего первого набора примеров, добавляя пробел к каждому имениdoes заставлять легенды появляться в алфавитном порядке. (Т.е .:scale_size(name = " B") + scale_colour_discrete(name = " C")). That метод, однако, снова терпит неудачу, когда есть больше чем две легенды, которые будут устроены ...

    от Josh O'Brien
  • возможный дубликатControlling ggplot2 legend display order

    от hadley
  • Я буду очень заинтересован в ответе на этот вопрос, хотя я подозреваю, что потребуется кто-то вроде Кохске или Хэдли, чтобы взвесить. Я не смог найти никакого обсуждения этого в списке рассылки, но, похоже, что-то должно было возникнуть в какой-то момент.

    от joran
  • К сожалению, теперь порядок полей легенды зависит отhash из них, поэтому нет никакого способа предсказать порядок ... Определенно, это плохая идея моей реализации. Я (или Хэдли или ЧМ) исправлю эту проблему в будущей версии.

    от kohske
  • 17

    Как я уже упоминал в комментарии выше

    нет способа контролировать и предсказывать положение блока легенды. Я не знал об этой проблеме. Спасибо за разъяснение этого.

    Может быть, некоторые люди должны контролировать поле легенды, здесь я положил быстрое исправление:

    # run this code before calling ggplot2 function
    guides_merge <- function(gdefs) {
      gdefs <- lapply(gdefs, function(g) { g$hash <- paste(g$order, g$hash, sep = "z"); g})
      tapply(gdefs, sapply(gdefs, function(g)g$hash), function(gs)Reduce(guide_merge, gs))
    }
    environment(guides_merge) <- environment(ggplot)
    assignInNamespace("guides_merge", guides_merge, pos = "package:ggplot2")
    

    и тогда вы можете использоватьorder аргумент в пользуguide_legend (а такжеguide_colorbar),

    # specify the order of the legend.
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+
     guides(size = guide_legend(order = 1), colour = guide_legend(order = 2), alpha = guide_legend(order = 3))
    
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+
     guides(size = guide_legend(order = 3), colour = guide_legend(order = 1), alpha = guide_legend(order = 2))
    

    order аргумент должен быть положительным целым числом. Легенды расположены по порядку. Обратите внимание, что это быстрое исправление, поэтому интерфейс может быть изменен в следующей официальной версии ggplot2.