ggplot2学习
R语言里面一个比较重要的绘图包——ggplot2,是由Hadley Wickham于2005年创建,于2012年四月进行了重大更新,作者目前的工作是重写代码,简化语法,方便用户开发和使用。ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离,是按图层作图,有利于结构化思维,同时它保有命令式作图的调整函数,使其更具灵活性,绘制出来的图形美观,同时避免繁琐细节。ggplot2可以通过底层组件构造前所未有的图形,你所受到的限制只是你的想象力。
它大概可以分为三个部分:
(1)数据层(2)几何图形层(3)美学层;
如果你用过photoshop,那么对于图层你一定不会陌生。图层好比是一张玻璃纸,它包含有各种图形元素,你可以分别建立图层然后可以按照不同顺序叠放在一起,组合成图形的最终效果。因此图层可以允许用户一步步的构建图形,方便单独对图层进行修改、增加统计量、甚至改动数据,因此绘制出来的图形一般十分漂亮并且符合自己的意愿。
ggplot2大致包含了一下几个基本概念:
• 数据(Data)和映射(Mapping)
• 标度(Scale)
• 几何对象(Geometric)
• 统计变换(Statistics)
• 坐标系统(Coordinate)
• 图层(Layer)
• 分面(Facet)
数据(Data)和映射(Mapping)
将数据中的变量映射到图形属性。映射控制了二者之间的关系。
标度(Scale)
标度负责控制映射后图形属性的显示方式。具体形式上来看是图例和坐标刻度。Scale和Mapping是紧密相关的概念。
几何对象(Geometric)
几何对象代表我们在图中实际看到的图形元素,如点、线、正方块等多边形。
统计变换(statistics)
对原始数据进行某种统计计算,例如对二元散点图加上一条回归线或者置信区间登记。
分面(Facet)
条件绘图,将数据按某种方式分组,然后分别绘图。分面就是控制分组绘图的方法和排列形式。
我们使用ggplot2自带的数据集mpg,它包含了1999年和2008年之间 EPA使上可用燃料经济性数据的一个子集等信息。它总共有234行,11列数据。
加载了ggplot2包之后,可以使用如下语句绘制出下图
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+geom_point()+aes(colour=factor(mpg$year))
其中data=mpg,mapping = aes(x=cty,y=hwy)表示数据层,geom_point()表示几何图形层,aes(colour=factor(mpg$year))表示美学图层。我将year映射为映射到颜色属性。如过我们把上面句子写成如下:
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))
则它什么也不会绘出来,因为他缺少几何图形层。写成下面语句绘制出来的散点图全是黑点,因为它缺少美学图层
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+geom_point()
如果我们觉得这些点太小或者太大的时候,我们可以通过改变size的参数来调节散点的大小,一般使用方法是size=I(x);这个I()最好加上,否则有的时候会出现莫名奇怪的错误,有的时候不加也行,直接size=x也行,x为散点的大小,它一般按照使用者的经验或一次次试来确定大小的。
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+geom_point(size=I(7))+aes(colour=factor(mpg$year))
我们也可以绘制出它的拟合曲线以及置信区间,它根据年份绘出了两条拟合曲线以及置信区间。
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+geom_point()+aes(colour=factor(mpg$year))+stat_smooth()
但如果我们只想绘制一条拟合曲线和一个置信区间,我们只需要将代码稍微改变一下就可以搞定。
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+geom_point(aes(colour=factor(mpg$year)))+stat_smooth()
在前面,我们将year变量映射到散点的颜色上面,现在我们也可以将displ变量映射到散点大小,绘制出来的大小不同的散点。
- ggplot(data=mpg,mapping =aes(x=cty,y=hwy))+
- geom_point(aes(colour=factor(year),size=displ))+
- stat_smooth()
使用过Photoshop的人一定知道透明度,即alpha。当然我们的ggplot2包也提供相关参数,可以改变alpha值得大小来改变散点的透明度。alpha的值在0—1之间,不在这个范围的话则会报错。为了与前面的图片有明显的区别,我再这里的alpha值调的比较小。一般默认alpha值得大小为1。
- ggplot(data=mpg,mapping = aes(x=cty,y=hwy))+
- geom_point(aes(colour=factor(mpg$year),size=displ),alpha=0.25)+
- stat_smooth()
当然我们也可以给图片增加标题,并精细修改图片,给图片增加x,y轴说明,以及其他说明。
- ggplot(mpg, aes(x=cty, y=hwy))+
- geom_point(aes(colour=class,size=displ),alpha=0.6,position = "jitter")+
- stat_smooth()+
- scale_size_continuous(range = c(4, 10))+
- facet_wrap(~ year,ncol=1)+
- ggtitle("汽车油耗与型号")+
- labs(y='每加仑高速公路行驶距离',
- x='每加仑城市公路行驶距离')+
- guides(size=guide_legend(title='排量'),
- colour = guide_legend(title='车型',
- override.aes=list(size=5)))
写的比较早的博客或者论坛上面会有opts()函数来给图片命名,不过只有在以前的ggplot2包版本里面有opts()函数,但现在比较新的ggplot2包里面已经没有该函数了,如果你使用较新的ggplot2包使用该函数则会提示你找不到该函数,因为它已经被替换为ggtitle(),使用方法如上面代码。
上面代码里面有一个position的函数,通过调整参数来改变图层的位置,现在ggplot2只有5种,再往回版本的更新,也许会增加。大家可以修改position函数的参数来观测不同参数绘制出来的图形会有哪些变化。
fill:填充方式, 先把数据归一化,再填充到绘图区的顶部。
dodge:比如说不同折线的标记有可能重复,可以改变改参数进行一个“避让”方式,即往旁边闪,比如说如柱形图的并排方式。
identity:原地不动,不调整位置,默认。
jitter:如果严重的重叠,随机抖一抖,让本来重叠的露出点头来
stack:在竖直方向叠罗汉,绘制出来类似条形图
在有的时候我们需要把一个变量和其他不同的变量进行一个对比,这个时候我们就需要把他们画在同一张图上面。ggplot2绘图就和Photoshop有一个功能很相似,那就是 图层, 我们可以把不同的图层叠加在一起,这样就画在了同一张图上面。比如说我们要研究mpg数据中cty和hwy,以及displ之间的关系,我们就可以通过如下代码,将他们之间的散点图画在一起。
- ggplot()+
- geom_point(aes(x=mpg$cty,y=mpg$hwy),color="red")+
- geom_point(aes(x=mpg$cty,y=mpg$displ),color="green")
结果如下图:两个因变量用不同的颜色来表示。
接下来,我们来绘制一个扇形图,我们来统计一下class中各个品牌所占比例,代码和图片如下:
- ggplot(mpg)+geom_bar(width=1, aes(x=factor(1),fill=mpg$class))+
- coord_polar(theta="y")
我们也可以通过使用ggplot2包来绘制 Coxcomb Plots (鸡冠花图,又名玫瑰图),这个也非常简单。width的值可以调整各个扇形区域之间的距离。
- ggplot(mpg, aes(x = factor(mpg$class))) +
- geom_bar(width = 0.7,aes(color=factor(mpg$class))) + coord_polar()
当然我们也可以给他增添颜色,代码只要稍微改一下:
- ggplot(mpg, aes(x = factor(mpg$class),fill=mpg$class)) +
- geom_bar(width = 0.7) + coord_polar()
ggplot2学习的更多相关文章
- ggplot2 学习笔记 (持续更新.....)
1. 目前有四种主题 theme_gray(), theme_bw() , theme_minimal(),theme_classic() 2. X轴设置刻度 scale_x_continuous(l ...
- ggplot2学习笔记之图形排列
转载:https://www.jianshu.com/p/d46cf6934a2f R语言基本绘图函数中可以利用par()以及layout()来进行图形排列,但是这两个函数对于ggplot图则不太适用 ...
- ggplot2学习总结
- [转]ggplot2用法简单介绍
简介 ggplot2包是基于Wilkinson在<Grammar of Graphics>一书中所提出的图形语法的具体实现, 这套图形语法把绘图过程归纳为data, transformat ...
- ggplot2入门与进阶(上)
出处:http://www.cellyse.com/how_to_use_gggplot2_part1/ ggplot2包是基于Wilkinson在<Grammar of Graphics> ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札37)ggplot2基本绘图语法介绍
一.简介 ggplot2是R语言中四大著名绘图框架之一,且因为其极高的参数设置自由度和图像的美学感,即使其绘图速度不是很快,但丝毫不影响其成为R中最受欢迎的绘图框架:ggplot2的作者是现任Rstu ...
- (数据科学学习手札57)用ggplotly()美化ggplot2图像
一.简介 经常利用Python进行数据可视化的朋友一定用过或听说过plotly这样的神器,我在(数据科学学习手札43)Plotly基础内容介绍中也曾做过非常详细的介绍,其渲染出的图像以浏览器为载体,非 ...
- ggplot2基础学习
前言 ggplot2是R语言最流行的第三方扩展包,是RStudio首席科学家Hadley Wickham读博期间的作品,是R相比其他语言一个独领风骚的特点.包名中“gg”是grammar of gra ...
随机推荐
- 利用HttpWebRequest模拟表单提交 JQuery 的一个轻量级 Guid 字符串拓展插件. 轻量级Config文件AppSettings节点编辑帮助类
利用HttpWebRequest模拟表单提交 1 using System; 2 using System.Collections.Specialized; 3 using System.IO; ...
- oc 工厂方法
通过上例看oc创建实例有点麻烦,oc里面可以创建工厂方法可以让这个操作更简单一些(其实就是c#或者java里面的静态方法). 新建一个“Cocoa Touch Class”文件,命名为People P ...
- oc引入头文件
建立.h的头文件(header file)命名为Hi.h,源码如下: #ifndef oc3_Hi_h #define oc3_Hi_h void sayHi(); #endif 建立.c的头文件(c ...
- JMeter学习-内存溢出解决方法
现象:使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了 方法一: windows环境下,修改jmeter.bat: set HEAP=-Xms2 ...
- NGUI: UIPanel控件
转自:http://blog.csdn.net/huang9012/article/details/19411703 http://bbs.9ria.com/thread-417659-1-1.htm ...
- 统计svn 代码提交情况
统计svn代码提交,使用工具 statsvn.jar 下载地址:http://sourceforge.net/projects/statsvn/ rem 声明一个时间变量 作为文件名 %time:~, ...
- JabRef中添加中文文献出现乱码 解决方法
JabRef中添加中文文献出现乱码 解决方法 问题描述 JaBRef是一款开源的文献管理软件,主要用来管理bibtex格式的参考文献,可以与LATEX配合使用,方便论文参考文献的使用.文献管理 ...
- object-c 获得目录(包括子目录)下所有文件和文件夹路径
void getAllPathNameInDirectory(vector<string>&filePathList,vector<string>&direct ...
- 使struct对象拥有可变大小的数组——(C++深度探索)
首先摘录<Inside The C++ Object Model>中的一段话: 把单一元素的数组放在一个struct的尾端,于是每个 struct objects 可以拥有可变大小的数组: ...
- Android Spans介绍(转)
在做一个 TODO 类的软件,使用开源软件 MaterialCalendarView 的时候,发现了需要往日历中添加待办事宜的标记,用到了 MaterialCalendarView 中的 DotSpa ...