搜索
查看: 2529|: 0

【转】【R语言】用最基本的函数和经纬度数据画地图,并加图例

[复制链接]

2

主题

1

回帖

22

积分

新手上路

积分
22
发表于 2014-2-22 00:22:13 | 显示全部楼层 |阅读模式

#江苏部分地图
rm(list=ls())
setwd("E:\\r\\za\\20120425-白老师的四件事")
#读入数据
dat4 = read.csv("tab4.csv",header=T, stringsAsFactors=F)
library(maptools)
xx2 <- readShapeLines("中国1:400万/中国地州界.shp")  #这个数据有点老了。


###########################################
#取出地级市的名称和边界坐标
p.names = as.character(xx2[[1]])   #各地级市的名称及编号
p.names[p.names=="市辖区(南通市)"]="南通市"
p.names[p.names=="淮阴市"]="淮安市"
p.nams = dat4[[1]]
aii = c()
for(i in seq(along=p.nams)){
  aii = (1:length(p.names))[p.names==p.nams]
}
aii[i+1] = (1:length(p.names))[p.names=="兴化市" ]   #兴化市现在在泰州市内,与以前不一致
ti = (1:length(aii))   #1至市的个数

#取出各个市的经纬线
p.ai = list()       #所需地区的经纬线
p.range.x = c()     #横坐标范围
p.range.y = c()     #纵坐标范围
for(i in ti){
  ai = aii           #在原数据库中的位置
  ni = p.names[ai]      #名称
  p.ai[[ni]]= xx2@lines[[ai]]@Lines[[1]]@coords   #取出相应城市的坐标,得到矩阵形式
  p.range.x = range(p.ai[][,1], p.range.x)
  p.range.y = range(p.ai[][,2], p.range.y)
}

#处理泰州市和兴化市【此地图经纬线太老,需要手动处理】
x1 = p.ai$泰州市
x2 = p.ai$兴化市
t1.x = range(x1[,1], x2[,1])
t1.y = range(x1[,2], x2[,2])
x1.n = 1:length(x1[,1])  #用于编号
x2.n = 1:length(x2[,1])  #用于编号
plot(0, type="n", xlim = t1.x, ylim = t1.y,
     xaxt="n", yaxt="n", bty="n", xlab="", ylab="")
text(x1[,1], x1[,2], x1.n )
text(x2[,1], x2[,2], x2.n, col=2 )
x3 = rbind(x2[1:31,], x1[2:59,], x2[40:57,])
polygon(x3)
p.ai$泰州市 = x3

############----------------------------------------------------------
#绘图
#颜色函数
coli=function(x, mx, mi){
  rgb((x-mi)/(mx-mi), (x-mi)/(mx-mi), (x-mi)/(mx-mi))
}
#...

mx = 11
mi = 1

for(j in 2:4) {
  layout( matrix(c(1,2,0,3), 2), height=c(1,4), width=c(6,1) )
  #layout.show(3)
  
  #第一个区域
  par(mar=c(2,0,1,0))
  x = sort(dat4[,j])
  x.nam = dat4[order(dat4[,j]),1]
  barplot(x, names.arg=x.nam,  yaxt="n", bty="n", las=2,
          col = coli(x,mx,mi))
  
  ###绘图
  par(mar=c(1,0,1,0))
  plot(0, type="n", xlim = p.range.x, ylim = p.range.y,
        xaxt="n", yaxt="n", bty="n", xlab="", ylab="")
  for(i in  seq(along=dat4[,1]) ){
    ni = dat4[i, 1]  #某个市的名称
    polygon(p.ai[[ni]], col=coli(dat4[i,j],mx,mi) )
  }
  for(i in  seq(along=dat4[,1]) ){
    ni = dat4[i, 1]  #某个市的名称
    text( mean(p.ai[][,1]), mean(p.ai[][,2]), ni )
  }
  text( p.range.x[1], p.range.y[1], names(dat4)[j], adj=c(0,0) )
  
  #图例
  par(mar=c(1,0,1,0))
  t2 = mi+0:10*((mx-mi)/10)
  plot(0 ,xlim=c(0,1), ylim=c(0,1), bty="n", xaxt="n",yaxt="n", type="n" )
  rect( 0, 0:9/10, 0.5, 1:10/10, col=coli(t2,mx,mi)[-1] )
  text( 0.8, 0:10/10, t2 )
}

############################下面不是程序#############


地区
2010
南京市
10.7
无锡市
9.54
徐州市
8.68
常州市
9.31
苏州市
9.61
南通市
8.64
连云港市
8.61
淮安市
8.53
盐城市
8.52
扬州市
8.79
镇江市
9.35
泰州市
8.41
宿迁市
8.1



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-11-24 16:11 , Processed in 0.159261 second(s), 25 queries .

快速回复 返回顶部 返回列表