在ggplot2中使用等值线图进行网格划分

bsh*_*hor 6 maps r ggplot2

使用Hadley的伟大的ggplot2和他的书(第78-79页),我能够轻松地生成单个等值区域图,使用如下代码:

states.df <- map_data("state")
states.df = subset(states.df,group!=8) # get rid of DC
states.df$st <- state.abb[match(states.df$region,tolower(state.name))] # attach state abbreviations

states.df$value = value[states.df$st]

p = qplot(long, lat, data = states.df, group = group, fill = value, geom = "polygon", xlab="", ylab="", main=main) + opts(axis.text.y=theme_blank(), axis.text.x=theme_blank(), axis.ticks = theme_blank()) + scale_fill_continuous (name)
p2 = p + geom_path(data=states.df, color = "white", alpha = 0.4, fill = NA) + coord_map(project="polyconic")
Run Code Online (Sandbox Code Playgroud)

其中"值"是我正在绘制的州级数据的向量.但是如果我想绘制多个地图,按一些变量(或两个)分组呢?

以下是安德鲁·格尔曼(Andrew Gelman)后来在纽约时报改编的关于美国各地卫生保健意见的情节的一个例子:

在此输入图像描述

我希望能够效仿这个例子:根据两个变量(甚至一个变量)显示网格化的等值线图.所以我不传递值的向量,而是传递一个"long"的数据帧,每个状态有多个条目.

我知道ggplot2可以做到这一点,但我不确定如何.谢谢!

Vin*_*ynd 7

您可以为所需的分组添加两列并使用构面:

library(ggplot2)
library(maps)
d1 <- map_data("state")
d2 <- unique(d1$group)
n <- length(d2)
d2 <- data.frame( 
  group=rep(d2,each=6), 
  g1=rep(1:3,each=2,length=6*n),
  g2=rep(1:2,length=6*n),
  value=runif(6*n)
)
d <- merge(d1, d2,  by="group")
qplot(
  long, lat, data = d, group = group, 
  fill = value, geom = "polygon" 
) + 
  facet_wrap( ~ g1 + g2 )
Run Code Online (Sandbox Code Playgroud)