绘图杂记【5】R语言绘制热力地图(重庆热力地图)

注:文章中出现的地图不可以进行文章、期刊等出版,仅限学习使用。


安装和加载包

install.packages(mapdata)
install.packages(maptools)
install.packages(ggplot2)
install.packages(plyr)
install.packages(rgdal)
install.packages(mapproj)


library(ggplot2)
library(maps)
library(mapdata)
library(maptools)
library(plyr)
library(rgdal)
library(mapproj)

快速绘图

library(maps)
map()  # 世界地图


map("state") # 美国各个州


map("county") # 各个州更细分

读取 shp 文件

绘制热力图

china_map <- rgdal::readOGR("bou2_4p.shp")
plot(china_map)

在这里插入图片描述
图像过于扁平,需要进行调整

ggplot(
	china_map,
	aes(x=long,y=lat,group=group)) +
geom_polygon(
	fill="white",
	colour="grey") +
coord_map("polyconic")

在这里插入图片描述
或者

ggplot(
	china_map, 
	aes(x = long, y = lat,group = group)) +
geom_polygon(
	fill = "white", 
	colour = "black") +
coord_map("polyconic") +
theme(
   panel.grid = element_blank(),
   panel.background = element_blank(),
   axis.text = element_blank(),
   axis.ticks =element_blank(),
   axis.title = element_blank(),
   legend.position = c(0.2, 0.3)
)

在这里插入图片描述
准备加入数据

x <- china_map@data #读取行政信息
xs <- data.frame(x,id=seq(0:924)-1) #含岛屿共925个形状
china_map1 <- fortify(china_map) #转化为数据框
china_map_data <- join(china_map1, xs, type = "full")      #合并两个数据框
library(readxl)
a <- read_excel("C:/Users/Administrator/Desktop/a.xlsx")
a

数据
在这里插入图片描述

下面读取业务指标数据,并与地图数据合并:

china_data <- join(china_map_data, mydata, type="full") #合并两个数据框

绘制地图

ggplot(
	china_data, 
	aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +
scale_fill_gradient(low="#99FF99",high="#FF6666") +  #指定渐变填充色,可使用RGB
coord_map("polyconic") #指定投影方式为polyconic,获得常见视角中国地图

在这里插入图片描述
改进

去掉图中的背景色、坐标轴、经纬线等

在这里插入图片描述

ggplot(
	china_data, 
	aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +
scale_fill_gradient(low="#99FF99",high="#FF6666") +  #指定渐变填充色,可使用RGB
coord_map("polyconic")+ #指定投影方式为polyconic,获得常见视角中国地图
#清除不需要的元素
theme(
   panel.grid=element_blank(),
   panel.background=element_blank(),
   axis.text=element_blank(),
   axis.ticks=element_blank(),
   axis.title=element_blank(),
   legend.position = c(0.9,0.6)
)

接下来处理标签问题:

创建各城市中心地理坐标:

在这里插入图片描述
chinaprovincecity

province_city <- read.csv("C:/Users/Administrator/Desktop/chinaprovincecity.csv")  #读取省会城市坐标

ggplot(china_data,aes(long,lat))+
geom_polygon(aes(group=group,fill=number),colour="grey60")+
scale_fill_gradient(low="#99FF99",high="#FF6666") +
coord_map("polyconic") +
geom_text(aes(x = jd,y = wd,label = province), data =province_city,colour="black",size=3)+
theme(
         panel.grid = element_blank(),
        panel.background = element_blank(),
         axis.text = element_blank(),
         axis.ticks = element_blank(),
         axis.title = element_blank()
)

按照同样的方法,绘制重庆地图

地图数据

cq <- rgdal::readOGR("重庆.shp")
plot(cq)

在这里插入图片描述

# 有可能乱码,看一下那些字段乱码了
head(cq@data)
# 逐一修改
Encoding(cq@data$name) <- "UTF-8" ##转换格式为UTF-8

# 再检查一次
head(cq@data)
data1 <- cq@data         
data2 <- data.frame(id=row.names(data1),data1)  
cq_ <- fortify(cq) #转化为数据框
cq_map_data <- join(cq_, data2, type = "full") 
head(cq_map_data)

准备填充数据

library(readxl)
library(xlsx)
# 把城市名称保存为excel表,这样就不用了自己写城市名,或者如果业务数据本身有城市名,也可以跳过这步
write.xlsx(cq@data$name,'b.xls',row.names = F)

如果需要这一步,就把数据按城市名对应的添加

例如

在这里插入图片描述

如果不需要这一步,可以用连接的方式,合并数据

这里我使用 group 字段进行合并

#读取业务数据
mydata1 <- read_excel("C:/Users/Administrator/Desktop/b - 副本.xlsx")
mydata1

数据为虚构
在这里插入图片描述

#读取业务指标数据,并与地图数据合并
cq_data <- join(cq_map_data, mydata1, type="full") #合并两个数据框

在这里插入图片描述
开始绘图

# 绘图
windowsFonts(myFont = windowsFont("微软雅黑")) 
ggplot(
	cq_data, 
	aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +ggtitle("2020年重庆xxx数据分布")+
scale_fill_gradient(low="#99FF99",high="#FF6666") +
theme(plot.title=element_text(family="myFont",size=19,hjust = 0.5), 
)

# 主题设置https://blog.csdn.net/u014801157/article/details/24372531

在这里插入图片描述
关于颜色

参考:R语言的颜色应用

颜色数据集RColorBrewer

library(RColorBrewer)
brewer.pal.info 

在这里插入图片描述

使用:

brewer.pal(n, name),n为要生成多少个颜色,name对应上面图片中颜色条的名字

比如:brewer.pal(11,'Spectral')

在这里插入图片描述

自定义渐变色板 colorRampPalette()

用法:
1.输入调色板的主要颜色,返回函数
2.在函数中输入想要获取的颜色数量,返回颜色数值

library(scales) #调用scales库中的show_col函数
mypalette<- colorRampPalette(c("#FF66CC" , "#FF6600"))
mycolors<- mypalette(12)#12种颜色,返回颜色数值
show_col(mycolors)

在这里插入图片描述

mypalette<- colorRampPalette(c("#FF66CC" , "#FF6600",'#66CCFF'))
mycolors<- mypalette(16)#16种颜色,返回颜色数值
show_col(mycolors)

在这里插入图片描述
在这里,可以使用scale_fill_gradientn来设置梯度颜色

在这里插入图片描述

清除一些元素

# 绘图
windowsFonts(myFont = windowsFont("微软雅黑")) 
ggplot(
	cq_data, 
	aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +ggtitle("2020年重庆xxx数据分布")+
scale_fill_gradientn(colours = colorRampPalette(brewer.pal(5,'GnBu'))(24))+
theme(plot.title=element_text(family="myFont",size=19,hjust = 0.5), 
,   panel.grid=element_blank(),
   panel.background=element_blank(),
   axis.text=element_blank(),
   axis.ticks=element_blank(),
   axis.title=element_blank())

在这里插入图片描述

接下来处理标签问题:

创建各城市中心地理坐标:

midpos <- function(data1) mean(range(data1,na.rm=TRUE))
centres <- ddply(cq_data,.(name),colwise(midpos,.(long,lat)))
# 绘图
windowsFonts(myFont = windowsFont("微软雅黑")) 
ggplot(
	cq_data, 
	aes(x = long, y = lat)) +
geom_polygon(aes(group=group,fill=number),colour="white")+
scale_fill_gradientn(colours = colorRampPalette(brewer.pal(5,'GnBu'))(24))+
coord_map("polyconic") +
geom_text(aes(label=name),size =3,family="myFont",fontface="plain",data=centres)+ 
ggtitle("2020年重庆xxx数据分布")+
theme(plot.title=element_text(family="myFont",size=19,hjust = 0.5), 
,   panel.grid=element_blank(),
   panel.background=element_blank(),
   axis.text=element_blank(),
   axis.ticks=element_blank(),
   axis.title=element_blank())

在这里插入图片描述
不过这个加了标签后,有点丑…

添加指北针

用tmap程序包绘制带指北针、图例和经纬网的采样点地图

这里我用就简单的方式添加

library(ggsn)     ## 提供指北针
library(legendMap) ## 提供比例尺
midpos <- function(data1) mean(range(data1,na.rm=TRUE))
centres <- ddply(cq_data,.(name),colwise(midpos,.(long,lat)))
# 绘图
windowsFonts(myFont = windowsFont("微软雅黑")) 
cq =ggplot(
	cq_data, 
	aes(x = long, y = lat)) +
geom_polygon(aes(group=group,fill=number),colour="white")+
scale_fill_gradientn(colours = colorRampPalette(brewer.pal(5,'GnBu'))(24))+
coord_map("polyconic") +
geom_text(aes(label=name),size =3,family="myFont",fontface="plain",data=centres)+ 
ggtitle("2020年重庆xxx数据分布")+
theme(plot.title=element_text(family="myFont",size=19,hjust = 0.5), 
,   panel.grid=element_blank(),
   panel.background=element_blank(),
   axis.text=element_blank(),
   axis.ticks=element_blank(),
   axis.title=element_blank())

library(ggsn)     ## 提供指北针
north2(cq,.82,.88)## 数字是指定指北针的位置

在这里插入图片描述

不过我的比例尺加不上去


也可以通过重庆主城区,填充颜色

主城区

cq_map <- rgdal::readOGR("重庆主城区.shp")
plot(cq_map)

在这里插入图片描述
主城新区
在这里插入图片描述

cq_map_12 <- rgdal::readOGR("主城新区.shp")
plot(cq_map_12)

cq_map_121 <- fortify(cq_map_12) #转化为数据框
cq_map_12@data

library(readxl)
b <- read_excel("C:/Users/Administrator/Desktop/a - 副本.xlsx")
b
c <- join(cq_map_121, b, type="full") #合并两个数据框
ggplot(
	c, 
	aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +
scale_fill_gradient(low="#99FF99",high="#FF6666") +  #指定渐变填充色,可使用RGB
theme(
   panel.grid=element_blank(),
   panel.background=element_blank(),
   axis.text=element_blank(),
   axis.ticks=element_blank(),
   axis.title=element_blank(),
   #legend.position = c(0.9,0.6)
)

在这里插入图片描述

参考:

http://blog.sina.com.cn/s/blog_6bc5205e0102vma9.html
https://zhuanlan.zhihu.com/p/29157375
https://zhuanlan.zhihu.com/p/26880814
https://zhuanlan.zhihu.com/p/187531793

  • 10
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值