目前计划推出基础图表的绘制教程推文(会同时推出R和Python两个版本),原因在于有时苦苦找不到数据,不仅导致想绘制的图表完成不了,而且也白白浪费了时间,再者也有小伙伴私信要求多些基础教程的推文,当然,如果遇到喜欢的图表我也会进行仿制和再现的。
上篇原创推文使用了geopandas进行了房价分布的地图推文教程,本期我们将使用绘图功能更加强大的ggplot2 以及其推展包进行地图绘制和图表美化工作,主要涉及的知识点如下:
- geojsonio包对geojson数据格式读取
- ggplot2 可视化展示
- openxlsx 实现R灵活读取excel文件
- ggtext包实现文本定制化操作
geojsonio包对geojson数据格式读取
这里使用的数据和上期推文的数据一样,读取geojson格式文件的代码如下:
代码语言:javascript复制HK <- geojson_read("香港特别行政区.json",what='sp')
即可实现R语言对geojson格式地图文件的读取。更多详细教程内容可以参考geojsonio官网。在读取完之后使用broom 包的tidy()方法进行数据灵活整理,代码如下:
代码语言:javascript复制library(broom)
HK_fortified <- tidy(HK)
HK_fortified
结果如下(部分):
转换成这样的数据格式后,我们就可以使用ggplot2 进行可视化绘制。
ggplot2 可视化绘制
简单绘制
我们只是对处理过的数据进行简单的绘制,代码如下:
代码语言:javascript复制# Plot it
library(ggplot2)
HK_map <- ggplot()
geom_polygon(data = HK_fortified, aes( x = long, y = lat, group = group), fill="#69b3a2", color="gray80")
theme_void()
coord_map()
labs(x = NULL, y = NULL,
title = "ggplot2 geojsonio map make",
caption = "Visualization by DataCharm")
HK_map
可视化结果如下:
添加读取文本标签
这里我们读取带有经纬度信息的地区文本文件(csv格式)进行文本图层的添加,文本数据预览如下(部分):
这里使用了ggrepel包进行文本图层的添加,可有效避免文本重叠的问题。代码如下:
代码语言:javascript复制# Plot it
library(ggplot2)
library(ggrepel)
HK_map <- ggplot()
geom_polygon(data = HK_fortified, aes( x = long, y = lat, group = group), fill="#69b3a2", color="gray80")
geom_text_repel(data = name,aes(x = long,y = lat,label=label),size=4)
theme_void()
coord_map()
labs(x = NULL, y = NULL,
title = "ggplot2 geojsonio map make",
caption = "Visualization by DataCharm")
HK_map
可视化结果如下:
散点图层添加
同样,我们使用上篇推文中的房价数据,这里的数据为xlsx 格式数据,我们需使用openxlsx 包进行excel文件数据的方便读取,代码如下:
代码语言:javascript复制library(openxlsx) #读取Excel 文件包
scatter <- "hk_data_select.xlsx"
scatter_df <- read.xlsx(scatter)
head(scatter_df)
部分结果如下:
接下来我们进行点图层的添加,绘图代码如下:
代码语言:javascript复制# Plot it
library(ggplot2)
library(ggrepel)
library(ggtext)
HK_map <- ggplot()
geom_polygon(data = HK_fortified, aes( x = long, y = lat, group = group), fill="#69b3a2", color="gray80")
geom_text_repel(data = name,aes(x = long,y = lat,label=label),size=4)
geom_point(data = scatter_df,aes(x = lon,y = lat,size=实用单价),color="#FFEB3B",alpha=.4)
theme_void()
coord_map()
labs(x = NULL, y = NULL,
title = "ggplot2 geojsonio map make",
caption = "Visualization by DataCharm")
HK_map
可视化结果:
定制化设置
以上的代码将主要的绘图结果绘制出来,这部分要做的就是将图表进行美化处理:如配色、图例等绘图元素的定制化设置。主要代码如下:
代码语言:javascript复制# Plot it
library(tidyverse)
library(ggrepel)
library(ggplot2)
library(ggtext)
library(dplyr)
extrafont::loadfonts()
scatter_breaks <- c(6000,10000,15000,20000,40000,80000)
HK_map <- ggplot()
geom_polygon(data = HK_fortified, aes( x = long, y = lat, group = group), fill="#170000", color="gray20",
size=.5)
geom_point(data = scatter_df,aes(x=lon,y=lat,size=实用单价),colour='#BA1717')
geom_text_repel(data = name,aes(x = long,y = lat,label=label),size=4,color='#0DCFE3',
family = 'kaiti')
# 对点图例进行定制化设置
scale_size_continuous(breaks = scatter_breaks,name = '实用单价',limits =c(6000,1000000),
guide = guide_legend(
direction = "horizontal",
title.position = "left",
label.position = "bottom",
nrow=1))
labs(
title = "香港在售二手房分布图",
subtitle="数据来源: <span style='color:#008354'>菜J学Python</span>",
caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")
theme_void()
coord_map()
#对绘图主题进行设置
theme(
plot.title = element_text(hjust = 0.5,vjust = .5, color = "white",
size = 20, margin = margin(t = 4, b = 2)),
text = element_text(family = 'kaiti',color = "white"),
plot.subtitle = element_markdown(hjust = 0.5,vjust = .5,size=12,color = "white"),
plot.caption = element_markdown(color = "white",face = 'bold',size = 10),
legend.title = element_text(size = 10),
plot.background = element_rect(fill = "black"),
legend.position = c("bottom")
)
HK_map
可视化结果如下:
ggtext 实现文本同行不同颜色设置
对一行文本不同颜色、粗细等文本属性的设置,ggtext包 可以轻松实现(这个在Python中目前还无法高效实现),这里我们只放出相应的代码,如下:
代码语言:javascript复制#导入ggtext包
library(ggtext)
#需要定制文本的地方
labs(
title = "香港在售二手房分布图",
subtitle="数据来源: <span style='color:#008354'>菜J学Python</span>",
caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")
#对绘图主题进行设置:需使用 element_markdown() 对其进行设置,和element_text()语法几乎一样
theme(
plot.title = element_text(hjust = 0.5,vjust = .5, color = "white",
size = 20, margin = margin(t = 4, b = 2)),
text = element_text(family = 'kaiti',color = "white"),
plot.subtitle = element_markdown(hjust = 0.5,vjust = .5,size=12,color = "white"),
plot.caption = element_markdown(color = "white",face = 'bold',size = 10),
legend.title = element_text(size = 10),
plot.background = element_rect(fill = "black"),
legend.position = c("bottom")
)
总结
本期推文介绍了使用ggplot2、geojsonio、ggrepel和ggtext 等包进行空间图表绘制,完整代码不是很多,但涉及的知识点较多,希望大家可以掌握。另外,ggplot2绘制定制化的图表真的很方便,大家可以结合自己喜好学习适合自己的工具。