实现起来不难, 只是个人觉得地图配上柱状图效果不太合适. 有透视问题, 视觉上有偏差.
下面是lmdvr中的一个例子, 使用lattice中的cloud()函数绘制, 数据集为R自带的state.x77(画图时排除了阿拉斯加和夏威夷).
<br />
require(lattice)<br />
require(maps)</p>
<p>state.info <-<br />
data.frame(name = state.name,<br />
long = state.center$x,<br />
lat = state.center$y,<br />
area = state.x77[, "Area"],<br />
population = 1000 * state.x77[, "Population"])<br />
state.info$density <- with(state.info, population / area)</p>
<p>state.map <- map("state", plot=FALSE, fill = FALSE)<br />
panel.3dmap <- function(..., rot.mat, distance, xlim, ylim, zlim,<br />
xlim.scaled, ylim.scaled, zlim.scaled)<br />
{<br />
scaled.val <- function(x, original, scaled) {<br />
scaled[1] + (x - original[1]) * diff(scaled) / diff(original)<br />
}<br />
m <- ltransform3dto3d(rbind(scaled.val(state.map$x, xlim, xlim.scaled),<br />
scaled.val(state.map$y, ylim, ylim.scaled),<br />
zlim.scaled[1]),<br />
rot.mat, distance)<br />
panel.lines(m[1,], m[2,], col = "grey76")<br />
}</p>
<p>cloud(density ~ long + lat, state.info,<br />
subset = !(name %in% c("Alaska", "Hawaii")),<br />
panel.3d.cloud = function(...) {<br />
panel.3dmap(...)<br />
panel.3dscatter(...)<br />
},<br />
type = "h", scales = list(draw = FALSE), zoom = 1.1,<br />
xlim = state.map$range[1:2], ylim = state.map$range[3:4],<br />
xlab = NULL, ylab = NULL, zlab = NULL,<br />
aspect = c(diff(state.map$range[3:4]) / diff(state.map$range[1:2]), 0.3),<br />
panel.aspect = 0.75, lwd = 2, screen = list(z = 30, x = -60),<br />
par.settings = list(axis.line = list(col = "transparent"),<br />
box.3d = list(col = "transparent", alpha = 0)))<br />
</p>
效果很一般.
[attachment=212902,813]