使用R语言和ggplot画柱状图和累积分布图(CDF)

R语言强大的画图功能对我们进行实验数据的直观分析具有很大的帮助。本文首先介绍了如何使用R语言的hist函数和ecdf函数绘制数据的柱状图和累积分布图,然后介绍了使用ggplot库和stat_ecdf函数绘制数据的柱状图和累积分布图,最后还介绍了如何读取文件中的样本数据并对数据进行分类、柱状图和累积分布图的绘。

为了便于描述,首先使用R语言提供的正态分布函数rnorm产生几个实验数据集。如果你是要画某个文件中的数据的柱状图和累积分布图,可以直接看本文后面第二节部分的内容。

1
2
3
4
5
6
7
#!/usr/bin/env Rscript
# 设置种子值
set.seed(2016)
# 使用rnorm产生部分数据
a <- rnorm(1000, 50.2, 1.5)
b <- rnorm(1000, 49.3, 0.92)
c <- rnorm(1000, 50.1, 0.5)

注意:这部分代码产生的数据集是本文第一节和第二节的画图对象

一、使用R语言基本语法画柱状图和累积分布图

(1.1) 使用R语言提供的hist函数画数据的柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 产生数据集a、b、c的柱状图.
aHistogram <- hist(a)
bHistogram <- hist(b)
cHistogram <- hist(c)
# 设置柱状图颜色.
aHistColor = rgb(1,0,0,0.2)
bHistColor = rgb(0,1,0,0.2)
cHistColor = rgb(0,0,1,0.2)
# 使用plot画图
plot(aHistogram, col=aHistColor, xlim=c(45,55), main=NA)
plot(bHistogram, col=bHistColor, xlim=c(45,55), add=T)
plot(cHistogram, col=cHistColor, xlim=c(45,55), add=T)
# 在图中加入图示
legend('right', c('a', 'b', 'c'), fill=c(aHistColor, bHistColor, cHistColor), border=NA)

本文来自微博视频下载工具

上述代码画出的柱状图如下:
R语言柱状图

(1.2) 使用R语言提供的ecdf函数画数据的累积分布图

仍然是对前面产生的数据集a、b、c进行绘图

1
2
3
4
5
6
7
8
9
10
# 设置CDF曲线的颜色
aCDFcolor <- rgb(1,0,0)
bCDFcolor <- rgb(0,1,0)
cCDFcolor <- rgb(0,0,1)
# 使用plot画图
plot(ecdf(a), col=aCDFcolor, main=NA) # 关键函数ecdf
plot(ecdf(b), col=bCDFcolor, add=T)
plot(ecdf(c), col=cCDFcolor, add=T)
# 在图中加入图示
legend('right', c('a', 'b', 'c'), fill=c(aCDFcolor, bCDFcolor, cCDFcolor), border=NA)

上述R语言代码画出的累积分布图如下:
R语言累积分布图

二、使用ggplot库画柱状图和累积分布图

仍然是对前面产生的数据集a、b、c进行绘图

(2.1) 首先加载部分必需的包

1
2
3
4
# Load the necessary packages.
library("reshape2")
library("plyr")
library("ggplot2")

(2.2) 创建ggplot使用的data frame

1
2
3
4
# 创建data frame.
ggdata <- data.frame(a, b, c)
# Melt the data frame
ggdata <- melt(ggdata)

(2.3) 使用ggplot画数据的柱状图

注意: 在aes函数中使用x=value来指定横坐标

1
2
3
4
5
6
# Set the data frame, & add ecdf() data.
ggdata <- ddply(ggdata, .(variable), transform, ecd=ecdf(value)(value))
# 使用ggplot产生柱状图
hist <- ggplot(ggdata, aes(x=value, fill=variable)) + geom_histogram(alpha=0.2, position="identity")
# 画柱状图
hist

上述代码画出的柱状图如下:
ggplot画柱状图

(2.4) 使用ggplot画数据的累积分布图

ggplot画累积分布图,可以使用提供的stat_ecdf函数!非常方便和简单
注意: 画累积分布图时需要在aes函数中使用x=value来指定横坐标,指示ggplot对什么变量进行累积分布

1
2
3
4
# 使用ggplot产生CDF,使用x=value指定对value变量画累积分布图
cdf <- ggplot(ggdata, aes(x=value)) + stat_ecdf(aes(colour=variable))
# 画CDF图
cdf

上述代码画出的累积分布图如下:
ggplot画累积分布图

三、使用ggplot库画文件中样本数据的柱状图和累积分布图

如果你要画的样本数据是存在某个文件中(比如你通过ndnSIM模拟器产生的trace文件),应该怎么画图呢?
其实基本方法还是一样的,不过需要先使用read.table函数将文件中的数据读取进来,然后再使用stat_ecdf函数画图。

如果文件的样本数据中的数据分为好几种类型(即有好几条CDF曲线),那么除了需要使用x=value来指定横坐标外,还需要使用gruop对数据进行自动分组

例如,有个data.txt文件,文件格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Type	SeqNo	Delay
algorithm1 0 145.363000
algorithm1 1 145.377000
algorithm1 2 149.625000
algorithm1 3 145.377000
algorithm1 4 149.625000
algorithm1 5 149.625000
....
algorithm2 0 183.907000
algorithm2 1 145.377000
algorithm2 2 183.944000
algorithm2 4 123.214000
algorithm2 3 183.918000
algorithm2 5 146.201000
...
algorithm3 0 145.363000
algorithm3 1 123.189000
algorithm3 2 183.944000
algorithm3 3 123.189000
algorithm3 4 145.402000
algorithm3 5 123.189000
...

如果我需要求这个data.txt文件中Delay的累积分布图,并且按算法的Type进行分类,那么,可以使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
library(ggplot2)
library(reshape2)
# 从文件中读入数据,包括第一行的列名Type、SeqNo和Delay
sample.data = read.table ('data.txt', header = TRUE, sep = "\t")
sample.data$Type = factor (sample.data$Type)
# 使用ggplot产生CDF,使用x=Delay指定求Dealy变量的画累积分布图,使用group=Type指定基于Type进行分类
cdf <- ggplot (data=sample.data, aes(x=Delay, group =Type, color = Type)) +
stat_ecdf() + scale_color_manual (values = c('blue2', 'red', 'darkgreen')) +
xlab ("Delay [ms]") +
theme_custom () +
theme(legend.position=c(0.8,0.2)) +
theme(legend.key.height=unit(0.9,'cm'))
cat ("Writing graph to [delayCDF.pdf]\n")
# 将绘图保存到指定的pdf文件中
pdf (file = "delayCDF.pdf",width=9,height=6)
cdf
x = dev.off ();

版权所有:微博视频怎么下载