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

18

Я наткнулся на это странное поведение с упорядочением легенд 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? Нет. Я остановлюсь пока на примере кода, но он также дает колеблющиеся порядки, не зависящие от длины символа.

Есть идеи?

возможный дубликатControlling ggplot2 legend display order hadley
Я буду очень заинтересован в ответе на этот вопрос, хотя я подозреваю, что потребуется кто-то вроде Кохске или Хэдли, чтобы взвесить. Я не смог найти никакого обсуждения этого в списке рассылки, но, похоже, что-то должно было возникнуть в какой-то момент. joran
К сожалению, теперь порядок полей легенды зависит отhash из них, поэтому нет никакого способа предсказать порядок ... Определенно, это плохая идея моей реализации. Я (или Хэдли или ЧМ) исправлю эту проблему в будущей версии. kohske
Интересно, что для вашего первого набора примеров, добавляя пробел к каждому имениdoes заставлять легенды появляться в алфавитном порядке. (Т.е .:scale_size(name = " B") + scale_colour_discrete(name = " C")). That метод, однако, снова терпит неудачу, когда есть больше чем две легенды, которые будут устроены ... Josh O'Brien

Ваш Ответ

1   ответ
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.

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

Похожие вопросы