绘图杂记【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)lib
注:文章中出现的地图不可以进行文章、期刊等出版,仅限学习使用。
安装和加载包
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)
)
接下来处理标签问题:
创建各城市中心地理坐标:
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())
不过这个加了标签后,有点丑…
添加指北针
这里我用就简单的方式添加
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
更多推荐
所有评论(0)