截斷Y軸往往是我們作柱形圖時候,當有一組數據的分布過大或者過小時候需要用到,不截斷的話值小的變量信息往往會被掩蓋,圖片也會不美觀,其實R中截斷Y軸方式其實已經有很多了,今天再介紹倆個快速截斷Y軸方法供大家參考。
gg.gap包這個包已經發布在Cran上了,可以直接install.packages('gg.gap')進行安裝,這裡給出包的文檔地址[1]以供學習。
這個包的Description中提到ggplot2圖中定義Y軸不是很容易,gg.gap()函數可以執行此操作,我們就來一探究竟。使用前我們先通過 ?gg.gap 了解一下該函數。簡單使用如下:
函數使用參數並不算多,我們來簡單看一下:
參數作用plot'ggplot2'圖形ylimy軸數值的限制segments設置一段的間隔。如果你想給出多段間隔,請使用list()將它們連接起來。tick_width設置每個分段的刻度。rel_heights設置分段的相對高度,默認為1和0。vjust垂直調整,默認為0...?gg.gap自行了解吧示例我們來看下文檔中給的例子,是用了mtcars數據集示範。
先來個簡單的柱形圖
data(mtcars)
library(ggplot2)
p<-ggplot(data = mtcars, aes(x = gear, fill = gear)) +
geom_bar() +
ggtitle("Number of Cars by Gear") +
xlab("Gears")
p先切一刀
通過設置segment=c(5,10)可以輕鬆將Y中從5到10處截斷
library(gg.gap)# 加載包
gg.gap(plot=p,
segments=c(5,10),
ylim=c(0,50))再來一刀
切倆段時候注意使用list函數包含倆段的範圍,這裡還用到tick_width = c(1,0.5,10),它的作用可以設置每個分段的刻度範圍,如下圖切分後的三個圖,Y軸的刻度範圍就分別變為1, 0.5, 10了。
gg.gap(plot=p,
segments=list(c(2.5,4),c(5,10)),
tick_width = c(1,0.5,10),
ylim=c(0,50))設置相對高度
rel_heights參數可以設置Y軸片段的相對高度,用時自己調節數值至理想的樣子即可。
gg.gap(plot=p,
segments=list(c(2.5,4),c(5,10)),
tick_width = c(1,0.5,10),
rel_heights=c(0.2,0,0.2,0,1),
ylim=c(0,50))其他
我們可以設置scale_y_continuous(trans = 'reverse')將Y軸數值進行反轉,從上往下數值由小到大,也是一種不錯的可視化選擇。#reversed y-axis
p<-ggplot(data = mtcars, aes(x = gear, fill = gear)) +
geom_bar() +
ggtitle("Number of Cars by Gear") +
xlab("Gears")+
scale_y_continuous(trans = 'reverse')
p
#single segments and missing tick_width
gg.gap(plot=p,
segments=c(10,5),
ylim=c(15,0))
在看文檔時候,看到作者在新版本v1.3中增添了一個add_legend函數可以去增加圖例。library(ggplot2)
mtcars$gear <- factor(mtcars$gear)
bp <- ggplot(data = mtcars, aes(x = gear, fill = gear)) +
geom_bar() +
ggtitle("Number of Cars by Gear") +
xlab("Gears")
gg.gap(plot = bp,
ylim = c(0,16),
segments = c(6,8))
add.legend(plot = bp,
margin = c(top=1,right=2.5,bottom=1,left=460))以上就是gg.gap包截斷Y軸的基本使用了,更多參數細節可以去看源文檔,不多內容也就倆三頁。
另一種思路(coord_cartesian函數)其實Y軸截斷是倆個範圍的內的圖形進行組合,再調整比例的設置,我們可以使通過coord_cartesian函數去設置ylim的範圍,先分別畫出倆個範圍,再利用ggpubr包中的ggarrange進行倆個圖形的拼接也可以實現目的,我們還以上面的柱形圖舉例:
library(ggpubr)
p1<-ggplot(data = mtcars, aes(x = gear, fill = gear)) +
geom_bar() +
xlab("Gears")+
coord_cartesian(ylim = c(0,5))
p2<-ggplot(data = mtcars, aes(x = gear, fill = gear)) +
geom_bar() +
ggtitle("Number of Cars by Gear")+
labs(x=NULL,y=NULL,fill=NULL) +
theme(axis.text.x = element_blank(),axis.ticks.x = element_blank()) + #去掉X軸和X軸的文字
coord_cartesian(ylim = c(10,50))
p1
p2
#拼起來
ggarrange(p2,p1,heights=c(1/5, 4/5),ncol = 1, nrow = 2,common.legend = TRUE,legend="right",align = "v")
參考資料[1]gg.gap: https://www.rdocumentation.org/packages/gg.gap/versions/1.3/topics/gg.gap