大家好!欢迎关注可视化艺术!本公众号由生信师兄创办并持续更新!为了方便各位小伙伴更好的学习各种可视化技术!本公众号旨在从各种常用可视化软件出发,带大家更好的完成自己想要的Figure制作!
创作不易!您的点赞和在看是对师兄最大的支持和鼓励!
先对这一系列做个简单说明:本系列旨在通过R语言编程,实现数据的各种可视化!其中主要用到的R包为ggplot2,不会再讲解R语言自带的基础函数,如plot、barplot等!因为师兄凭借多年的实战经验,可以很明确的告诉大家,R语言可视化用的最多的R包就是ggplot2,只要你掌握了ggplot2,作图的效果完全可以吊打那些R自带的函数,所以没必要再把所有函数再学一遍!
当然了!如果有小伙伴想要了解更全面的内容:欢迎关注**【生信师兄】-- R语言绘图系列**。
代码和示例数据获取
柱状图可能是最常用的一种数据可视化。它们通常用于显示数值(在y轴上),用于显示不同类别的数值(在x轴上)。例如,柱状图可以用来显示四种不同商品的价格。柱状图通常不适合显示一段时间内的价格,因为时间是一个连续的变量。
ggplot基础语法解析:
ggplot(data, aes(X,Y)) + geom_bar()
data
:数据,注意data必须为数据框格式;
X
:X轴对应的变量名;
Y
:Y轴对应的变量名;
geom_bar
:绘图函数,类似的还有geom_point、geom_bin、geom_boxplot、geom_density
等等
# stat="bin"(默认):柱高为各个分类数目;
ggplot(mtcars,aes(factor(cyl))) + geom_bar()
# stat="identity"柱高分类所占比例。
ggplot(BOD,aes(factor(Time),demand)) + geom_bar(stat = "identity")
再详细解释一下stat参数:stat表示X和Y的对应状态;
- bin:用于X为一个分类变量,Y对应的是X每一类的个数;故只需要指定X即可;例如上图1,只指定了X,Y根据X的类别个数自动识别;
- identity:这个就很好理解了,就是X和Y一一对应,需要指定X和Y;如上图2;
fill
指定填充颜色,color
指定描边颜色:library(gcookbook)
# 修改柱状图的填充(fill)和描边(color):
ggplot(pg_mean,aes(group, weight)) +
geom_bar(stat = "identity",fill = "lightblue", color = "black")
# 也可通过分组变量设置颜色:
ggplot(cabbage_exp,aes(Date, Weight, fill = Cultivar)) +
geom_bar(position = "dodge",stat = "identity")
# 通过scale_fill_brewer()修改颜色模式:
ggplot(cabbage_exp,aes(Date, Weight, fill = Cultivar)) +
geom_bar(position = "dodge",stat = "identity",color = "black") +
scale_fill_brewer(palette = "Pastel1") # 指定颜色模式为Pastel1
拓展: position参数: 此处的 position主要是指对图像的微调,最常见的应用是在分组的柱形图(bar)中,因为分组的柱形图会产生组内堆积和不堆积两种主要效果。
- position常用参数值:其中 stack和 dodge最为常用。
- “identity”: 不调整,组内前后重叠;
- “stack”: 堆积,默认position=“stack”;
- “fill”:按比例堆积;
- “dodge”: 分散
- ColorBrewer 配色,使用的是 scale_colour_ brewer ( )、scale_fill_ brewer ( )。要想了解所有的调色板,可以使用RColorBrewer::display.brewer.all()查看。以下是调色板:
#######################
## 修改颜色的技巧:
library(gcookbook)
upc <-subset(uspopchange, rank(Change)>40)
upc
ggplot(upc, aes(x=Abb, y=Change, fill=Region)) + geom_bar(stat="identity")
# 此示例还使用reorder()函数,将条形按其高度进行排序;
ggplot(upc, aes(x=reorder(Abb, Change), y=Change, fill = Region)) +
geom_bar(stat="identity", color="black") +
scale_fill_manual(values=c("#669933", "#FFCC66")) +
xlab("State")
#######################
## 正负两极不同的着色:
csub <- subset(climate, Source == "Berkeley" & Year >= 1900)
# 思路:颜色根据正负数来填充?怎么识别正负数呢?
# 只能新建一个字段:该字段描述了正和负;
# 指定fill为该字段;
csub$pos <- csub$Anomaly10y >= 0
csub
# 使用scale_fill_manual()修改颜色;guide = False参数去掉图例
ggplot(csub, aes(x=Year, y=Anomaly10y, fill=pos)) +
geom_bar(stat="identity", position="identity",color="black", size=0.25)+
scale_fill_manual(values=c("#CCEEFF", "#FFDDDD"), guide=FALSE)
关于上面涉及到的两个填充颜色的函数说明:
scale_fill_brewer(palette = “Pastel1”):表示颜色模式是在几种模板里面选一个(具体见上述ColorBrewer配图);
scale_fill_manul(values=c(“#CCEEFF”, “#FFDDDD”)):表示指定特定的颜色,有几个分类就要指定几个颜色;
#######################
## 调节条形的宽度和间距(width参数):
Library(cookbook)
# width默认是0.9;
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)
# width最大值只能设置为1;
ggplot(pg_mean, aes(x=group, y=weight)) +
geom_bar(stat="identity", width=1)
## 调节分组条形图之间的间距:
# 默认的同一分组之间的条形是没有间距的:
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat ="identity", width=0.5, position= "dodge")
# 只需要将position_dodge参数设置的比width参数大一些就好了!
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +
geom_bar(stat="identity", width=0.5, position = position_dodge(0.7))
# 思考:position_dodge有什么含义?为什么比width大就会有间隙?
# 因为默认的position_dodge()里的内容一定是和width相等的,
# 当position_dodge为0的时候,两个柱子会重合;
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +
geom_bar(stat="identity", width=0.5, position = position_dodge(0.3))
#######################
## 堆积柱状图:
# position的默认值为stack;
# 即如果不设置position,并且设置了分组变量,就是画堆积图;
Library(cookbook)# For the data set
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +
geom_bar(stat="identity")
# 修改图例堆积的顺序:guides()
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +
geom_bar(stat="identity") +
guides(fill = guide_legend(reverse = TRUE))
# 修改图形堆积的顺序:order = desc(); desc()可以简单地理解为取相反数;
cabbage_exp$Cultivar <- factor(cabbage_exp$Cultivar,levels = c("c39","c52"))
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", color = "black") +
guides(fill = guide_legend(reverse = TRUE)) +
scale_fill_brewer(palette = "Pastel1")
#################
# 添加标签:
library(ggplot2)
library(gcookbook)
cabbage_exp <- cabbage_exp
# 标签位置的设定:vjust参数;
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)
# 为了防止标签跑出图形,可以调整y轴的范围:
# 方法一:ylim()函数:
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) +
geom_bar(stat="identity") +
geom_text(aes(label=Weight), vjust=-0.2) +
ylim(0, max(cabbage_exp$Weight)* 1.05)
# 方法二:以weight为基准,调节y值,图形高度会自动适配:
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight))+
geom_bar(stat="identity")+
geom_text(aes(y = Weight + 0.1, label = Weight))
# 分组柱状图加标签:需要设定position_dodge(),以调整字体的合适位置;
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label=Weight), vjust=1.5, color="white",
position=position_dodge(.9), size=3)
library(plyr)
# 堆积柱状图添加lable
ce <- arrange(cabbage_exp, Date, Cultivar)
ce<-ddply(ce, "Date", transform, label_y=cumsum(Weight))
ce$Cultivar <- factor(ce$Cultivar,levels = c("c52","c39"))
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")
# 修改lable至中央:
ce <- arrange(cabbage_exp, Date, Cultivar)
ce<-ddply(ce, "Date", transform, label_y=cumsum(Weight)-0.5*Weight)
ce$Cultivar <- factor(ce$Cultivar,levels = c("c52","c39"))
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")
# 添加单位,并修改颜色模式
ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat="identity", colour="black")+
geom_text(aes(y=label_y, label=paste(format(Weight, nsmall=2), "kg")),size=4)+
scale_fill_brewer(palette="Pastel1")
# 加误差棒:
# 加误差棒:
library(tidyverse)
ce_mod <- cabbage_exp %>%
filter(Cultivar == "c39")
head(ce_mod)
# Cultivar Date Weight sd n se
# 1 c39 d16 3.18 0.9566144 10 0.30250803
# 2 c39 d20 2.80 0.2788867 10 0.08819171
# 3 c39 d21 2.74 0.9834181 10 0.31098410
ggplot(ce_mod, aes(x = Date, y = Weight)) +
geom_bar(fill="lightblue", stat="identity",
colour = "black") +
geom_errorbar(aes(ymin = Weight - se, ymax = Weight + se),
width = 0.2)
# 分组柱状图加误差棒:
ggplot(cabbage_exp, aes(x = Date, y = Weight,fill=Cultivar)) +
geom_bar(stat="identity",position = "dodge") +
geom_errorbar(aes(ymin = Weight - se, ymax = Weight + se),
position = position_dodge(0.9), width = 0.2)
# 查看字体:
windowsFonts()
ggplot(cabbage_exp, aes(x = Date, y = Weight,fill=Cultivar)) +
# 绘制柱状图主体:
geom_bar(stat="identity",
width=0.75, # 调整柱形宽度;
position = "dodge") +
# 添加误差棒:
geom_errorbar(aes(ymin = Weight - se, ymax = Weight + se),
position = position_dodge(0.9),
# 误差棒的宽度和粗细:
width = 0.12, size=0.6)+
# 修改主题:
theme_bw()+
# 去掉背景中的网格线:
theme(panel.grid = element_blank(),
# 修改图例位置:
legend.position = "top",
# 调整字体:
text=element_text(size=14, family="serif"))+
# 调整柱状图颜色:
scale_fill_manual(values = c("#55c2c7","#b4ea85"))
就这样!一张完美的柱状图就有啦!学完这一小节!你对R语言绘制柱状图是不是了如指掌了呢!赶紧收藏起来,记得用到的时候拿出来看看哦!
如果你觉得本期教程对您有帮助的话,欢迎点赞、点在看您的支持是我继续坚持的最大动力!
代码和示例数据获取