Различные легенды и заполните цвета для Facetted GGPlot?

StackOverflow https://stackoverflow.com/questions/3805029

  •  25-09-2019
  •  | 
  •  

Вопрос

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

У меня есть:

  • А. data.frame X с информацией о примерных участках (plotid, var1, var2, var3, var4, …)

  • Polygon Sharpfile. Y С пространственной информацией для образцов

Импорт формированного положения Y (с участием maptools) а также fortifyкак data.frame Z (ggplot2) работает отлично. meltвспомогательный X к X_melted Работает одинаково в порядке. mergeZ а также 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

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

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

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

Я мог бы сделать отдельные участки для каждой переменной и присоединиться к ним с помощью Viewports, но там много переменных, и это было бы много работы.

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

И помощь будет очень ценится. :)

Редактировать: с помощью 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 на карте. На панели слева все полигоны имеют одинаковый цвет. Это логично, потому что для всех панелей используется только один цветной градиент. Могу ли я использовать другой градиент цвета для каждой панели?

Это было полезно?

Решение

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

Другие советы

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

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)

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

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

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/manalagement/variables.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top