Различные легенды и заполните цвета для Facetted GGPlot?
Вопрос
Извините за не включенные никаких примеров данных для моей проблемы. Я не мог найти способ легко создать пример файла формы. Надеюсь, опытные пользователи ggplot
можно увидеть, что я хотел бы сделать из описания ниже.
У меня есть:
А.
data.frame
X с информацией о примерных участках (plotid
,var1
,var2
,var3
,var4
, …)Polygon Sharpfile.
Y
С пространственной информацией для образцов
Импорт формированного положения Y
(с участием maptools
) а также fortify
как data.frame
Z
(ggplot2
) работает отлично. melt
вспомогательный X
к X_melted
Работает одинаково в порядке. merge
-в 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
Результатом является приятный участок с одной панелью для каждой переменной. Карты панелей идентичны, но цветной цвет варьируется со значениями переменных. До настоящего времени все работает как очарование ... с одной проблемой:
Переменные имеют разные значения 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
Вам придется указать категории, которые вы хотите, чтобы потребовали время. Но, по крайней мере, график выйдет, как вы этого хотите. По сути, вы бы передовиду данные в другой столбец. Вот некоторые примеры: