1. 程式人生 > >R語言ggplot2條形圖詳解

R語言ggplot2條形圖詳解

本文內容來自個人做案例過程中遇到的一些問題,一是用普通的barplot(),所畫條形圖的條數太多,導致x軸的標籤不能完全顯示;二是用EXCEL可以解決一,但是畫的條形圖又不是太美觀。因此,本文順著這個方向,得到了一些啟示,並對此作出總結。

  • 總體引數
  • 背景色設定
  • x軸標籤字型旋轉一定的角度
  • 設定座標軸取值範圍
  • 新增資料
  • 圖例設定
  • 儲存圖
  • 儲存中中文亂碼解決

總體引數

可參見官網

geom_bar(mapping = NULL, data = NULL, stat = "count",
  position = "stack", ..., width = NULL, binwidth = NULL
, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

以下介紹引數含義及具體設定。

背景色設定

用ggplot畫圖時,預設的是帶背景色,有時在做報告之類時,想要去掉背景色,可以通過panel.background=element_rect()設定為透明色即可。

p <- read.csv("diqu.csv")
library(ggplot2)
pl <- ggplot(data=p, aes(x=diqu, y=Freq,fill=diqu), fill=diqu) +
      geom_bar(stat="identity"
) pl

#背景色設為透明,邊框為灰色
pl + theme(panel.background=element_rect(fill='transparent',color ="gray")) 

雖然x軸標全部顯示,但文在都連在了一起,下面將x軸標籤字型旋轉一定的角度。

x軸標籤字型旋轉一定的角度

#設定x軸座標標籤的文字方向,大小,顏色
pl + theme(panel.background=element_rect(fill='transparent',
                                         color ="gray"), 
           axis.text
.x = element_text(angle = 70, hjust = 0.5, vjust = 0.5,color = "black",size=9))

看到上圖武漢市明顯比其他地區高出很多,下面對此進行設定。

設定座標軸取值範圍

#設定y軸取值範圍
pl + theme(panel.background=element_rect(fill='transparent',
                                         color ="gray"), 
           axis.text.x = element_text(angle = 70, hjust = 0.5, 
                         vjust = 0.5,color = "black",size=9))+
     ylim(0,250)#設定y軸取值範圍

到此,其實就差不多了,但是上圖最上方邊框是有網格線,下面進行刪除並在圖中新增資料。

新增資料

#新增資料,並規定資料的大小和位置
pl + theme(panel.background=element_rect(fill='transparent',
                                         color ="gray"), 
           axis.text.x = element_text(angle = 70, hjust = 0.5, 
                             vjust = 0.5,color = "black",size=9)) +
     ylim(0,250) + #設定y軸取值範圍
  theme(panel.grid =element_blank()) + # 刪去網格線
  geom_text(mapping = aes(label = p$Freq),size=3,vjust=1.4)#新增資料,並規定資料的大小和位置,vjust值越大資料越往下,越小越往上

圖例設定

通過guides(fill=FALSE)來移除圖例

#去掉圖例
pl + theme(panel.background=element_rect(fill='transparent',
                                         color ="gray"), 
           axis.text.x = element_text(angle = 70, hjust = 0.5, 
                             vjust = 0.5,color = "black",size=9)) +
     ylim(0,250) + #設定y軸取值範圍
  theme(panel.grid =element_blank()) + # 刪去網格線
  geom_text(mapping = aes(label = p$Freq),size=3,vjust=1.4) + #新增資料,並規定資料的大小和位置
  guides(fill=FALSE)

儲存圖

#可以利用RStudio直接儲存
#可藉助Cairo包進行儲存為png、pdf等格式
require(Cairo)
CairoPNG("plot3.png")#單位為英寸
ggplot(data=p, aes(x=diqu, y=Freq,fill=diqu), fill=diqu) +
  geom_bar(stat="identity")+ 
 theme(panel.background=element_rect(fill='transparent',color ="gray"),#背景色設為透明,邊框為灰色
        #設定x軸座標標籤的文字方向,大小,顏色
        axis.text.x = element_text(angle = 70, hjust = 0.5, vjust = 0.5,color = "black",size=9))+
  ylim(0,250)+#設定y軸取值範圍
  theme(panel.grid =element_blank())+ ## 刪去網格線
  geom_text(mapping = aes(label = p$Freq),size=3,vjust=1.4)#新增資料,並規定資料的大小和位置
dev.off() #關閉影象裝置,同時儲存圖片

儲存中中文亂碼解決

如果不能準確設定會出現如下圖中中文亂碼問題。

解決方法是,在CairoPNG(“plot.png”)中加入family設定,同時一定要注意把圖例、座標標籤以及其他帶中文的內容全部字型設定一致。

#可藉助Cairo包進行儲存為png、pdf等格式
require(Cairo)
CairoPNG("plot3.png",family="SimSun" )#單位為英寸,此處也可設定儲存pdf格式CairoPDF("plot3.pdf",family="SimSun" )
ggplot(data=p, aes(x=diqu, y=Freq,fill=diqu), fill=diqu) +
  geom_bar(stat="identity")+ 
  theme(panel.background=element_rect(fill='transparent',color ="gray"),#背景色設為透明,邊框為灰色
        legend.text=element_text(family="SimSun"), #改變圖例的字型
        #設定x軸座標標籤的文字方向,大小,顏色
        axis.text.x = element_text(angle = 70, hjust = 0.5, vjust = 0.5,family="SimSun",color = "black",size=9))+
  ylim(0,250)+#設定y軸取值範圍
  theme(panel.grid =element_blank())+ ## 刪去網格線
  geom_text(mapping = aes(label = p$Freq),size=3,vjust=1.4)#新增資料,並規定資料的大小和位置
dev.off() #關閉影象裝置,同時儲存圖片

其中family是各種字型,有如下參考:

字型 family 字型 family
黑體 SimHei 楷體 KaiTi
新宋體 NSimSun 楷體_GB2312 KaiTi_GB2312
仿宋 FangSong 微軟正黑體 Microsoft JhengHei
仿宋_GB2312 FangSong_GB2312 微軟雅黑 Microsoft YaHei
幼圓 YouYuan 隸書 LiSu
華文細黑 STXihei 華文楷體 STKaiti
華文宋體 STSong 華文中宋 STZhongsong
華文仿宋 STFangsong 方正舒體 FZShuTi
方正姚體 FZYaoti 華文彩雲 STCaiyun
華文琥珀 STHupo 華文隸書 STLiti
華文行楷 STXingkai 華文新魏 STXinwei
新細明體 PMingLiU 細明體 MingLiU