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)
这里需要解释一下,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")
从这个这个简单的条形图中我们可以看到不同挡数汽车的数目,也即车型在挡数上的分布,3挡的汽车类型最多。
1.2 绘制简单水平条形图
# 绘制简单的水平条形图并添加标签
counts <- table(mtcars$gear)
barplot(counts, main="Car Distribution", horiz=TRUE,
names.arg=c("3 Gears", "4 Gears", "5 Gears"))
这里使用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()函数的相关参数。