R语言(02)绘图

基本图形的绘制

R语言(01)中,最后的一个综合训练,我们生成了一部分数据,现在我们就用这些数据为例,来展示R是如何绘制一些图表的。

数据的导入

通过读取数据文件,我们可以导入之前产生的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
> x=read.table("mark.txt",header=F)
> x
V1 V2 V3 V4
1 10378001 99 73 98
2 10378002 86 95 90
3 10378003 98 85 84
4 10378004 90 81 100
5 10378005 81 88 96
6 10378006 99 63 61
7 10378007 88 79 100
8 10378008 88 92 95
9 10378009 91 91 100
...

其中V1列是学好,V2是均匀分布的成绩数据,V3和V4是正太分布的数据,其中V4对超过100的数据取100。

直方图分析 hist()

绘制直方图函数hist()

1
> hist(x$V2)

1
> hist(x$V3)

1
> hist(x$V4)

散点图 plot()

散点图绘制函数plot()

1
> plot(x$V1,x$V2)

柱状图barplot()

列联函数table(),柱状图绘制函数barplot()

1
2
3
4
5
6
7
> table(x$V2)

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
1 5 7 3 3 4 6 8 7 4 7 8 4 4 5 2 6 2 4 8
100
2
> barplot(table(x$V2))

饼图 pie()

饼图绘制函数pie()

1
> pie(table(x$V2))

箱尾图

  • 箱子的上下横线为样本的25%和75%分为数
  • 箱子中间的横线为样本的中位数
  • 上下延伸的直线称为尾线,尾线的尽头为最高值和最低值
  • 异常值是箱外部的个别与大多数样本相距很远的样本数据
1
> boxplot(x$V2,x$V2,x$V3)

1
> boxplot(x[2:4],col=c("red","green","blue"),notch=T)

x[2:4] 是值第2到4列

col=c(“red”,”green”,”blue”) 分别指定每个箱尾图的颜色

notch=T 是控制中间的缺口的 主要是让用户更清楚的看到中位线

水平放置的箱尾图

1
> boxplot(x$V2,x$V2,x$V3,horizontal=T)

horizontal=T 设置水平显示

星相图 stars()

  • 每个观测单位的数值表示为一个图形
  • 每个图的每个角表示一个变量,字符串类型会标注在图的下方
  • 角线的长度表达值的大小
1
> stars(x[c("V2","V3","V4")])

星相图另一种表示:雷达图

1
> stars(x[c("V2","V3","V4")],full=T,draw.segment=T)

人脸图

  • 用五官的宽度和高度来描绘数值
  • 人对脸谱高度敏感和强记忆
  • 适合较少样本的情况

安装aplpack包

1
2
> require("aplpack")
> faces(x[c("V2","V3","V4")])

其它脸谱图

安装TeachingDemos包

1
2
> require("TeachingDemos")
> faces2(x)

茎叶图 stem()

1
2
3
4
5
6
7
8
9
10
11
12
> stem(x$V3)

The decimal point is 1 digit(s) to the right of the |

6 | 0233
6 | 88
7 | 000111222333333
7 | 55556677888888888999999999
8 | 0000011111112223333333444444
8 | 5556666788888899
9 | 001224
9 | 559

6 | 0233 代表60,62,63,63四个样本数据.茎叶图没有图像输出,是一种高密集型的数据展现形式。

QQ图

  • 可用于判断是否正态分布(服从正态分布的点基本都处于同一直线)
  • 直线的斜率是标准差,截距是均值
  • 点的散布越接近直线,则越接近正态分布
1
> qqnorm(x$V2)

1
> qqline(x$V2)

x$V3 数据服从正态分布,点基本都处于同一直线上:

1
> qqnorm(x$V3)

1
> qqline(x$V3)

图形绘制进阶

散点图进一步设置

在mac上绘图时显示中文,需要安装以下安装包:

  • showtext
  • showtextdb
  • sysfonts
1
2
3
4
> library(sysfonts)
> library(showtext)
> dev.new() #如果已打开图形设备,本句可以不用
> showtext.begin()

加入这几句之后,绘制的图像中就可以正常显示中文了。

1
2
3
4
5
6
7
8
9
10
> plot(x$V2,x$V3,
main="数学分析与线性代数成绩的关系",
xlab="数学分析",
ylab="线性代数",
xlim=c(0,100),
ylim=c(0,100),
xaxs="i", #Set x axis style as internal
yaxs="i", #Set y axis style as internal
col="red", #Set the color of plotting symbol to red
pch=19) #Set the plotting symbol to filled dots

连线图

1
2
3
> a=c(2,3,4,5,6)
> b=c(4,7,8,9,12)
> plot(a,b,type="l")

type=”l” 代表想字母”l”一样,是折现。

密度图 density()

函数density()

1
> plot(density(rnorm(1000)))

R中的内置数据集

在R中输入data可查看内置数据集:

1
data()

热力图 heatmap()

利用内置的mtcars数据集绘制

1
2
3
4
5
6
7
> heatmap(as.matrix(mtcars),
Rowv=NA,
Colv=NA,
col=heat.colors(256),
scale="column",
margins=c(2,8),
main="Car characteristics by Model")

Iris(鸢尾花)数据集

  • Sepal花萼
  • Petal花瓣
  • Species种属

这是一个非常著名的数据集,Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
11 5.4 3.7 1.5 0.2 setosa
...

向日葵散点图 sunflowerplot()

  • 用来克服散点图中数据点重叠问题
  • 在有重叠的地方用一朵“向日葵花”的花瓣数目来表示重叠数据个数
1
> sunflowerplot(iris[,3:4],col="gold",seg.col="gold")

散点图集

  • 遍历样本中全部的变量配对画出二元图
  • 直观地了解所有变量之间的关系

将iris数据集的第1到4列的数据取出,两两组合,形成散点图。

1
> pairs(iris[,1:4])

用plot也可以实现同样的效果

1
2
3
4
5
6
> plot(iris[,1:4],
main="Relationships between
characteristics of iris flowers",
pch=19,
col="blue",
cex=0.9)

  • 利用par()在同一个device输出多个散点图
  • Par命令博大精深,用于设置绘图参数,help(par)
1
2
> par(mfrow=c(3,1))
> plot(x$V2,x$V3);plot(x$V3,x$V4);plot(x$V4,x$V1)

par(mfrow=c(3,1)) 把屏幕划分成3个水平区域
plot(x1,x2);plot(x2,x3);plot(x3,x1); 分别将三个散点图显示在这三块区域中。

如果想深入学习R语言图像绘制,建议对par()函数的文档深入学习,并且学习《R Graphs Cookbook》这本书,会有很大收获的。

颜色colors()

查看有哪些颜色 colors()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> colors()
[1] "white" "aliceblue" "antiquewhite"
[4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
[7] "antiquewhite4" "aquamarine" "aquamarine1"
[10] "aquamarine2" "aquamarine3" "aquamarine4"
[13] "azure" "azure1" "azure2"
[16] "azure3" "azure4" "beige"
[19] "bisque" "bisque1" "bisque2"
[22] "bisque3" "bisque4" "black"
[25] "blanchedalmond" "blue" "blue1"
[28] "blue2" "blue3" "blue4"
[31] "blueviolet" "brown" "brown1"
[34] "brown2" "brown3" "brown4"
...
  • 绘图设备
1
2
3
4
5
6
7
8
> dev.cur() # 当前图形窗
> dev.list() # 查看现在所有的图形窗
> dev.next(which=dev.cur()) #某个图形窗的后一个图形窗
> dev.prev(which=dev.cur()) #某个图形窗的前一个图形窗
> dev.off(which=dev.cur()) #关闭某个图形窗
> dev.set(which=dev.next()) #设置图形窗
> dev.new(...) #开启新的图形窗
> graphics.off() #关闭整个窗口

三维散点图

安装scatterplot3d包

1
2
> library(scatterplot3d)
> scatterplot3d(x[2:4])

1
2
3
4
> x<-y<-seq(-2*pi,2*pi,pi/15)
> f<-function(x,y)sin(x)*sin(y)
> z<-outer(x,y,f)
> contour(x,y,z,col="blue")

1
2
> contour(x,y,z,col="blue")
> persp(x,y,z,theta=30,phi=30,expand=0.7,col="lightblue")

地图

安装maps包

显示美国地图:

1
2
> library(maps)
> map("state",interior=F)

state 代表美国

世界地图的绘制:

1
> map("world",fill=T,col=heat.colors(10))

社交数据可视化

通过R可以画出如下的facebook社交关系图: