作者:麥子
資料視覺化真是一個蠻頭疼的問題, 你不停地尋找最恰當的表達方法, 讓好不容易做出來的實驗顯得更驚豔。 但有時候你踏破鐵鞋終於找到了,
比如, 有時候我們會遇到一個很崎嶇的資料集, 有某組特大, 有某組特小, 於是你做出來的就是這樣的:
正確是正確, 但就是有點彆扭。
Y軸斷成了兩截, 一截是0~15, 一截是60~80, 這樣我就可以看到那兩組數值較小的資料的變化。 如果B、C兩組本來沒多大意義, 那不看也罷。 但萬一是兩組藥物把某個指標從A的高值降到這麼低,
這樣操作起來也容易, 就在Graphpad裡進行。
Graphpad中截斷圖的做法
做好上面那張原圖之後, 按兩下Y軸, 在彈出的對話方塊中選擇Left Y axis選項卡。 接下來第一行就是Gaps and Direction, 點開下拉清單, 根據情況選2截或3截, 本例中就選2截, 圖示方向隨意。
此時下方多一了行, 下拉清單有Bottom和Top, 分別選中後可對上下兩截Y軸進行設置, 如圖將下半截設成0~15。 同理選擇Top後將上半截設成60~80。
左邊的百分比則是上下兩截在視覺上各占Y軸全長的比例, 只要設一個, 另一個會自動根據總和100%來變化。 這幾個數值可根據實際情況調整, 直到看起來舒服, 就得到第2張Y軸分截的圖。
其他細節如字體字型大小啥的也在這裡設置好。 然後興沖沖地把文章投出去……
可這點功夫打不過人家啊!
一般情況下也不會有什麼問題吧, 這個做法也比較常見。 直到有一天, 我發現R語言常用的做圖包ggplot2不能這麼做。 咦?這不是傳說中功能完善、做圖嚴謹又漂亮的包嗎?居然這麼水?!
細查之下, 發現不是水,
你問他為啥, 他是這麼說的:
https://groups.google.com/forum/#!topic/ggplot2/jSrL_FnS8kc
對, 不能做, 因為本寶寶不喜歡。 這樣會對資料造成視覺上的扭曲。 最好做兩張圖, 一張是所有資料, 一張只有數值小的, 這樣你就能看到大值如何碾壓小值。
這可一語驚醒夢中人。 資料視覺化,追求的不僅是視覺上看著舒服甚至“酷炫”,其第一要義當然是資料的嚴謹呀!
不過,他說兩張圖?會不會太占空間了?
看看上面的原圖,右邊兩組矮下去的部分留出了一大片空白,能不能把那張小數值的塞進去?
Graphpad中嵌合圖的做法
還是那張原圖。做好以後,New→New Graph of Existing Data,新建一張圖。然後在彈出的對話方塊中選擇好相應的圖形,勾選Plot selected data sets only之後,點Select選擇兩組小數值。
然後設置圖片外觀啥的我就不說了,直接看排版。繼續新建,New Layout,在彈出的對話方塊中可以看到嵌入式,就它了~
下邊選擇自動填充,Duang!
再拖動調整位置大小啥的,齊活了。
關於數值跨度太大的問題,在資料類的社區中也有不少討論。除了做嵌合圖外,也有人建議將Y軸做對數處理,這在Graphpad中也可以實現,就是按兩下Y軸後,在剛才選擇分截那裡的右邊的下拉清單裡就有。但也有人認為,取對數可能僅有數學意義而不一定有實際意義。
另外也有人建議直接上表格,貼數位,簡單粗暴。
至於有沒有什麼約定或規範說必須選哪種表達形式,貌似暫時沒聽說,只不過既然有這種觀點存在,總是要留一手的才放心呐。還是那句老話,先仔細看期刊有沒有特殊要求。
R 語言嵌合圖的做法
喜歡R語言的同學可以用ggplot2包。這個包的做圖思路比較清奇,是圖層疊加方式。不過今天的重點不在畫圖,就簡單講一下吧。至於重點嵌套,其實只有最後三行代碼。
# 載入需要的包
library(plyr)
library(Rmisc)
library(ggplot2)
library(grid)
#構建數據
A <- rnorm(10,75,10)
B <- rnorm(10,12,5)
C <- rnorm(10,4,3)
Group <- c(rep('A',10),rep('B',10),rep('C',10))
Value <- c(A,B,C)
D <- data.frame(Group,Value)
# 求標準差,後面畫誤差線要用
DSe <- summarySE(D,measurevar = 'Value',groupvars = 'Group')
# 把組別轉化成因數
D$Group <- factor(D$Group)
# 挑三個顏色
C <- c('#55a0fb','#ff8080','#c5944e')
#畫大圖
p1 <- ggplot(DSe,aes(Group,Value)) + # 定義環境
geom_bar(aes(Group,Value,fill = Group),stat = 'identity',width = 0.5,show.legend = T) + # 畫橫條圖
geom_errorbar(aes(ymin = Value-se, ymax = Value+se),width = .2) + #加誤差線
scale_fill_manual(values = C) + # 配色
labs(x='修改X軸為Group',y='修改Y軸為Value',title = '添加標題')+
theme(axis.title = element_text(face = 'bold'),# 定義主題,如坐標軸標題樣式、背景等
axis.text = element_text(face = 'bold',colour = 'black'),
plot.title = element_text(face = 'bold',colour = 'black',hjust = 0.5,size = 20),
legend.background = element_rect(I(0),linetype = 1))
p1 # 看下效果
# 選擇小資料集、小顏色集
DSe2 <- DSe[2:3,]
C2 <- C[2:3]
# 畫小圖,基本和大圖一樣,後面要背景透明、顯示坐標軸
p2 <- ggplot(DSe2,aes(Group,Value)) +
geom_bar(aes(Group,Value,fill = Group), stat = 'identity',width = 0.5) +
geom_errorbar(aes(ymin = Value-se, ymax = Value+se),width = .2)+
scale_fill_manual(values = C2)+
guides(fill = F)+
theme(axis.text = element_text(face = 'bold',colour = 'black'),
axis.title.y = element_blank,
axis.line = element_line(linetype = 1,colour = 'black'), # 顯示坐標軸
plot.background = element_rect(I(0),linetype = 0), # 背景透明
panel.background = element_rect(I(0)),
panel.grid.major = element_line(colour = NA),
panel.grid.minor = element_line(colour = NA))
p2
# 嵌套
sub <- viewport(width = 0.5,height = 0.4,x = 0.64,y = 0.6) # 配置環境。前兩個是子圖的大小比例,後兩個是位置,可自行調整到好看為止。
p1 # 上大圖
print(p2,vp = sub) # 加小圖
就醬。如果你真的想做截斷坐標軸的圖,聽說plotrix包可以,詳見參考資料3。
參考資料:
1. https://groups.google.com/forum/#!topic/ggplot2/jSrL_FnS8kc
2. https://stats.stackexchange.com/questions/1764/what-are-alternatives-to-broken-axes
3. https://stackoverflow.com/questions/19612348/break-x-axis-in-r
歡迎投稿
tougao@helixlife.com.cn
合作微信:helixlife6
資料視覺化,追求的不僅是視覺上看著舒服甚至“酷炫”,其第一要義當然是資料的嚴謹呀!不過,他說兩張圖?會不會太占空間了?
看看上面的原圖,右邊兩組矮下去的部分留出了一大片空白,能不能把那張小數值的塞進去?
Graphpad中嵌合圖的做法
還是那張原圖。做好以後,New→New Graph of Existing Data,新建一張圖。然後在彈出的對話方塊中選擇好相應的圖形,勾選Plot selected data sets only之後,點Select選擇兩組小數值。
然後設置圖片外觀啥的我就不說了,直接看排版。繼續新建,New Layout,在彈出的對話方塊中可以看到嵌入式,就它了~
下邊選擇自動填充,Duang!
再拖動調整位置大小啥的,齊活了。
關於數值跨度太大的問題,在資料類的社區中也有不少討論。除了做嵌合圖外,也有人建議將Y軸做對數處理,這在Graphpad中也可以實現,就是按兩下Y軸後,在剛才選擇分截那裡的右邊的下拉清單裡就有。但也有人認為,取對數可能僅有數學意義而不一定有實際意義。
另外也有人建議直接上表格,貼數位,簡單粗暴。
至於有沒有什麼約定或規範說必須選哪種表達形式,貌似暫時沒聽說,只不過既然有這種觀點存在,總是要留一手的才放心呐。還是那句老話,先仔細看期刊有沒有特殊要求。
R 語言嵌合圖的做法
喜歡R語言的同學可以用ggplot2包。這個包的做圖思路比較清奇,是圖層疊加方式。不過今天的重點不在畫圖,就簡單講一下吧。至於重點嵌套,其實只有最後三行代碼。
# 載入需要的包
library(plyr)
library(Rmisc)
library(ggplot2)
library(grid)
#構建數據
A <- rnorm(10,75,10)
B <- rnorm(10,12,5)
C <- rnorm(10,4,3)
Group <- c(rep('A',10),rep('B',10),rep('C',10))
Value <- c(A,B,C)
D <- data.frame(Group,Value)
# 求標準差,後面畫誤差線要用
DSe <- summarySE(D,measurevar = 'Value',groupvars = 'Group')
# 把組別轉化成因數
D$Group <- factor(D$Group)
# 挑三個顏色
C <- c('#55a0fb','#ff8080','#c5944e')
#畫大圖
p1 <- ggplot(DSe,aes(Group,Value)) + # 定義環境
geom_bar(aes(Group,Value,fill = Group),stat = 'identity',width = 0.5,show.legend = T) + # 畫橫條圖
geom_errorbar(aes(ymin = Value-se, ymax = Value+se),width = .2) + #加誤差線
scale_fill_manual(values = C) + # 配色
labs(x='修改X軸為Group',y='修改Y軸為Value',title = '添加標題')+
theme(axis.title = element_text(face = 'bold'),# 定義主題,如坐標軸標題樣式、背景等
axis.text = element_text(face = 'bold',colour = 'black'),
plot.title = element_text(face = 'bold',colour = 'black',hjust = 0.5,size = 20),
legend.background = element_rect(I(0),linetype = 1))
p1 # 看下效果
# 選擇小資料集、小顏色集
DSe2 <- DSe[2:3,]
C2 <- C[2:3]
# 畫小圖,基本和大圖一樣,後面要背景透明、顯示坐標軸
p2 <- ggplot(DSe2,aes(Group,Value)) +
geom_bar(aes(Group,Value,fill = Group), stat = 'identity',width = 0.5) +
geom_errorbar(aes(ymin = Value-se, ymax = Value+se),width = .2)+
scale_fill_manual(values = C2)+
guides(fill = F)+
theme(axis.text = element_text(face = 'bold',colour = 'black'),
axis.title.y = element_blank,
axis.line = element_line(linetype = 1,colour = 'black'), # 顯示坐標軸
plot.background = element_rect(I(0),linetype = 0), # 背景透明
panel.background = element_rect(I(0)),
panel.grid.major = element_line(colour = NA),
panel.grid.minor = element_line(colour = NA))
p2
# 嵌套
sub <- viewport(width = 0.5,height = 0.4,x = 0.64,y = 0.6) # 配置環境。前兩個是子圖的大小比例,後兩個是位置,可自行調整到好看為止。
p1 # 上大圖
print(p2,vp = sub) # 加小圖
就醬。如果你真的想做截斷坐標軸的圖,聽說plotrix包可以,詳見參考資料3。
參考資料:
1. https://groups.google.com/forum/#!topic/ggplot2/jSrL_FnS8kc
2. https://stats.stackexchange.com/questions/1764/what-are-alternatives-to-broken-axes
3. https://stackoverflow.com/questions/19612348/break-x-axis-in-r
歡迎投稿
tougao@helixlife.com.cn
合作微信:helixlife6