可视化艺术

V1

2022/07/11阅读:15主题:全栈蓝

【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")
image-20220710162314508
image-20220710162314508
image-20220710162325281
image-20220710162325281

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

通过分组设置颜色:

# 也可通过分组变量设置颜色:
ggplot(cabbage_exp,aes(Date, Weight, fill = Cultivar)) + 
  geom_bar(position = "dodge",stat = "identity")
image-20220710162357566
image-20220710162357566
# 通过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
image-20220710162414713
image-20220710162414713

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

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

修改颜色技巧补充

#######################
## 修改颜色的技巧:
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")
image-20220710162446946
image-20220710162446946
#######################
## 正负两极不同的着色:
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)
image-20220710162451187
image-20220710162451187

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

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")
image-20220710162455944
image-20220710162455944
# 只需要将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大就会有间隙?
image-20220710162500869
image-20220710162500869
# 因为默认的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))
image-20220710162504893
image-20220710162504893

堆积柱状图

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

柱状图加标签:

#################
# 添加标签:
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")
image-20220710162519501
image-20220710162519501
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))
加标签02
加标签02
# 分组柱状图加标签:需要设定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)
image-20220710162524285
image-20220710162524285
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")

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

柱状图加误差棒

普通柱状图加误差棒

# 加误差棒:
# 加误差棒:
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)
image-20220710162541364
image-20220710162541364

分组柱状图加误差棒

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

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

# 查看字体:
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"))
image-20220710162550289
image-20220710162550289

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

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

分类:

后端

标签:

后端

作者介绍

可视化艺术
V1