作者简介

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。

个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。

精彩集锦

那些年倒腾的R语言学习笔记,全都在这里了~

左手用R右手Python系列之——表格数据抓取之道

左手用R右手Python系列——循环中的错误异常规避

左手用R右手Python系列——异常捕获与容错处理

左手用R右手Python系列——任务进度管理

左手用R右手Python——CSS网页解析实战

左手用R右手Python系列17——CSS表达式与网页解析

左手用R右手Python系列之——字符串格式化进阶

R语言数据分析笔记——Cohort 存留分析

左手用R右手Python系列之——字符串格式化进阶

R语言多任务处理与并行运算包——foreach

R语言学习笔记之——数据处理神器data.table

ggplot2学习笔记——图例系统及其调整函数

R语言构建RFM模型了解一下

点击图片,查看详情

要说ggplot2中那些使用不多但是却功能强大的图层函数,我首先想到的就是geom_rect、geom_linerange、geom_segment、geom_ploygon。

这四个函数分别定义了ggplot2中的矩形图、垂直线图(线范围图)、线段图、几何多边形图。

这四种图表类型独立使用的机会很少,一般都是作为图表的辅助信息,但是如果能恰到好处的使用,你会挖掘出很多新意。

geom_rect()

geom_rect()一般用于制作自定义矩形,仅需在美学映射中指定每一个矩形在坐标系统中的左边界、右边界、下边界、上边界即可。

分辨对应xmax,xmax,ymin,ymax等四个美学映射参数,当然单个矩形仍然可以执行分组颜色映射操作。

具体示意如下:

library("showtext")library("ggplot2")library("magrittr")library("reshape2")library("ggthemes")library('dplyr')mydata <- data.frame(Lebal  = c("Point1","Point2","Point3","Point4","Point5"),xstart = c(5.5,15.7,19.5,37.2,36.9),xend   = c(9.7,28.1,24.6,44.6,47.1), ystart = c(9.6,23.1,2.3,33.2,9.2),yend   = c(16.1,36.2,11.7,38.5,15.3),size   = c(12,48,30,11.5,28),class  = c("A","A","A","C","C")
)
ggplot(mydata)+geom_rect(aes(xmin = xstart,xmax = xend , ymin = ystart , ymax = yend , fill = class)) +scale_fill_wsj()

按照x轴进行圆周化:

ggplot(mydata)+geom_rect(aes(xmin = xstart,xmax = xend , ymin = ystart , ymax = yend , fill = class)) +scale_fill_wsj() +ylim(-10,40) +scale_x_continuous(expand = c(0,0)) +coord_polar(theta = 'x')
#按照y轴进行圆周化ggplot(mydata)+geom_rect(aes(xmin = xstart,xmax = xend , ymin = ystart , ymax = yend , fill = class)) +scale_fill_wsj() +scale_y_continuous(expand = c(0,0)) +coord_polar(theta = 'y')
分面操作:
ggplot(mydata)+geom_rect(aes(xmin = xstart,xmax = xend , ymin = ystart , ymax = yend , fill = class)) +scale_fill_wsj() +facet_grid(.~class) +scale_y_continuous(expand = c(0,0))

想想这几个图如何使用上述图层实现?

geom_segment()

geom_segment通常用于制作直线段图,路径图、放射线图等,思路也很简单,只需要指定每一条线段的起点坐标、终点坐标即可。

即分别制定x,y,xend,yend。

具体示意如下:

mydata <- data.frame(Lebal  = c("Segment1","Segment2","Segment3","Segment4","Segment5"),xstart = c(3.5,4.4,8.3,13.2,20),ystart = c(5,2.7,4.6,2.2,4.7),xend   = c(7.5,8.7,21,25,23), yend   = c(7.9,4.2,7.2,3.8,4.4),class  = c("A","A","A","C","C")
)
ggplot(mydata) +geom_segment(aes(x = xstart, y = ystart, xend = xend,yend = yend, colour = class),arrow = arrow(length = unit(0.5,"cm")),size = 1.5) +scale_colour_wsj()
#按照X轴圆周化

ggplot(mydata) +geom_segment(aes(x = xstart , y = ystart , xend = xend ,yend = yend  , colour = class),arrow = arrow(length = unit(0.5,"cm")),size = 1.5) +scale_colour_wsj() +scale_y_continuous(expand = c(0,0)) +coord_polar(theta = 'x')
#按照y轴圆周化

ggplot(mydata) +geom_segment(aes(x = xstart , y = ystart , xend = xend ,yend = yend  , colour = class),arrow = arrow(length = unit(0.5,"cm")),size = 1.5) +scale_colour_wsj() +scale_y_continuous(expand = c(0,0)) +coord_polar(theta = 'y')
#分面操作:

ggplot(mydata) +geom_segment(aes(x = xstart , y = ystart , xend = xend ,yend = yend  , colour = class),arrow = arrow(length = unit(0.5,"cm")),size = 1.5) +facet_grid(.~class) +scale_colour_wsj() +scale_y_continuous(expand = c(0,0))

感觉没啥卵用?想想这几个图怎么实现?

geom_linerange()

这个图层函数乍看起来真的没啥用,貌似很多辅助图形都可以替代,比如那些误差线(geom_errorbar)、垂直线(geom_vline)、水平线(geom_hline)等。

但是其实不然,这个grom_linerange函数可以实现批量美学映射,包含线条颜色自定义、粗细自定义、线型自定义以及线条上下边界的自定义,通过coord_flip函数还可以将垂直线的所有应用转化为水平线应用,非常方便。

只需要指定x值,y轴的上下边界即可。

即x,ymin,ymax。

mydata <- data.frame(Lebal  = c("linerange1","linerange2","linerange3","linerange4","linerange5"),xstart = c(3.5,7,12,16,20),ymin   = c(2.5,6.5,3,4.5,3.8),ymax   = c(7.5,9.5,9,13.5,4.2),class  = c("A","A","A","C","C")
)
ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +scale_colour_wsj()
# 横纵轴互换:

ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +coord_flip() +scale_colour_wsj()
#按x轴圆周化:

ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +scale_colour_wsj() +scale_x_continuous(limits = c(0,25),expand = c(0,0)) +coord_polar(theta = 'x')
#按y轴圆周化:

ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +scale_colour_wsj() +scale_y_continuous(expand = c(0,0)) +coord_polar(theta = 'y')
#分面:

ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +scale_colour_wsj() +facet_grid(.~class) +scale_x_continuous(limits = c(0,25),expand = c(0,0))
ggplot(mydata) +geom_linerange(aes(x = xstart, ymin = ymin , ymax = ymax , colour = class) , size = 1.5) +coord_flip() +scale_colour_wsj() +facet_grid(.~class) +scale_x_continuous(limits = c(0,25),expand = c(0,0))

这个图层函数结合地图数据,可以想象的空间也很大哒!

geom_polygon()

最后一个可以说是很厉害了,几乎是ggplot2里面最为复杂、强大、适应性广的图层函数了,因为它使用极限思维,什么东西都是用尽可能多的点来拟合。

想象一下我们常见的大部分图表都是由点线面集合元素来构成,所以理论上说,只要你能从这个图形对象中发现规律,从而得到尽可能多的图形边界点,那么使用geom_polygon对象来实现目标图形那都是分分钟的事儿。

它的思路是我们对象看成是若干个闭合多边形,每一个闭合多边形通过一组有序点坐标进行首尾连接,之后再按照事物真实的隶属关系对group(闭合多边形)进行二次分组,按照有意义的组别进行颜色映射。

具体示意如下:

mydata <- data.frame(long = c(15.4,17.2,19.7,15.9,7.4,8.9,8.5,10.4,11.3,9.7,4.8,3.7,22.4,25.6,27.8,25.1,16.7,15.9,29.9,38.7,43.2,40.2,35.6,29.4),lat  = c(38.1,36.2,33.1,24.6,29.0,33.6,12.1,11.7,8.9,6.1,5.7,9.1,8.4,7.6,5.7,3.9,4.3,5.9,32.6,31.8,27.6,22.3,24.5,29.6),group= c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4),order =c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6),class = rep(c("A","c"),each = 12)
)
#

ggplot(mydata) +geom_polygon(aes(x = long , y = lat , group  = group , fill = class),colour = "white") +scale_fill_wsj()
#按照X轴圆周化:

ggplot(mydata) +geom_polygon(aes(x = long , y = lat , group  = group , fill = class),colour = "white") +coord_polar(theta = 'x') +scale_x_continuous(expand = c(0,0)) +scale_fill_wsj()
#按照y轴圆周化:

ggplot(mydata) +geom_polygon(aes(x = long , y = lat , group  = group , fill = class),colour = "white") +coord_polar(theta = 'y') +scale_y_continuous(expand = c(0,0)) +scale_fill_wsj()
#分面:

ggplot(mydata) +geom_polygon(aes(x = long , y = lat , group  = group , fill = class),colour = "white") +
facet_grid(.~class) +scale_fill_wsj()

那么关于这个图层函数,到底有啥用呢,用处大了去了,不信请看:

这个几个图形应该算是平时使用几率不会很高的图形了,但是用的恰到好处的话,能够做出非常惊艳的效果,赶快试一试吧~

《R语言商务图表与数据可视化》的课程已经更新到空间地理信息数据可视化的章节了,感兴趣的童鞋,不了解一下嘛~

https://edu.hellobi.com/course/264

如果你想要深入的去学ggplot2,但是又苦于平时学习、工作太忙木有时间研究浩如烟海的源文档,那也没关系,本小编最近花了不少功夫,把我自己学习ggplot2过程中的一些心得体会、学习经验、仿入坑指南精心整理,现已成功上线了R语言ggplot2可视化的视频课程,由天善智能独家发行,希望这门课程可以给你的R语言数据可视化学习带来更加丰富的体验。

相关课程推荐

体系全面,最具调性!R语言可视化&商务图表实战课程:

点击“阅读原文”开启新姿势

ggplot2都有哪些使用不多但是却异常强大的图层函数相关推荐

  1. 洛克王国服务器维修,洛克王国:让服务器瘫痪的4个神宠,前3位全部都没落,第4只却还这么强大...

    洛克王国:让服务器瘫痪的4个神宠,前3位全部都没落,第4只却还这么强大 首先是格斗小七,这个宠物是格斗家族之一了,因为战斗力非常厉害,而且外表有些萌的缘故,导致他当初出现的时候,玩家们对于他是很喜欢的 ...

  2. tomcat部署项目成功后,访问任何页面都是空白页,不报404异常

    tomcat部署项目成功后,访问任何页面都是空白页,不报404异常 项目部署成功: 页面空白: 输入一个错误的地址,也是空白: 原因是设置的CharchaterFilterr过滤器是全局筛选: @We ...

  3. python中sort返回值_Python函数你真的都学会了吗?来看看这篇Python高阶函数!

    二.高阶函数 高级函数, 英文叫 Higher-order Function. 那么什么是高阶函数呢? 在说明什么是=高阶函数之前, 我们需要对函数再做进一步的理解! 2.1 函数的本质 函数的本质是 ...

  4. Python函数你真的都学会了吗?来看看这篇Python高阶函数!

    二.高阶函数 高级函数, 英文叫 Higher-order Function. 那么什么是高阶函数呢? 在说明什么是=高阶函数之前, 我们需要对函数再做进一步的理解! 2.1 函数的本质 函数的本质是 ...

  5. 计算机减法函数word,谁说Excel才能运算?Word计算功能同样强大,公式函数都不在话下-excel减法函数...

    通常对于数据运算,大家第一时间都会想到Excel. 其实很多小伙伴不知道Word计算功能同样强大,加减乘除不在话下,而且还能使用函数哦. 今天就跟大家分享在Word表格中是如何使用公式运算的. 四则运 ...

  6. Android老油条都知道的7个Gradle实用奇技淫巧,kotlin高阶函数和lambda示例

    "com.android.support.test.espresso:espresso-idling-resource:3.0.2" : [ 'com.android.suppor ...

  7. 最优秀的人都在学数学,这就是法国数学如此强大的原因!

    一.引子 在德国数学家高斯的一部传记中,作者引用了下面这段话: 有一个异乡人在巴黎问当地人,"为什么贵国历史上出了那么多伟大的数学家?" 巴黎人回答,"我们最优秀的人学习 ...

  8. 数据分析-R语言资料整理

    独家分享--48页PPT解密数据可视化! Excel图表快捷操作小技巧 基于随机森林的分类与回归 R语言制作网页 ggplot2:可视化设计师的神器,了解一下 [译]R包介绍:Online Rando ...

  9. 精心整理 | R语言中文社区历史文章整理(类型篇)

    2018年过去一半了~又到了盘点的时间~感谢长时间来各位好友的关注,我们的成长与你们的爱护是分不开的.更感谢各位老师的投稿,支撑起了我们的这个社区,让更多R语言的爱好者和从业者获得最棒的知识!本文选取 ...

  10. Windows Server 2008 R2 如何启动内核调试

    相信windbg大家都不陌生,其提供了一个异常强大的功能就是kernel dbg, 在不同版本的windows 系统中启动kernel dbg的方式不禁相同,为了方便大家使用kernel dbg,本文 ...

最新文章

  1. cookiesession的QA故事[原理篇]
  2. 聚集索引和非聚集索引- -
  3. C#实现(递归和非递归)快速排序和简单排序
  4. 动画--过渡属性 transition-property
  5. 类与接口(二)java的四种内部类详解
  6. Hadoop HA+Federation 高可用联邦模式搭建指南
  7. python(matplotlib4)——Scatter 散点图,Bar柱状图(方向:向上,向下),柱状图添加注释
  8. 中石油oj 2654: 序列合并
  9. 本地方法(JNI)——访问域+字符串参数
  10. 【面向对象】面向对象技术核心内容归纳总结
  11. UVa140 Bandwidth 【最优性剪枝】
  12. beginnersbook C 语言教程·翻译完成 | ApacheCN
  13. duplicate symbols for architecture arm64的问题结决方法
  14. 魔方与科学和计算机表现李世春,科学网—魔方 - 李世春的博文
  15. 【材料计算】第一性原理、密度泛函理论、从头算之间的关系
  16. lisp语言画地物符号_地形图中的地物符号说明汇总
  17. SEO利器 - 网页内容监控之百度自动推送
  18. 安装WPS后,word文件无法预览,无法右键新建的解决办法
  19. 英语发音规则---P字母
  20. linux 设置用户只读,Linux只读账号配置

热门文章

  1. iOS 几个时间类型
  2. StackOverflow热帖:Java整数相加溢出怎么办?Java8一步搞定~
  3. 带你深挖Java泛型类型擦除以及类型擦除带来的问题
  4. 头条、滴滴、百度实习面试试题及面试总结
  5. 你真的会调试 Linux 内核故障吗,看完这一篇后你会茅塞顿开的!
  6. 谈谈 Linux 假死现象
  7. 【转】onAttachedToWindow()在整个Activity生命周期的位置及使用
  8. FastDFS单机搭建以及java客户端Demo
  9. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP
  10. UVALive - 7267 Mysterious Antiques in Sackler Museum