前面讲到了,ggplot2的基本画图,并初步了解了画图的风格,但是画出来的图并不是很美观,我们需要怎么样才能修改我们画的图了?画出一福美观发图画来,在画图之前我们先了解一下,有哪些参数,大概看一下,可能记不住,但是,熟能生巧,多敲几次就可以了,首先我们看看geom_xx后面可以跟哪些类型的图形:
![]()
另外我们可以在图层上对数据进行哪些变换了?也就是stat=可以接哪些:
知道这两个也没有用啊,我们知道加一个geom_xx就加个图层,那要是我只是做一些其他修改,不需要再绘制一些图形上去怎么办? 现在来说说,分别有哪些图层类型前面讲到的mapping是一个就是绘制最基本的坐标轴和数据,geom_xx是一个,scale是一个,theme是一个,xlab是一个,ggtitle是一个,training是一个.现在虽然不知道他们的用处,不要紧.一点点的学.我们在实战中慢慢学会,今天先从条形图的深加工开始. 首先: library(ggplot2) library(gcookbook) #用于获取数据集
1.基础的条形图
ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity")
ggplot(BOD, aes(x = Time, y = demand)) + geom_bar(stat = "identity")
看看有什么区别,在第二个图形中,数据中time没有6这个值,但是图形X轴还是画出来了,这就是对于分类变量和连续变量的不同.
如果把时间转为离散的分类型,再看看:,并没有画出6来
ggplot(BOD, aes(x = factor(Time), y = demand)) + geom_bar(stat = "identity")
看看如何给条形图上色:运用fill=" ",我们发现,fill是填充色,colour是边框色,(这里colour是英式英语颜色的写法,等价于美式英语color)
ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity", fill = "lightblue",
colour = "black")
2.涉及分组变量的条形图
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat="identity",position = "dodge")
我们发现fill后面跟着的是一个变量,且是一个分类变量,得到的结果是颜色会根据分类不同使用不同颜色.
position = "dodge"将同类条形图并排放着,(dodge英文意思是闪躲回避的意思,这样记它的作用会比较快)
我们想改一下颜色怎么办?fill后面已经跟了分类变量,那我们只需要再添加一个图层就可以啦,这时可用
scale_fill_brewer(palette = "Pastel1") 方便记忆palette的英文意思是调色板,面板的意思.这里便是用的叫Pastel1的色板,.Pastel的英文意思是彩色粉笔,有没有发现颜色没有那么浓郁啦.是有点粉笔的感觉哈.还可以自己设定颜色,scale_fill_manual(values = c("#669933", "#FFCC66"))这里manual英文意思是"手工的",
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(position = "dodge",stat="identity") + scale_fill_brewer(palette = "Pastel1")
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(position = "dodge",stat="identity") + scale_fill_manual(values = c("#669933", "#FFCC66")) #这个颜色你喜欢吗?
另外我们发现,上面图形都是两两一组,那如果有一组就一个值怎么办,那么图形会确失一条bar,然后加宽,具体看图
ce <- cabbage_exp[1:5, ]
ggplot(ce, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(position = "dodge",stat="identity", colour = "black") + scale_fill_brewer(palette = "Pastel1")
3.计数数据条形图
前面我们都是stat="identity"即每一个bar的高度根据另一个数值变量来决定,那如果,面对像下面的数据,caret变量是分类因子型,这列变量中同一水平的因子有好几个,那么我们画条形图时,一般采用频数型,这时用水平出现的频数当做bar的高度.stat="bin"当然也可以不写,因为geom_bar默认是bin
ggplot(diamonds, aes(x = carat)) + geom_bar()
## 可以用 "binwidth = x" to 调整bar的宽度
5.对正负数用不同的颜色作图
csub <- subset(climate, Source == "Berkeley" & Year >= 1900) #选取Source == "Berkeley" & Year >= 1900的数据
csub$pos <- csub$Anomaly10y >= 0 #创建csub$pos 变量为csub$Anomaly10y >= 0 的数据
ggplot(csub, aes(x = Year, y = Anomaly10y, fill = pos)) + geom_bar(stat = "identity",
position = "identity") #正负用不同颜色表示,还挺漂亮的呵,可是有点感觉不对啊,你有没有发现?
在我们日常生活中,红色一般象征正,暖色调嘛,蓝色一般表示负,冷色调呀,有没有?你家电线红色是不是火线,红色是不是正极,虽然上图没有错,但是我们想换一下,正的为红色,负的为蓝色咋办?而且我不想要旁边的图例了,怎么办?
用 scale_fill_manual() 和 guide=FALSE
ggplot(csub, aes(x = Year, y = Anomaly10y, fill = pos)) + geom_bar(stat = "identity",
position = "identity", colour = "black", size = 0.25) + scale_fill_manual(values = c("#CCEEFF",
"#FFDDDD"), guide = FALSE)
6.调整条形宽度和空间
这应该前面讲过,width = xx来控制
ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity")
ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity", width = 0.5)
ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity", width = 1)
那如果是一组一组的条形图我想让他们中间有点缝隙怎么办?用position = position_dodge(0.7)来控制
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat = "identity",
width = 0.5, position = "dodge")
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat = "identity", width = 0.5, position = position_dodge(0.7))
7.条形图的摆放,堆叠条形图
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat = "identity")
有没有发现,右边图例红色在上,而图形红色在下?修改一下
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat = "identity") +
guides(fill = guide_legend(reverse = TRUE))
8.添加标签
给每一个bar添加一个标签,表示其具体数值是多少.这里标签使用的是weight变量的数值,因为纵坐标本来就是weight
vjust表示距离bar的顶端有多少,你也可以设置成负数让标签在bar上面
ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight)) + geom_bar(stat = "identity") + geom_text(aes(label = Weight), vjust = 1.5, colour = "white")
ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight)) + geom_bar(stat = "identity") + geom_text(aes(label = Weight), vjust = -0.2,color="red")
堆栈的条形图加标签:需要另一个包plyr
library(plyr)
ce <- arrange(cabbage_exp, Date, Cultivar) #根据Date,Cultivar 排序
ce <- ddply(ce, "Date", transform, label_y = cumsum(Weight)) #增加新变量label_y
ggplot(ce, aes(x = Date, y = Weight, fill = Cultivar)) + geom_bar(stat = "identity") + geom_text(aes(y = label_y, label = Weight), vjust = 1.5, colour = "white")
这就是部分条形图的深加工,我们虽然展示了很多功能,但在实际中我们还需要将这些功能组合起来,画出非常美观的图型.总结一下,若需要修改图层的样子,其参数应当在该图层的括号里面,所以参数在哪个图层里面,就是修改哪个图层.
未完待续,
PPV原创文章,严禁转载. (文:@白加黑治感冒)