您的位置:首頁>正文

你終於會做截斷圖了,可審稿人說不讓做,怎麼破?

作者:麥子

資料視覺化真是一個蠻頭疼的問題, 你不停地尋找最恰當的表達方法, 讓好不容易做出來的實驗顯得更驚豔。 但有時候你踏破鐵鞋終於找到了,

做好了, 寫完文章投出去了, 突然審稿人提了一些出乎意料的意見, 這時頭疼就變成了蛋疼。

比如, 有時候我們會遇到一個很崎嶇的資料集, 有某組特大, 有某組特小, 於是你做出來的就是這樣的:

正確是正確, 但就是有點彆扭。

如果我想讓B、C兩組顯得更清楚些, 那麼截斷圖是一個常規選則, 像這樣:

Y軸斷成了兩截, 一截是0~15, 一截是60~80, 這樣我就可以看到那兩組數值較小的資料的變化。 如果B、C兩組本來沒多大意義, 那不看也罷。 但萬一是兩組藥物把某個指標從A的高值降到這麼低,

我就很想展示它們之間的差別, 現在C組的離散程度就比B組小。

這樣操作起來也容易, 就在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

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示