ggplot2包可视化——绘制条形图

参考文献:
张杰.R 语言数据可视化之美:专业图表绘制指南:增强版 —北京:电子工业出版社,2019
Winston chang.R数据可视化手册—北京:人民邮电出版社,2014

在R语言中,ggplot2包的绘图以精美、简明等特点出名,因此本系列主要介绍基于此包以及使用一些其他包中的数据集作为例子进行的绘图,本章主要介绍条形图的绘制,在绘制时,需要了解:

接下来便分为不同的条形图,介绍其绘制方法:

一 简单条形图

利用gcookbook中的一个简单数据集,实现简单条形图的展示,利用ggplot()函数,使用geom_bar(stat="identity")绘制条形图,并调整图形的颜色,实现结果如下:

library(ggplot2)
library(gcookbook)
#展示pg_mean 数据框
  group weight
1  ctrl  5.032
2  trt1  4.661
3  trt2  5.526

ggplot(pg_mean,aes(x=group,y=weight))+geom_bar(stat="identity",
                                                fill="lightblue",colour="black")
#fill改变图形填充色,colour添加边框色

二 簇状条形图

当绘制基于某个分类变量的条形图时,就呈现出簇状条形图,此时可将分类变量映射到fill参数并运行命令geom_bar(position="dodge"),这可使得两组条形在水平方向上错开排列,不然就输出了堆积条形图。下面的例子使用了cultivatar这个变量作为分组的依据,并选择其余变量作为x与y轴,最后图形结果如下所示:

#展示cabbage_exp数据框
  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
4      c52  d16   2.26 0.4452215 10 0.14079141
5      c52  d20   3.11 0.7908505 10 0.25008887
6      c52  d21   1.47 0.2110819 10 0.06674995

ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
      geom_bar(position = "dodge",stat="identity",colour="black")+
      scale_fill_brewer(palette="Pastell")

注意:scale_fill_brewer()可对图形颜色进行设置,这里使用的Pastell调色盘对图形进行调色。

三 频数条形图

当面对每行观测对应一个样本的数据集时,可利用频数绘制条形图。此时不选择映射y参数,且参数默认被设定为stat=“bin”

 head(diamonds) #展示例子的前六行数据
carat   cut    color clarity   depth  table  price  x     y     z
  <dbl> <ord>    <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 
ggplot(diamonds,aes(x=cut))+geom_bar(fill="lightblue")

四 堆积条形图

在堆积条形中,要选择一个合适的填充色参数,就可输出图形。见如下代码所给出:

ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
  geom_bar(stat="identity")+guides(fill=guide_legend(reverse = TRUE))+
  scale_fill_manual(values = c("#87CEFA","#8DB6CD"))

若想调整条形的堆叠顺序,可通过指定图形映射中的参数order=desc()来实现,如下所示:

ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar,order=desc(Cultivar)))
 +geom_bar(stat="identity")

若要绘制百分比堆积条形时,可使用plyr包中的ddply()函数和transform()函数将每组条形按照对应数据标准化为100%格式后绘制就可。

#以Date为切割变量,对每组数据进行transform()
ce<-ddply(cabbage_exp,"Date",transform,percent_weight=Weight/sum(Weight)*100)
#展示ce数据集(上面例子已展示过cabbage_exp)
 Cultivar Date Weight        sd  n         se percent_weight
1      c39  d16   3.18 0.9566144 10 0.30250803       58.45588
2      c52  d16   2.26 0.4452215 10 0.14079141       41.54412
3      c39  d20   2.80 0.2788867 10 0.08819171       47.37733
4      c52  d20   3.11 0.7908505 10 0.25008887       52.62267
5      c39  d21   2.74 0.9834181 10 0.31098410       65.08314
6      c52  d21   1.47 0.2110819 10 0.06674995       34.91686

ggplot(ce,aes(x=Date,y=percent_weight,fill=Cultivar))+
       geom_bar(stat="identity")

五 图形调整

1.着色

对图形进行适合的颜色选择,是数据可视化的加分项,可借助函数scale_fill_brewer()或是scale_fill_manual()重新设定图形颜色,(对于颜色的重新设定,需要在aes外部进行,只有颜色的映射设定才是在内部完成)

#upc数据框展示  
State Abb Region Change
3         Arizona  AZ   West   24.6
6        Colorado  CO   West   16.9
10        Florida  FL  South   17.6
11        Georgia  GA  South   18.3
13          Idaho  ID   West   21.1
29         Nevada  NV   West   35.1
34 North Carolina  NC  South   18.5
41 South Carolina  SC  South   15.3
44          Texas  TX  South   20.6
45           Utah  UT   West   23.8

ggplot(upc,aes(x=reorder(Abb,Change),y=Change,fill=Region))+    
        geom_bar(stat="identity",colour="black")+
        scale_fill_manual(values = c("#87CEFA","#8DB6CD"))+
         xlab("State")

代码中的reorder()函数表示x轴的Abb是按照纵轴数值从小到大排列的,xlab可以修改x轴的名称

关于正负条形图,进行着色时,

library(gcookbook)
csub<-subset(climate,Source=="Berkeley"&Year>=1900)
csub$pos<-csub$Anomaly10y>=0 #区分出正负,正为TRUE,负为FALSE
#展示csub数据框
   Source Year Anomaly1y Anomaly5y Anomaly10y Unc10y
101 Berkeley 1900        NA        NA     -0.171  0.108
102 Berkeley 1901        NA        NA     -0.162  0.109
103 Berkeley 1902        NA        NA     -0.177  0.108
104 Berkeley 1903        NA        NA     -0.199  0.104
105 Berkeley 1904        NA        NA     -0.223  0.105
106 Berkeley 1905        NA        NA     -0.241  0.107

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)

size=0.25目的是控制边框线宽度的参数,guide=FALSE的目的在于消除图例。

2.调整条形参数(条形宽度、间距)

通过设定geom_bar() 函数的参数width可以使条形变得更宽或者更窄。该参数的默认值为0.9;例如要设置一个宽度为0.5的条形时,可以使用以下指令

ggplot(pg_mean,aes(x=group,y=weight))+geom_bar(stat = "identity",width = 0.5)

若是准备更改簇状图的条形间距时,同样在geom_bar() 函数中修改,代码如下

ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
       geom_bar(stat="identity",position = position_dodge(1.2))

3.添加数据标签

绘图命令中加入geom_text()可为条形图加入数据标签,运行时指定一个变量映射给x和y和标签本身,通过设定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")

但在此案例中不难看出,若是将数据标签放到条形的上方,有可能会超出范围,因此在上例中,使用如下代码可帮助扩大y的范围,使用时加入到绘图之后

ylim(,max(cabbage_exp$Weight)*1.05)   #找到最大的y值,再乘以1.05扩大y轴的范围

另外,对于堆积条形的添加标签,需要先对每组条形对应的数据进行累计求和,还是以上例cabbage——exp作为例子

ce<-arrange(cabbage_exp,Date,Cultivar)   #按Date和Cultivar对数据排列
ce<-ddply(ce,"Date",transform,label_y=cumsum(Weight))  #以Date为分组标准,进行累计求和
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")

六 其他条形相关图

1.Cleveland图

使用gcookbook中的一个数据集作为例子,并改进图像

library(gcookbook)
tophit<-tophitters2001[1:25,]   #选取数据集中前25行数据作为例子
tophit[,c("name","lg","avg")]   #绘图用的三个变量
#               name lg    avg
1       Larry Walker NL 0.3501
2      Ichiro Suzuki AL 0.3497
3       Jason Giambi AL 0.3423
4     Roberto Alomar AL 0.3357
5        Todd Helton NL 0.3356
6        Moises Alou NL 0.

ggplot(tophit,aes(x=avg,y=name))+geom_point()

初始图像如上,由于排序等原因,感觉此图略微杂乱,且网格线的存在也使图像并不那么简明,因此下面将对图像进行一定的调整。

首先就是将avg这个表示数值的变量按照从小到大的顺序排序,且name同样要对应,可使用reorder(name,avg),将name转为因子,再根据对应的avg值进行排序,再修改网格线,删除垂直线,水平的则变为虚线。

ggplot(tophit,aes(x=reorder(name,avg),y=avg))+geom_point(size=3)+
      theme_bw()+theme(axis.text.x = element_text(angle = 60,hjust = 1),
             panel.grid.major.y = element_blank(),
             panel.grid.minor.y = element_blank(),
             panel.grid.major.x = element_line(colour = "grey60",linetype = "dashed"))

解释:图中换了一下x和y的位置,geom_point(size=3)是放大点的大小,axis.text.x = element_text(angle = 60,hjust = 1)是将x轴的数据标签旋转60度,theme中的参数表示y的水平线取消不画,而 panel.grid.major.x = element_line(colour = "grey60",linetype = "dashed")就代表x的竖直线是用颜色为grey60,线形为虚线(dashed)所画,最后输出结果如下

2.火柴杆图

可以使用lg变量对样本进行分组,这个变量的两个取值分别代表国家队(NL)和美国队(AL),我们依次根据lg和avg对变量进行排序

ggplot(tophit,aes(x=avg,y=name))+geom_segment(aes(yend=name),xend=0,colour="grey50")+
  scale_colour_manual(values = c("#87CEFA","#8DB6CD"),limits=c("NL","AL"))+  #修改颜色
      geom_point(size=3,aes(colour=lg))+theme_bw()+
       theme(panel.grid.major.y = element_blank(),   #删除水平网格线
                   legend.position=c(1, 0.55),       #将图例放置在绘图区域
                   legend.justification=c(1, 0.5))

在绘制点图时,把lg变量映射到点的颜色属性上,并修改合适的颜色,判断不同的类型,其中,可借助geom_segment() 函数用“以数据点为端点的线段”代替贯通全图的网格线,作出火柴杆图。注意geom_segment()函数需要设定x、y、xend和yend四个参数:

或是采用另一种方式,使不同的类别放在同一块区域中,便于观察

ggplot(tophit,aes(x=avg,y=name))+geom_segment(aes(yend=name),xend=0,colour="grey50")+
  scale_colour_manual(values = c("#87CEFA","#8DB6CD"),limits=c("NL","AL"),guide=FALSE)+
  geom_point(size=3,aes(colour=lg))+theme_bw()+
  theme(panel.grid.major.y = element_blank())+
  facet_grid(lg ~ ., scales="free_y", space="free_y")

3.南丁格尔玫瑰图

南丁格尔玫瑰图即极坐标柱形图,是一种圆形的柱形图,是在极坐标下绘制的柱形图,使用圆弧的

半径长短表示数据的大小(数量的多少)。每个数据类别或间隔在径向图上划分为相等分段,每个分

段从中心延伸多远(与其所代表的数值成正比)取决于极坐标轴线。因此,从极坐标中心延伸出来

的每一环可以当作标尺使用,用来表示分段大小并代表较高的数值,它的主要缺点在于面积较大的外围部分会更加引人注目,这跟数值的增量成反比。

以下分别以单数据和多数据为例,画出不同的图像

library(ggplot2)
mydata <- data.frame( a=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"),
                      b=c(50, 60, 70, 20,90,110,30))
ggplot(mydata, aes(x=a, y=b, fill=factor(b))) +
  geom_bar(width = 1,stat="identity",colour = "black",fill="#F8766D") +
  geom_text(aes(y = b-8,label = b),color="white") +  #添加合适位置的数据标签
  coord_polar(theta = "x",start=0) +    #转化极坐标图
  ylim(c(0,120))+     #限制y的范围
  theme_light()       #让背景变亮
library(ggplot2)
library(dplyr)
diamonds<-cbind(diamonds,Cou=rep(1,nrow(diamonds))) #在diamonds之后加入一列cou,便于查看不同类别的数目
sum_clarity<-aggregate(Cou~clarity,diamonds,sum)  #以clarity为分类依据,查看不同类别中cou的总和
# clarity   Cou
1      I1   741
2     SI2  9194
3     SI1 13065
4     VS2 12258
5     VS1  8171
6    VVS2  5066
7    VVS1  3655
8      IF  1790

sort_clarity<-arrange(sum_clarity,desc(Cou)) #对数据框 sum_clarity 根据 Cou 降序处理
diamonds$clarity<- factor(diamonds$clarity, levels = sort_clarity$clarity) 
ggplot(diamonds,aes(x=clarity,fill=color))+
  geom_bar(width=1.0,colour="black",size=0.25)+
  coord_polar(theta = "x",start=0)+  #把直角坐标系转换成极坐标系
  scale_fill_brewer(palette="Reds")+  #选择的离散型颜色主题方案为"Reds"
  guides(fill=guide_legend(reverse=TRUE,title="Color"))+
  ylim(c(-2000,12000))+theme_light()

4.径向柱形图

径向柱形图也被称为圆形柱形图或星图。这种图表使用同心圆网格来绘制条形图,下面便随机生成一个数据框,用它来画出此图,此图为多数据的图,因为数据框的前两个变量都为分类型变量,包含了10种不同项目(A-J)以及对应的得分分类(A-E),以value作为纵轴的数据表示,因此可选择一个作为填充的变量(这里为score),画出如下图形。

library(RColorBrewer)
df <- data.frame(item=rep(LETTERS[1:10], 5),   #letters表示字母表
                 score=rep(letters[1:5], each=10), 
                 value=rep((1:5), each=10) + rnorm(50, 0, .5))
ggplot(data=df,aes(item,value,fill=score))+
  geom_bar(stat="identity", color="black", position=position_dodge(),width=0.7,size=0.25)+
  coord_polar(theta = "x",start=0) + #把直角坐标系转换成极坐标系
  ylim(c(-3,6))+ #Y轴数值范围设定为(-3, 6)
  scale_fill_brewer(palette="YlGnBu")+ #选择的离散型颜色主题方案为" YlGnBu"
  theme_light()

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值