绘图-完美简单的分组边界你应该学这个!

2022-03-29 13:42:43 浏览数 (2)

导语

GUIDE ╲

广义上讲,ggplot2的主要目的是数据可视化,以便用户分析数据,而不是提供实用的工具来构成自定义图样。ggforce设计的目的是为ggplot2图形进行补充,更好的反映数据的分布情况。在本文中,主要介绍了ggforce对散点图添加分组边界和一些附加的可视化功能。

ggforce安装

代码语言:javascript复制
###安装ggforce及其他需要用到的包
install.packages("tidyverse")
install.packages("ggforce")
install.packages("nycflights13")
library(tidyverse)
library(ggforce)
library(nycflights13)

可视化介绍

本示例将使用nycflights13包中的数据,基于ggplot通过地理位置对机场进行可视化。

代码语言:javascript复制
###对数据可视化(散点图)
p <- airports %>%
  filter(lon < 0, tzone != "\N") %>%
  ggplot(aes(lon, lat, color = tzone))   
  geom_point(show.legend = FALSE)  
p

用ggforce进行轮廓绘制

ggforce中有四个标记函数,它们在数据周围绘制的形状而有所不同

代码语言:javascript复制
geom_mark_circle()
geom_mark_ellipse()
geom_mark_hull()
geom_mark_rect()
代码语言:javascript复制
##从geom_mark_rect()开始:在每个组周围绘制一个圆角矩形
p  
  geom_mark_rect()
代码语言:javascript复制
###使用geom_mark设置标签参数(pic.1)
p   
  geom_mark_rect(aes(label = tzone))

##重置主题并且隐藏图例(pic.2)
p   
geom_mark_rect(aes(label = tzone), show.legend = FALSE)  
  theme_void()

pic.1

pic.2

在大多数情况下,使用矩形或者圆形边框并不能完全满足我们的需求,那么就需要使用更加个性化的形状!这就要用到geom_mark_hull()函数了。

代码语言:javascript复制
##添加更复杂的轮廓
library(concaveman)
p   
  geom_mark_hull(aes(label = tzone))  
  theme_void()
代码语言:javascript复制
##填充
p   
  geom_mark_hull(aes(label = tzone, fill = tzone), show.legend = FALSE)  
  theme_void() 

ggforce的放大功能

为了更细致的观察图片的各个部分,ggforce提供了个性化的放大功能,用户可以通过设置坐标去任意放大某个部分,通过facet_zoom()去实现此功能,往往会生成两个图片,一个展示完整图片,另一个针对特定区域。

代码语言:javascript复制
###放大左下角粉色部分(通过xlim,ylim设置坐标)
p  
  facet_zoom(xlim = c(-155, -160.5), ylim = c(19, 22.3))

##也可以通过选择类别的名称对特定的类别j进行放大
p  
  facet_zoom(xy = tzone == "Pacific/Honolulu")
##这两种都会得到如下的结果--放大粉色部分

应用示例

代码语言:javascript复制
p  
  geom_mark_hull(aes(label = tzone, fill = tzone), show.legend = FALSE, expand = unit(3, "mm"))  
  theme_no_axes()  
  facet_zoom(x = tzone == "America/Los_Angeles")

通过Voronoi优化位置

代码语言:javascript复制
library(deldir)
p  
  geom_mark_hull(aes(fill = tzone), expand = unit(3, "mm"))  
  coord_cartesian(xlim = c(-130, -180), ylim = c(50, 75))   
  geom_voronoi_segment()

附加功能1:在饼状图中提取某一部分

代码语言:javascript复制
##原始图形
planes %>%
  count(engine) %>%
  ggplot()  
  geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0.7, r = 1, amount = n, fill = engine), alpha = 0.3, stat = "pie") 
##提取后
planes %>%
  count(engine) %>%
  mutate(focus = ifelse(engine == "Turbo-jet", 0.2, 0)) %>%
  ggplot()  
  geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0.7, r = 1, amount = n, fill = engine, explode = focus), alpha = 0.3, stat = "pie")  
  theme_no_axes()

附加功能2:桑基图的绘制

代码语言:javascript复制
###
prep_planes <- planes %>%
  filter(year > 1998, year < 2005) %>%
  filter(engine != "Turbo-shaft") %>%
  select(manufacturer, engine) %>%
  head(500)

prep_planes %>%
  gather_set_data(1:2) %>%
  ggplot(aes(x, id = id, split = y, value = 1))   
  ##隐藏图例
  geom_parallel_sets(aes(fill = engine), show.legend = FALSE, alpha = 0.3)  
  ##改变填充和字体颜色
  geom_parallel_sets_axes(axis.width = 0.1, color = "lightgrey", fill = "white")  
  ##删除标签的旋转
  geom_parallel_sets_labels(angle = 0)  
  theme_no_axes()

小编总结

ggforce是ggplot2的一个很棒的补充包,可以很清晰地反映数据的分布趋势和特征,除了本文提到的内容以外,ggforce还有很多有趣的功能,比如ggforce包中geom_sina参数可以整合小提琴图和箱型图去对数据进行可视化。希望大家可以在绘图的时候应用到ggforce去让你的图片更加美观!

0 人点赞