用于绘制折线图的函数是geom_path和geom_line。二者的区别在于,geom_line会按照数据点在数据框中的位置来连线,即,先连接第一个和第二个点,再连线第二个和第三个点,因此,线条有可能折返。而geom_line则会先对数据点在X轴上的取值进行排序,并按顺序把点连接起来。例如,如果数据是按时间顺序收集的,并且也是按时间顺序从先到后放在数据框中的,那么我们用这两个函数中的哪一个都可以,但如果数据是按照被打乱的顺序放置的,我们就必须使用geom_line。
## 请通过以下这个例子观察geom_path和geom_line的区别
library(ggplot2)
ggplot()+geom_path(aes(x=c(3, 5, 1, 2, 4), y=c(10, 20, 30, 40, 50)))
ggplot()+geom_line(aes(x=c(3, 5, 1, 2, 4), y=c(10, 20, 30, 40, 50)))
下边来看geom_path/line有哪些一般参数。
●data、mappingp、na.rm、show.legend:请参阅geom_point的说明。
●linetype:线形,0=不绘制,1=实线(默认),2=短横,3=点状,4=点加短横, 5=长横,6=点加长横。另外,线形还可用单元长度表示,比如linetype="31",表示先画3个单位的线条,空1个单位;linetype="3141",表示先画3个单位的线条,空1个单位,再画4个单位的线条,再空1个单位。具体用法见例子。
●color:线条颜色。一般情况下,每根线条使用一种颜色;但当linetype=1时,如果线条包含n个点并且有n个颜色被给出,则线条会带有渐变效果。见下文示例。
●alpha:线条透明度。与color相仿,同一线条每一部分的透明度也可不同。
●size:宽度,即线条的粗细,默认值为0.5。
●lineend:线条两端的形状,可选择"butt"(默认)、"round"、"square",通常无需修改。
●linejoin:线条拐角处的形状,可选择"mitre" 、"round"(默认)、"bevel",通常无需修改。
●arrow:为线条加箭头。见下文示例。
●orientation:见第三章第一节关于coord_flip的内容。
在本例中,我们使用的数据为美国月度工业生产指数(Industrial Production Index,IP Index)。
dat=read.csv("ip small.csv", row.names=1) # 课件中的文件
# 注意:数据是按照时间顺序收集的,所以折线图的X轴应代表时间。但由于我们尚未学习当变量为时间对象时的坐标轴画法,所以暂且使用序号来代表时间顺序,也就是数据中的id一列
## 表面上看,我们直接使用ggplot(dat)+geom_line(aes(x=ID, y=Value))绘制折线图即可。但是这样画出来的折线图是没有意义的。这是因为,文件包含机械领域、计算机和电子产品领域两方面的数据,分别用Machinery和Computer这两个类别表示,因此我们必须为每一个类别绘制一条折线
# 我们先以Area为Computer的数据为例
comp=ggplot(dat[dat$Area=="Computer", ])+labs(title="Industrial Production Index")
comp+geom_line(aes(ID, Value), linetype=2, color="red", alpha=0.5, size=1.5) # 改变线形、颜色、透明度、粗细
comp+geom_line(aes(ID, Value), linetype="2141", size=1.5) # 用单位长度设定linetype(图2-2-1a)
comp+geom_line(aes(ID, Value), size=1.5, color=color Ramp Palette (c("red", "blue"))(24)) # 线条包含24个数据点,因此要给出24个颜色(最后一个颜色不会被使用),才能产生渐变(图2-2-1b)
图2-2-1 左=图a 用单位长度设定linetype,右=图b 渐变线条
## 箭头的画法:arrow参数应指向由arrow函数生成的对象。其中,angle是箭头线与线段的夹角;length是箭头线的长度(默认为0.25,必须用unit函数设置);ends用于设定在哪里画箭头,可选择"last"(默认)、"first"、"both";type用于设定形状,"closed"为实心,"open"为非实心
comp+geom_line(aes(ID, Value), arrow=arrow(angle=25, length= unit(0.20, "inches"), type="closed"))
那么,如何同时为两组数据作图呢?我们这时要用到group参数。
p=ggplot(dat)
## 用group参数指定分组。在本例中,Area列指明了Value列的数值是属于"Machinery"领域还是属于"Computer"领域,因此我们用group=Area就可为这两组数据分别画折线了
p+geom_line(aes(ID, Value, group=Area))
## 不过,这样画出来的两个线条在属性上没有区别,因此我们也许需要使用color、 linetype等aes参数
p+geom_line(aes(ID, Value, color=Area)) # 每组颜色不同
p+geom_line(aes(ID, Value, linetype=Area)) # 每组线形不同
# 注意:这里用于分组的变量必须要么是character变量,要么是factor变量。那么,如果使用连续变量来分组会有什么不同呢?本章第三节会给出说明
# 用color、linetype等指向分组变量时,图例会自动显示;如果你不想画图例,可加上show.legend=FALSE
#==========
# 练习
#==========
# 在需要同时画多组数据的情况下,以下几种方法的效果完全相同
# 方法一,用group
p+geom_line(aes(ID, Value, group=Area))
# 方法二,把数据拆成两组,再使用两个图层(本章在后边会对复合图表进行讲解)
dat1=dat[dat$Area=="Computer", ]
dat2=dat[dat$Area=="Machinery", ]
ggplot()+
geom_line(data=dat1, aes(ID, Value))+
geom_line(data=dat2, aes(ID, Value))
# 方法三,在画图的时候使用索引
ggplot()+
geom_line(data=dat[dat$Area=="Computer", ], aes(ID, Value))+
geom_line(data=dat[dat$Area=="Machinery", ], aes(ID, Value))