Заказ нескольких легенд/руководств (что такое автоматическая логика и как ее изменить?)

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

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

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

Алфавитный порядок? Нет.

    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": внизу
  • "F" - "L": top
  • "M" - "N": внизу

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

Факторный порядок? Нет.

    ## 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])

Длина заголовка? Нет. Теперь я остановлюсь с примером кода, но тот также дал флуктуирующие порядки, не зависящие от длины символа.

Любые идеи?

Ответ 1

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

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

# 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.