vlambda博客
学习文章列表

R语言入门之点图和条形图

第一部分:点图

在R语言里我们可以利用dotchart(x, labels=, groups=, gcolor=, cex=)函数来绘制点图,参数x是一组数值型向量,labels这个参数则是代表x中每个值的标签,其数据类型也是向量,这两个是基本参数。除此以外,groups参数可以对x进行分组,gcolor指定各个组的颜色,而cex则可以控制标签的尺寸。在这里我们仍将使用R内置的mtcars数据集来演示。

# 简单示例dotchart(mtcars$mpg,labels=rownames(mtcars),cex=0.7, main="Gas Milage for Car Models",    xlab="Miles Per Gallon")# 对数据进行分组绘图# 按照mpg进行排序, 利用cylinder这个变量进行分组和上色# cylinder是指汽车的气缸数# 这里需要新建变量color用来存储颜色信息x <- mtcars[order(mtcars$mpg),] # 按照mpg排序x$cyl <- factor(x$cyl) # 将cylinder转换成因子x$color[x$cyl==4] <- "red" # 指定气缸数为4的为红色x$color[x$cyl==6] <- "blue" # 指定气缸数为6的为蓝色x$color[x$cyl==8] <- "darkgreen" # 指定气缸数为8的为深绿色dotchart(x$mpg,labels=row.names(x),cex=0.7,groups= x$cyl, main="Gas Milage for Car Models\ngrouped by cylinder",   xlab="Miles Per Gallon", gcolor="black", color=x$color

R语言入门之点图和条形图


这里需要解释一下,gcolor=只能是单一参数,因为它指定的是各组的标签颜色,比如这里cylinder分成了4,6,8三个组,这4,6,8就是各个组的标签,而color=参数则是指定各个组里元素的标签颜色,这一点大家需要好好区分。


第二部分:条形图

在R中我们可以使用barplot(height)函数来绘制条形图,这里height可以是一个向量或者矩阵。如果是一个向量的话,则它的值就决定了每一个条带的高度。如果height是一个矩阵并且beside=F,则每一个条带代表的是height的一列,将beside改为T是则绘制的是并列的条形图。

1.1 绘制简单条形图

# 绘制简单条形图counts <- table(mtcars$gear) # 将mtcars的挡数制成一个频数统计表counts # 查看counts的信息barplot(counts, main="Car Distribution",    xlab="Number of Gears"

R语言入门之点图和条形图

从这个这个简单的条形图中我们可以看到不同挡数汽车的数目,也即车型在挡数上的分布,3挡的汽车类型最多。


1.2 绘制简单水平条形图

# 绘制简单的水平条形图并添加标签counts <- table(mtcars$gear)barplot(counts, main="Car Distribution", horiz=TRUE,  names.arg=c("3 Gears""4 Gears""5 Gears"))

R语言入门之点图和条形图


这里使用horiz=TURE这个参数来设置条形图为水平状态,使用name.args=参数来给不同的组别添加标签。需要注意的是,c("3Gears", "4 Gears", "5 Gears")这个向量里的标签顺序要和counts里的列名相对应。


1.3 绘制堆积条形图

# 绘制带有颜色和标签的堆积条形图counts <- table(mtcars$vs, mtcars$gear# 这里返回的counts是一个矩阵,行代表的是vs,它代表汽车的发动机类型,0是V形,1是直形。barplot(counts, main="Car Distribution by Gears and VS", xlab="Number of Gears", col=c("darkblue","red"),  legend = rownames(counts)) 

这个图上横坐标指的是挡数,每一个条带均按照发动机类型切割成两部分。因此上述条形图生动展示出不同挡数的汽车数目,并揭示各个挡数内发动机类型的占比情况。


1.4 绘制水平堆积条形图

barplot(counts, main="Car Distribution by Gears and VS", xlab="Number of Gears", col=c("darkblue","red"),        legend = rownames(counts),beside=T) 

这里设置beside=T,则将前一张图中的每一条带拆成两部分水平放置,效果其实是相似的。



注意事项

1. 条形图的绘制不必非得是计数或者频数类数据。你可以使用均值、中位数和标准差等来绘制条形图,将aggregate()函数的结果传递到条形图barplot()里。

2. 在条带数目很多的情况下,条带的标签可能彼此之间有重叠而无法完整显示。如果想是标签排版简洁且不重叠,可以使用cex.name=这个选项来使各个字体大小递减。当然你也可以使用一些其他的绘图参数来更好进行文字排版,比如par()函数的相关参数。