做exploratory data annalysis的作业,差点被虐死了,R从头开始,边做边学,最后搞到一点多才弄完,还有一个图怎么画都不对,最后发现是数据读取的时候有问题。

用来画图的数据来自:http://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption

数据属性如下:

Attribute Information:

.date: Date in format dd/mm/yyyy
.time: time in format hh:mm:ss
.global_active_power: household global minute-averaged active power (in kilowatt)
.global_reactive_power: household global minute-averaged reactive power (in kilowatt)
.voltage: minute-averaged voltage (in volt)
.global_intensity: household global minute-averaged current intensity (in ampere)
.sub_metering_1: energy sub-metering No. (in watt-hour of active energy). It corresponds to the kitchen, containing mainly a dishwasher, an oven and a microwave (hot plates are not electric but gas powered).
.sub_metering_2: energy sub-metering No. (in watt-hour of active energy). It corresponds to the laundry room, containing a washing-machine, a tumble-drier, a refrigerator and a light.
.sub_metering_3: energy sub-metering No. (in watt-hour of active energy). It corresponds to an electric water-heater and an air-conditioner.

1.读取数据:

在R中,要从txt读取数据,需要使用read.table函数,它的几个常用的参数列表如下:

参数 含义
file 文件的名字,可以用文件的绝对路径
header 逻辑值,为1表示文件第一行包含各个变量的名称,如果不包含,可以用colnames参数指定
sep 各个变量之间的分隔符,可能是空格,分号,逗号等等,根据文件自定义就可以了
col.names 是一个向量,指定每一列的名称
colClasses 是一个类向量,指定每一列的类别
na.strings 表明数据中什么样的值被定义为NA

本例中用如下代码读入数据:

x<-read.table("D:/coursera/data analysis/household_power_consumption.txt",sep=";", header=T, colClasses = c('character', 'character', 'numeric',
'numeric', 'numeric', 'numeric','numeric', 'numeric', 'numeric'),na.strings='?')

2. 合并年月日和时分秒,并把它们转换成Date类型存放到新增加的一列DateTime中

上述代码中是将年月日和时分秒按照character类型读入的,接下来的运算中使用Date类型会比较方便。

主要有两个步骤:1.利用paste函数拼接年月日和时分秒;2.将拼接后的串转换成Date型。

代码如下:

x$DateTime <- strptime(paste(x$Date, x$Time),"%d/%m/%Y %H:%M:%S")

这里,strptime把粘贴Date和Time得到的串转换成Date格式,其中第二个参数format非常重要,原来的数据形如16/12/2006 17:24:00,所以format中的"%d/%m/%Y %H:%M:%S"要和数据一一对应。比如这里用了Y而不是y,原因在于Y表示带世纪的年份,而y只能表示不带实际的年份,它的取值范围只有00~99。还有数据中用于分隔的“/”和":"都不能省略,一旦格式和数据不同,就会发现转换后的数据都变成NA。strptime中format常用的几个参数列出如下:

%d day(01~31)
%m month(01~12)
%Y Year with century(0~9999)
%y Year without century(00~99)
%H hour(00~23)
%M minutes(00~59)
%S second(00~61)

(ps.我也不知道为什么%S可以到61,帮助文档里面是这么写的=。=)

转换后DateTime值形如:2006-12-16 17:24:00

3.抽取日期范围在“2007-2-1”和“2007-2-2”之间(包括边界)的数据放入s中:

s <- subset(x,as.Date(DateTime) >= as.Date("2007-02-01")&as.Date(DateTime) <= as.Date("2007-02-02"))

这里主要用到as.Date()函数,它把一个串转换为Date格式。

4.直方图

这里主要以global_active_power频度直方图为例,代码如下:

hist(s$Global_active_power,freq=TRUE,col="red",xlab="Global Active Power(kilowatts)",ylab="Frequency",xaxt="n",yaxt="n",main="Global Active Power")
axis(side=,at=seq(,,))
axis(side=,at=NULL)

hist函数有多个参数,可以在帮助文档中查看,常用的几个列举如下:

pch 图例样式,默认为空心的小圆圈
col 颜色,用整数定义,可以用colors()函数查看所有的颜色(查了一下,居然有657种=。=)
xlab x轴标签
ylab y轴标签
main 图像名称

上述的参数中还设置了xaxt="n",yaxt="n",是为了之后用axis(side=2,at=seq(0,1200,200))和axis(side=1,at=NULL)分别标注x和y轴的刻度。其中的seq(0,1200,200)表示产生一个0~1200,以200为公差的等差序列。

5.把图像存为png格式

dev.copy(png,filename="plot1.png",height=, width=,bg="white")
dev.off()

这里会把图像存放在当前路径下,可以用getwd()查看当前路径。

生成的图像如下:

6. 折线图

这里以DateTime-global_active_power折线图为例,有两种画图方式

5.1 直接用plot:

plot(s$DateTime, s$Global_active_power, xlab="n", ylab="Global Active Power(kilowatt)", type="l",lty=)

5.2 用plot和lines函数:

plot(s$DateTime, s$Global_active_power, xlab="n", ylab="Global Active Power(kilowatt)", pch=NA)
lines(x$DateTime, x$Global_active_power)

先用pch=NA画出一张空白图,然后用lines在上面增加折线。

第二种方法的时间会比第一种的慢。

画出的图形如下:

7. 在一张图中画出多条折线并增加图例

上述的第二种方法只要多加几个lines()函数就可以实现这一功能了。这里以DateTime-sub_metering_*(*=1,2,3)为例:

plot(s$DateTime, s$Sub_metering_1, yaxt="n", ylab="Energy Sub metering",type="l")
lines(s$DateTime, s$Sub_metering_2, col="red")
lines(s$DateTime, s$Sub_metering_3, col="blue")

增加图例用legend()函数:

legend("topright",legend=c("sub_metering_1","sub_metering_2","sub_metering_3"),col=c("black","red","blue"),cex=0.8)

其中legend=c("sub_metering_1","sub_metering_2","sub_metering_3")规定三个图例的名称,col=c("black","red","blue")规定三个图例的颜色,cex=0.8规定图例大小

  整体折线图如下:

8. 在一张图上画多个小图。

使用par函数设置一幅图的整体特征就可以做到这一点。par()函数常用的参数列表如下: 

las 取值在{0,1,2,3}中,规定轴标签的位置,比如与坐标轴平行,垂直等等
bg 背景颜色
mar 边缘大小,一般用mar=c(1,2,3,4)制定,1,2,3,4对应的数字分别制定下,左,上,右的边缘大小
oma 图外部的边缘大小,默认为0
mfrow 每行图的数量
mfcol 每列图的数量

上述有一点关于mfrow和mfcol的区别,通过使用mfrow(2,2)和mfcol(2,2)我们都可以得到2*2张子图,二者的区别在于作图的顺序不同,mfrow(2,2)通过左上->右上->左下->右下顺序作图,而mfcol(2,2)通过左上->左下->右上->右下的方式作图,虽然不知道这种区别有什么用,先放在这里了。

如上表所示,如果我们改变mfrow和mfcol的数值就可以在一幅图上画出mfrow*mfcol张小图,代码如下:

par(oma=c(,,,),mfrow=c(,),mar=c(,,,))

把上述三幅图加上另外一幅图一共四幅图画在一张图上:

 #读入数据
x<-read.table("D:/coursera/data analysis/household_power_consumption.txt",sep=";", header=T, colClasses = c('character', 'character', 'numeric','numeric', 'numeric', 'numeric','numeric', 'numeric', 'numeric'),na.strings='?') #整个图中画2*2幅小图
par(oma=c(,,,),mfrow=c(,),mar=c(,,,)) #处理时间
x$DateTime <- strptime(paste(x$Date, x$Time),"%d/%m/%Y %H:%M:%S")
s <- subset(x,as.Date(DateTime) >= as.Date("2007-02-01")&as.Date(DateTime) <= as.Date("2007-02-02"))
s$Time <- strptime(s$Time,"%Y-%m-%d %H:%M:%S") #第一张图
hist(s$Global_active_power,freq=TRUE,col="red",xlab="Global Active Power(kilowatts)",ylab="Frequency",xaxt="n",yaxt="n",main="Global Active Power")
axis(side=,at=seq(,,))
axis(side=,at=NULL) #第二张图
plot(s$DateTime, s$Global_active_power, xlab="n", ylab="Global Active Power(kilowatt)", type="l",lty=)
axis(side=,at=seq(,,)) #第三张图
plot(s$DateTime, s$Sub_metering_1, yaxt="n", ylab="Energy Sub metering",type="l")
lines(s$DateTime, s$Sub_metering_2, col="red")
lines(s$DateTime, s$Sub_metering_3, col="blue")
axis(side=,at=seq(,,))
legend("topright",legend=c("sub_metering_1","sub_metering_2","sub_metering_3"),col=c("black","red","blue"),cex=0.8) #第四章图
plot(s$DateTime, as.numeric(s$Global_reactive_power),xlab="datetime", ylab="Global reactive power", type="h",lty=)
axis(side=,at=seq(0.0,0.5,0.1))
dev.copy(png,filename="plot4.png",height=, width=,bg="white")
dev.off()

图形如下:

R语言学习笔记——Base Graphics的更多相关文章

  1. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

  2. R语言学习笔记(二)

    今天主要学习了两个统计学的基本概念:峰度和偏度,并且用R语言来描述. > vars<-c("mpg","hp","wt") &g ...

  3. R语言学习笔记:小试R环境

    买了三本R语言的书,同时使用来学习R语言,粗略翻下来感觉第一本最好: <R语言编程艺术>The Art of R Programming <R语言初学者使用>A Beginne ...

  4. R语言学习笔记:基础知识

    1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) ...

  5. R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//")> setwd("e:\桌面\")> s ...

  6. R语言学习笔记-机器学习1-3章

    在折腾完爬虫还有一些感兴趣的内容后,我最近在看用R语言进行简单机器学习的知识,主要参考了<机器学习-实用案例解析>这本书. 这本书是目前市面少有的,纯粹以R语言为基础讲解的机器学习知识,书 ...

  7. R语言学习笔记(一)

    1.不同的行业对数据集(即表格)的行和列称谓不同,统计学家称其为观测(observation)和变量(variable): 2.R语言存储数据的结构: ①向量:类似于C语言里的一位数组,执行组合功能的 ...

  8. R语言学习笔记

    向量化的函数 向量化的函数 ifelse/which/where/any/all/cumsum/cumprod/对于矩阵而言,可以使用rowSums/colSums.对于“穷举所有组合问题" ...

  9. R语言学习笔记-变量的作用域

    R语言是如何将变量值和变量绑定的 在r语言中,当前的 workspace就是global enviroment,当输入变量名时,首先会在global enviroment中搜索该变量,如有,则将它显示 ...

随机推荐

  1. 【反射】——Autofac 类型注册

    Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...

  2. ASP.NET本质论阅读----线程与异步

    线程 概要:操作系统通过线程对程序的执行进行管理 线程的数据结构:1.线程的核心对象(包含线程的当前寄存器状态),调用线程时-寄存器状态被加载到CPU中. 2.线程环境块TEB:一块用户模式下的内存 ...

  3. 图解Git/图形化的Git参考手册

    此页图解git中的最常用命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. ● git add fil ...

  4. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

  5. 奶牛通讯 usaco 网络流

    这道题很有意思,原题是只需输出最小割集大小,现在oj上改成了输出字典序最小的割集: 题解:可以考虑从小到大删边,若删掉这条边后,最小割变小,保持不变,记录此时的最小割大小: 若最小割不变,恢复这条边: ...

  6. const int *p与int *const p的区别(转:csdn,suer0101)

    本文只是一篇学习笔记,是看了<彻底搞定C指针>中的相关篇幅后的一点总结,仅此而已! 一.先搞清const int *p与int const *p的区别 它们的区别就是:没有区别!! 无论谁 ...

  7. 在 Java EE 组件中使用 Camel Routes

    摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...

  8. HDU4871 Shortest-path tree(树分治)

    好久没做过树分治的题了,对上一次做是在南京赛里跪了一道很裸的树分治题后学的一道,多校的时候没有看这道题,哪怕看了感觉也看不出来是树分治,看出题人给了解题报告里写了树分治就做一下好了. 题意其实就是给你 ...

  9. ZOJ2923 Calculate Roads(SPFA上的dp)

    算是学了图dp后的第一次应用吧.题目其实真的是非常不严谨,什么都没说,基本靠猜,而且严格来说数据应该会有爆int的,不过不管那么多啦,思路对了就好- -0 #include<iostream&g ...

  10. java 如何从配置文件(.properties)中读取内容

    1.如何创建.properties文件 很简单,建立一个txt文件,并把后缀改成.properties即可 2.将.properties文件拷入src的根目录下 3..properties文件内容格式 ...