author: 李丕栋
email: hope-dream@163.com
date: 2016年3月7日
http://blog.csdn.net/tanzuozhev/article/details/50822204
本文在 http://www.cookbook-r.com/Graphs/Bar_and_line_graphs_(ggplot2) 的基础上加入了自己的理解.
ggplot2 接受的数据类型必须为data.frame结构,
离散数据作为x轴
对于条形图, 对于高度的设置有两种不同的选择:
- x,y 对应的数值为实际的图上数值, x为横轴标签,y为纵轴高度.这时候使用
geom_bar(stat="identity")
作为图层.
library(ggplot2)
dat <- data.frame(
time = factor(c("Lunch","Dinner"), levels=c("Lunch","Dinner")),
total_bill = c(14.89, 17.23)
)
dat
## time total_bill
## 1 Lunch 14.89
## 2 Dinner 17.23
time
列为因子型变量, 表示x轴标签和填充颜色
total_bill
列为y轴的实际数值, 表示高度
ggplot(data=dat, aes(x=time, y=total_bill)) +
geom_bar(stat="identity")
ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +
geom_bar(stat="identity")
ggplot(data=dat, aes(x=time, y=total_bill)) +
geom_bar(aes(fill=time), stat="identity")
ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +
geom_bar(colour="black", stat="identity")
ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +
geom_bar(colour="black", stat="identity") +
guides(fill=FALSE)
ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +
geom_bar(colour="black", fill="#DD8888", width=.8, stat="identity") +
guides(fill=FALSE) +
xlab("Time of day") + ylab("Total bill") +
ggtitle("Average bill for 2 people")
- 输入一组数据,对于x轴与y轴的信息需要进行统计计数.x轴为数据去除重复项的保留值,y轴为x轴对应的重复次数.使用
geom_bar(stat="bin")
作为新图层.
library(reshape2)
head(tips)
## total_bill tip sex smoker day time size
## 1 16.99 1.01 Female No Sun Dinner 2
## 2 10.34 1.66 Male No Sun Dinner 3
## 3 21.01 3.50 Male No Sun Dinner 3
## 4 23.68 3.31 Male No Sun Dinner 2
## 5 24.59 3.61 Female No Sun Dinner 4
## 6 25.29 4.71 Male No Sun Dinner 4
这里输入的变量只有x,没有y,x轴为day,要使用 stat="bin"
代替 stat="identity"
,数据去重后留下Sun Sat Thur Fri,它们对应的重复次数作为y轴.
ggplot(data=tips, aes(x=day,fill=day)) +
geom_bar(stat="bin")
ggplot(data=tips, aes(x=day)) +
geom_bar()
折线图
time: x-axis
total_bill: y-axis
ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +
geom_line()
ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +
geom_line() +
geom_point()
ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +
geom_line(colour="red", linetype="dashed", size=1.5) +
geom_point(colour="red", size=4, shape=21, fill="white")
ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +
geom_line() +
geom_point() +
expand_limits(y=0) +
xlab("Time of day") + ylab("Total bill") +
ggtitle("Average bill for 2 people")
更多数据变量
新建数据,这里增加了一个变量sex
dat1 <- data.frame(
sex = factor(c("Female","Female","Male","Male")),
time = factor(c("Lunch","Dinner","Lunch","Dinner"), levels=c("Lunch","Dinner")),
total_bill = c(13.53, 16.81, 16.24, 17.42)
)
dat1
## sex time total_bill
## 1 Female Lunch 13.53
## 2 Female Dinner 16.81
## 3 Male Lunch 16.24
## 4 Male Dinner 17.42
条形图
变量映射
time: x-axis
sex: color fill
total_bill: y-axis.
ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +
geom_bar(stat="identity")
ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +
geom_bar(stat="identity", position=position_dodge())
ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +
geom_bar(stat="identity", position=position_dodge(), colour="black") +
scale_fill_manual(values=c("#999999", "#E69F00"))
修改变量的映射,x轴为sex,颜色填充为time
ggplot(data=dat1, aes(x=sex, y=total_bill, fill=time)) +
geom_bar(stat="identity", position=position_dodge(), colour="black")
折线图
变量映射
time: x-axis
sex: line color
total_bill: y-axis.
为了画出多条线,数据必须进行分组, 这里我们对sex
进行分组,就会出现两条线,Female
一条,Male
一条.
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex)) +
geom_line() +
geom_point()
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, colour=sex)) +
geom_line() +
geom_point()
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex)) +
geom_line() +
geom_point()
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex)) +
geom_line(size=1.5) +
geom_point(size=3, fill="white") +
scale_shape_manual(values=c(22,21))
修改变量的映射关系,按照time进行分组,Lunch一组,Dinner一组
ggplot(data=dat1, aes(x=sex, y=total_bill, group=time, shape=time, color=time)) +
geom_line() +
geom_point()
例子
条形图
ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +
geom_bar(colour="black", stat="identity",
position=position_dodge(),
size=.3) +
scale_fill_hue(name="Sex of payer") +
xlab("Time of day") + ylab("Total bill") +
ggtitle("Average bill for 2 people") +
theme_bw()
折线图
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex, colour=sex)) +
geom_line(aes(linetype=sex), size=1) +
geom_point(size=3, fill="white") +
expand_limits(y=0) +
scale_colour_hue(name="Sex of payer",
l=30) +
scale_shape_manual(name="Sex of payer",
values=c(22,21)) +
scale_linetype_discrete(name="Sex of payer") +
xlab("Time of day") + ylab("Total bill") +
ggtitle("Average bill for 2 people") +
theme_bw() +
theme(legend.position=c(.7, .4))
这幅折线图中, 使用了颜色scale_colour_hue
,形状 scale_shape_manual
,线型scale_linetype_discrete
三种属性,应该有3个图例,但是因为图例的名称相同所以归为一类,如果三个图例的名称不同,就会出现3个图例.
ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex, colour=sex)) +
geom_line(aes(linetype=sex), size=1) +
geom_point(size=3, fill="white") +
expand_limits(y=0) +
scale_colour_hue(name="Sex of payer1",
l=30) +
scale_shape_manual(name="Sex of payer2",
values=c(22,21)) +
scale_linetype_discrete(name="Sex of payer3") +
xlab("Time of day") + ylab("Total bill") +
ggtitle("Average bill for 2 people") +
theme_bw() +
theme(legend.position=c(.7, .4))
连续型数据做x轴
新建数据
datn <- read.table(header=TRUE, text='
supp dose length
OJ 0.5 13.23
OJ 1.0 22.70
OJ 2.0 26.06
VC 0.5 7.98
VC 1.0 16.77
VC 2.0 26.14
')
dose作为x轴, 这里dose为numeric,视为连续型变量
ggplot(data=datn, aes(x=dose, y=length, group=supp, colour=supp)) +
geom_line() +
geom_point()
当把dose作为连续型变量时,尽管dose只有 0.5, 1.0, 2.0 三类,x轴也必须显示0.5,1.0,1.5,2.0甚至更多的点.
离散型数据做x轴
这里我们将dose数据转化为factor类型,就成了离散型, 0.5, 1.0, 2.0就只是单纯的类别名称.
datn2 <- datn
datn2$dose <- factor(datn2$dose)
ggplot(data=datn2, aes(x=dose, y=length, group=supp, colour=supp)) +
geom_line() +
geom_point()
ggplot(data=datn, aes(x=factor(dose), y=length, group=supp, colour=supp)) +
geom_line() +
geom_point()
连续型数据和离散型用于条形图, 得到了相同的图.
ggplot(data=datn2, aes(x=dose, y=length, fill=supp)) +
geom_bar(stat="identity", position=position_dodge())
ggplot(data=datn, aes(x=factor(dose), y=length, fill=supp)) +
geom_bar(stat="identity", position=position_dodge())