【R语言可视化】-- 柱状图要点一网打尽

大家好!欢迎关注可视化艺术!本公众号由生信师兄创办并持续更新!为了方便各位小伙伴更好的学习各种可视化技术!本公众号旨在从各种常用可视化软件出发,带大家更好的完成自己想要的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")

【R语言可视化】-- 柱状图要点一网打尽_第1张图片

【R语言可视化】-- 柱状图要点一网打尽_第2张图片

再详细解释一下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")

【R语言可视化】-- 柱状图要点一网打尽_第3张图片

通过分组设置颜色:
# 也可通过分组变量设置颜色:
ggplot(cabbage_exp,aes(Date, Weight, fill = Cultivar)) + 
  geom_bar(position = "dodge",stat = "identity")

【R语言可视化】-- 柱状图要点一网打尽_第4张图片

# 通过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

【R语言可视化】-- 柱状图要点一网打尽_第5张图片

拓展: position参数: 此处的 position主要是指对图像的微调,最常见的应用是在分组的柱形图(bar)中,因为分组的柱形图会产生组内堆积和不堆积两种主要效果。

  • position常用参数值:其中 stack和 dodge最为常用。
    • “identity”: 不调整,组内前后重叠;
    • “stack”: 堆积,默认position=“stack”;
    • “fill”:按比例堆积;
    • “dodge”: 分散
  • ColorBrewer 配色,使用的是 scale_colour_ brewer ( )、scale_fill_ brewer ( )。要想了解所有的调色板,可以使用RColorBrewer::display.brewer.all()查看。以下是调色板:

【R语言可视化】-- 柱状图要点一网打尽_第6张图片

修改颜色技巧补充
#######################
## 修改颜色的技巧:
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")

【R语言可视化】-- 柱状图要点一网打尽_第7张图片

#######################
## 正负两极不同的着色:
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)

【R语言可视化】-- 柱状图要点一网打尽_第8张图片

关于上面涉及到的两个填充颜色的函数说明:

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")

【R语言可视化】-- 柱状图要点一网打尽_第9张图片

# 只需要将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大就会有间隙?

【R语言可视化】-- 柱状图要点一网打尽_第10张图片

# 因为默认的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))

【R语言可视化】-- 柱状图要点一网打尽_第11张图片

堆积柱状图

#######################
## 堆积柱状图:
# 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")

【R语言可视化】-- 柱状图要点一网打尽_第12张图片

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")

【R语言可视化】-- 柱状图要点一网打尽_第13张图片

柱状图加标签:

#################
# 添加标签:
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")

【R语言可视化】-- 柱状图要点一网打尽_第14张图片

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))

【R语言可视化】-- 柱状图要点一网打尽_第15张图片

# 分组柱状图加标签:需要设定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)

【R语言可视化】-- 柱状图要点一网打尽_第16张图片

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")

【R语言可视化】-- 柱状图要点一网打尽_第17张图片

# 添加单位,并修改颜色模式
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")

【R语言可视化】-- 柱状图要点一网打尽_第18张图片

柱状图加误差棒

普通柱状图加误差棒
# 加误差棒:
# 加误差棒:
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)

【R语言可视化】-- 柱状图要点一网打尽_第19张图片

分组柱状图加误差棒
# 分组柱状图加误差棒:
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)

【R语言可视化】-- 柱状图要点一网打尽_第20张图片

最后再来一点小调整 + 主题美化!

# 查看字体:
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语言可视化】-- 柱状图要点一网打尽_第21张图片

就这样!一张完美的柱状图就有啦!学完这一小节!你对R语言绘制柱状图是不是了如指掌了呢!赶紧收藏起来,记得用到的时候拿出来看看哦!

如果你觉得本期教程对您有帮助的话,欢迎点赞、点在看您的支持是我继续坚持的最大动力!

代码和示例数据获取

你可能感兴趣的:(R语言可视化,r语言,开发语言)