ggplot
挑战我使用具有固定色标的地图在两个时刻比较变量的空间分布 - 以显示实际的变化。将图例条附近的变量分布添加为抖动点会非常好。
所需的绘图应该看起来像图片:假设的红色抖动点是手动添加的(我刚刚使用paint.net)到R
生成的绘图。
要重现地图,需要一个名为R
的{{1}}对象。这是附加数据的意大利NUTS-2区域的强化(使用fortIT
)SpatialPolygonsDataFrame。可以下载 RData文件 here [89KB]
地图代码:
ggplot2::fortify
地图中显示的变量是2003年的总支持比率(图A)和2043(图B,欧盟统计局区域预测)。总支持率是工作年龄人口(15-64)与非工作年龄人口(小于15岁且大于65岁)的比率。
答案 0 :(得分:6)
您可以使用密度信息
替换具有贴在其上的绘图面板的图例g <- ggplotGrob(p)
leg = gtable_filter(g, "guide-box")
dd <- ddply(fortIT, "group", summarise, fill=unique(tsr03))
dum <- ggplot(dd, aes(0,y=fill)) +
geom_dotplot(fill="red", binaxis = "y", dotsize=0.5, stackdir = "down")+
scale_y_continuous(lim=range(fortIT[,c("tsr03", "tsr43")]), expand=c(0,0)) +
theme_void()
dummy_panel <- gtable_filter(ggplotGrob(dum), "panel")
dummy_panel$layout$clip <- FALSE
a <- leg[[1]][[1]][[1]][[1]]
a <- gtable_add_cols(a, unit(1,"cm"), 0)
a <- gtable_add_grob(a, dummy_panel, 4, 1)
a$layout$clip <- FALSE
grid.newpage()
grid.draw(a)
leg[[1]][[1]][[1]][[1]] <- a
g$grobs[g$layout$name=="guide-box"] <- list(leg)
library(grid)
grid.newpage()
grid.draw(g)
答案 1 :(得分:2)
每当需要自定义图例时,我发现最好将图例绘制为单独的图,然后合并。
例如,我们可以定义以下函数:
plot_legend <- function(dots, limits, title, bins = 20) {
n <- 100
tiles <- data.frame(x = rep(0.5, n),
y = seq(limits[1], limits[2], length.out = n))
ggplot() +
geom_raster(data=tiles, aes(x = x, y = y, fill = y), interpolate = TRUE) +
geom_dotplot(data = data.frame(x = dots), aes(x = -.05, y = x, fill = ..y..),
stackdir = "down", binaxis = "y", binwidth = diff(limits)/bins, dotsize = .8) +
scale_x_continuous(limits = c(-5, 1), expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0), position = "right") +
ggtitle(title) +
theme_cowplot(12) +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.line = element_blank(),
axis.title = element_blank(),
plot.title = element_text(face = "plain", hjust = 1),
legend.position = "none")
}
我们可以这样使用:
require(ggplot2)
require(cowplot)
require(viridis)
dots <- 3*runif(100)
range <- c(0, 3)
plot_legend(dots, range, "random numbers") + scale_fill_viridis()
现在我们将它与地图代码一起使用。它需要稍微摆弄一下传说中的最终位置,但它并不过分复杂。
require(dplyr)
load(url("https://ikashnitsky.github.io/misc/160227-SO-question/fortIT.RData"))
# extract tsr03 and tsr43 data
fortIT %>% group_by(group) %>%
summarize(tsr03 = tsr03[1], tsr43 = tsr43[1]) -> df_tsr
# get color range limits
limits <- range(fortIT[,9:10])
# make the legends
legIT1 <- plot_legend(df_tsr$tsr03, limits, "TSR 2003") + scale_fill_viridis()
legIT2 <- plot_legend(df_tsr$tsr43, limits, "TSR 2043") + scale_fill_viridis()
# produce the first map
gIT1 <- ggplot()+
geom_polygon(data = fortIT, aes(x=long, y=lat, group=group, fill=tsr03),
color='grey30', size=.1) +
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0)) +
scale_fill_viridis('TSR\n2003', limits = limits, guide = "none") +
coord_equal(xlim=c(4000000, 5500000), ylim=c(1500000, 3000000)) +
theme_map() +
theme(panel.border=element_rect(color = 'black',size=.5,fill = NA))
# produce the second map
gIT2 <- ggplot()+
geom_polygon(data = fortIT, aes(x=long, y=lat, group=group, fill=tsr43),
color='grey30',size=.1)+
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0)) +
scale_fill_viridis('TSR\n2043', limits = limits, guide = "none") +
coord_equal(xlim=c(4000000, 5500000), ylim=c(1500000, 3000000)) +
theme_map() +
theme(panel.border=element_rect(color = 'black',size=.5,fill = NA))
# put everything together
plot_grid(ggdraw(gIT1) + draw_plot(legIT1, .62, .35, .35, .55),
ggdraw(gIT2) + draw_plot(legIT2, .62, .35, .35, .55),
ncol=2, labels="AUTO")
两条评论:
堆叠点的大小可以由bins
函数的plot_legend()
参数控制。 bins
越大,得分越小。
我通常会移除每张地图周围的边框,但我尝试尽可能地重现原始图形。