R-ggplot2 空间绘图 - 房价气泡图的绘制

2021-02-22 12:07:42 浏览数 (1)

目前计划推出基础图表的绘制教程推文(会同时推出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绘制定制化的图表真的很方便,大家可以结合自己喜好学习适合自己的工具。

0 人点赞