Разные легенды и цвета заливки для граненого ggplot? - PullRequest
16 голосов
/ 27 сентября 2010

Извините за то, что не включены какие-либо примеры данных для моей проблемы.Я не мог найти способ легко создать файл формы примера.Надеюсь, опытные пользователи ggplot смогут увидеть, что я хотел бы сделать из приведенного ниже описания.

У меня есть:

  • A data.frame Xс информацией об образцах графиков (plotid, var1, var2, var3, var4,…)

  • Шейп-файл многоугольника Y с пространственной информацией дляпримеры графиков

Импорт шейп-файла Ymaptools) и fortify ing как data.frame Z (ggplot2) работает нормально.melt ing X до X_melted работает одинаково хорошо.merge -ing Z и X_melted до mapdf также работает.

Это означает, что теперь у нас есть data.frame в длинной форме с пространственной информацией и var1, var2, var3,…

Теперь я хочу построить этот фрейм данных следующим образом:

pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1

В результате получается хороший график с одной панелью для каждой переменной.Карты панелей идентичны, но цвет заливки зависит от значений переменных.До сих пор все работает как шарм ... с одной проблемой:

Переменные имеют разные минимальные и максимальные значения.Например, var1 изменяется от 0 до 5, var2 от 0 до 400, var3 от 5 до 10 и т. Д. В этом примере легенда для заливкицвет меняется от 0 до 400.var2 красиво нарисован, но var1 и var3 в основном одного цвета.

Можно ли использовать разные легенды для каждой панели фасета?Или это просто (пока) невозможно с facet_wrap или facet_grid в ggplot?

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

Или, может быть, есть другой пакет или метод, который я мог бы использовать, чтобы выполнить то, что я хотел бы сделать?

И помощь будет очень признательна.:)

Редактировать: С помощью описания ggplot2 я создал пример, иллюстрирующий мою проблему:

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))
values <- data.frame(
id = ids,
val1 = cumsum(runif(6, max = 0.5)),
val2 = cumsum(runif(6, max = 50))
)
positions <- data.frame(
id = rep(ids, each = 4),
x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

values <- melt(values)
datapoly <- merge(values, positions, by=c("id"))

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

Панель справа иллюстрирует различные значения для var2 на карте.Однако на панели слева все полигоны имеют одинаковый цвет.Это логично, потому что для всех панелей используется только один цветовой градиент.Могу ли я использовать разные цветовые градиенты для каждой панели?

Ответы [ 4 ]

14 голосов
/ 28 сентября 2010

В настоящее время может быть только один масштаб на график (для всего, кроме x и y).

4 голосов
/ 28 сентября 2010

С добротой сетки

align.plots <- function(..., vertical=TRUE){
#http://ggextra.googlecode.com/svn/trunk/R/align.r
  dots <- list(...)
  dots <- lapply(dots, ggplotGrob)
  ytitles <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.title.y.text",grep=TRUE), vp=NULL))
  ylabels <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.text.y.text",grep=TRUE), vp=NULL))
  legends <- lapply(dots, function(.g) if(!is.null(.g$children$legends))
                    editGrob(.g$children$legends, vp=NULL) else ggplot2:::.zeroGrob)

  gl <- grid.layout(nrow=length(dots))
  vp <- viewport(layout=gl)
  pushViewport(vp)
  widths.left <- mapply(`+`, e1=lapply(ytitles, grobWidth),
                        e2= lapply(ylabels, grobWidth), SIMPLIFY=F)
  widths.right <- lapply(legends, function(g) grobWidth(g) + if(is.zero(g)) unit(0, "lines") else unit(0.5, "lines")) # safe margin recently added to ggplot2
  widths.left.max <- max(do.call(unit.c, widths.left))
  widths.right.max <- max(do.call(unit.c, widths.right))

  for(ii in seq_along(dots)){
    pushViewport(viewport(layout.pos.row=ii))
    pushViewport(viewport(x=unit(0, "npc") + widths.left.max - widths.left[[ii]],
                          width=unit(1, "npc") - widths.left.max + widths.left[[ii]] -
                                                 widths.right.max + widths.right[[ii]],
                          just="left"))
    grid.draw(dots[[ii]])
  upViewport(2)
  }
}



p <- ggplot(datapoly[datapoly$variable=="val1",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p1 <- ggplot(datapoly[datapoly$variable=="val2",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
align.plots( p,p1)
2 голосов
/ 28 сентября 2010

С риском констатировать очевидное, кажется, что вы должны раскрашивать в процентах, а не в необработанных значениях. Тогда ваши преобразованные значения и ваша легенда перейдут от 0 до 1.

1 голос
/ 27 сентября 2010

Возможно, это немного неортодоксально, но вы можете попробовать учесть свою «ценность». Например:

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=factor(value), group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

ggplot2 использует факторы для создания легенд. Поэтому, если вы можете добавить столбец, который принимает «значение» и разбивает его на факторизованные диапазоны, вы можете заменить «значение» диапазонами.

Создайте столбец, например "f":

    id variable        value   x    y f
1  1.1     val1   0.09838607 2.0 -0.5 0.09-0.13
2  1.1     val1   0.09838607 1.0  0.0 0.09-0.13
3  1.1     val1   0.09838607 1.1  1.0 0.09-0.13
4  1.1     val1   0.09838607 2.2  0.5 0.09-0.13
25 2.1     val1   0.13121347 1.0  0.0 0.13-0.20

...

Тогда используйте:

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=f, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

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

http://www.statmethods.net/management/variables.html

...