筆者最近在幫客戶分析案子的時候遇到了一個畫圖的問題,後來測試了許多做法,最後找到用R來解決此畫圖問題。筆者手上的資料如下圖所示,包含了五個欄位,其中Mean, Lower, Higher是事先計算好的統計結果,Mean是點估計值,Lower跟Higher分別是95%信賴區間跟Mean之間的距離,因為是假設常態分佈的情況,因此Lower跟Higher會剛好一樣。

 

1.jpg

 

              筆者想透過已經算好的統計結果繪製散佈圖+誤差線(error bar)的圖,如果是筆者平常的作法,會直接用excel的散佈圖並加上誤差線,可以快速的得到下圖,X軸就是上述資料當中的Pair欄位,一共會有28組,Y軸就是Mean, Lower, Higher的值,其中圖形上的方框是Mean,兩個端點的線條則是Mean減去Lower, Mean加上Higher,因為筆者的資料有三種Score (iscore, tiscore, iIFTA),而且會希望在同一張圖上面去比較三種Score,這就有點困難了,因為每一組Pair上方要有三條線,筆者有試著讓散佈圖去抓取不同X軸,讓另外兩組的線有平移的效果,但如果只有少數的Pair,用這個方式的確可以得到筆者想要的效果,但筆者目前的例子有28組Pair,當Pair的數量增加後,平移的效果越到後面的Pair,會出現線條跟點重疊的狀況,不管怎樣調整平移的距離,都還是無法得到筆者想要的效果,因此筆者最後借助R語言去得到想要的效果。

 

2.jpg

 

    筆者接下來將步一步的介紹如何透過R語言的指令來去完成下圖的成果,首先,需要先確認是否已經安裝了”ggplot2”這個package,這個package主要是用於將統計結果可視化的模組,在繪圖之前,為了讓之後圖形上的字型是筆者想要的,會用到windowsFonts(BL = windowsFont(“Calibri”)) #改字型,筆者將Calibri這個字型儲存至一個BL的物件,之後可以呼叫BL這個物件將圖形變更成Calibri這個字體。接下來筆者透過以下三行指令將初步的圖形給繪製出來,如下圖的1A。利用ggplot讀取要用來畫圖的資料(data),其中X軸是Pair,Y軸是Mean,每一個Pair 會根據不同Score分成三條線ggplot(data, aes(Pair, Mean, color = Score)),利用ggplot中的geom_point針對點做設定,shape指的是點的形狀(不同號碼代表不同的形狀,如下圖所示),

 

3.jpg

 

               size則是點的大小,但這當中最重要的指令是position = position_dodge(width = 0.9),因為這個指令讓同一個Pair下的三種Score的點不會重疊在一起,會平均分散在同一個Pair下(類似excel下散佈圖平移的效果),因此可以創造出筆者需要的效果。

geom_point(position = position_dodge(width = 0.9),shape=15,size=2)

利用ggplot中的geom_errorbar去產生誤差線,ymin指的是每一條誤差線的下界是多少,筆者這邊是設定Mean減去Lower,同理ymax則是每一條誤差線的上界,筆者這邊是設定Mean加上Higher,aes中的width=0.5,則是設定誤差線端點的寬度。這邊一樣要設定position = position_dodge(width = 0.9),這邊的設定會跟上述點的設定一致,同一個Pair下的三種Score誤差線不會重疊在一起,會平均分散在同一個Pair。

geom_errorbar(aes(Pair, ymin = (Mean - Lower), ymax = (Mean + Lower),width=0.5), position = position_dodge(width = 0.9))

原則上執行完上述三行的指令,已經可以得到筆者想要的cluster error bar chart的效果,接下來的步驟則是圖形的優化,最後可以得到圖1B的成品。

 

4.jpg

5.jpg

 

圖形美化步驟如下:

1.去掉背景的灰色:theme_bw()
2.去掉背景的網格線:theme(panel.grid = element_blank())
3.不要圖例:theme(legend.position =“none”)
4.加入水平虛線(y軸=0.4)且線條類型為虛線(dashed),下圖是其他線條的類型:geom_hline(aes(yintercept = 0.4), linetype=”dashed”)

 

6.jpg

 

5.設定Y軸的範圍(-0.1到0.7),且區間為每0.1:scale_y_continuous(limits=c(-0.1, 0.7), breaks =seq(-0.1,0.7,by=0.1))
6.設定error bar的線條以及點的顏色(顏色可以根據色盤去定義,可去網路搜尋色盤:https://www.toolskk.com/color)  scale_color_manual(values=c(“#E00000”, “#2626FF”, “#A830FF”)) 
7.去除X軸的標題:xlab(NULL)
8.去除Y軸的標題:ylab(NULL)
9.去掉圖形外框:theme(panel.border = element_blank())
10.把X軸跟Y軸框線加回去,並設定成黑色(這邊的顏色也可以根據色盤去定義):theme(axis.line = element_line(colour = “Black”))
11.調整座標字形(根據一開始設定的BL物件)及字體大小(14號字):
theme(axis.text.x = element_text(family = “BL”, size=14),
axis.text.y = element_text(family = “BL”, size=14))

 

參考資料:

  1. https://blog.csdn.net/weixin_42933967/article/details/96198929
  2. https://stackoverflow.com/questions/42539512/grouped-graph-with-error-bars
  3. https://www.jianshu.com/p/6f8fc2bacbfd

上述例子完整語法:

library(ggplot2)

library(haven)

data <- read_sav("D:/data.sav")

#改字體

windowsFonts(BL = windowsFont("Calibri"))

ggplot(data, aes(Pair, Mean, color = Score))+

geom_point(position = position_dodge(width = 0.9),shape=15,size=2)+

geom_errorbar(aes(Pair, ymin = (Mean - Lower), ymax = (Mean + Lower),width=0.5), position = position_dodge(width = 0.9))+

#去掉背景的灰色

theme_bw()+

#去掉背景的網格線

theme(panel.grid = element_blank())+

#不要圖例

theme(legend.position = "none")+

#加入水平虛線(y軸0.4)

geom_hline(aes(yintercept = 0.4),linetype="dashed")+

#設定Y軸的範圍,且區間為每0.1

scale_y_continuous(limits=c(-0.1, 0.7), breaks =seq(-0.1,0.7,by=0.1))+

#設定error bar的線條以及點的顏色

scale_color_manual(values=c("#E00000", "#2626FF", "#A830FF"))+

#去除X軸的標題

xlab(NULL)+

#去除Y軸的標題

ylab(NULL)+

#去掉圖形外框

theme(panel.border = element_blank())+

#把X軸跟Y軸框線加回去,並設定成黑色

theme(axis.line = element_line(colour = "Black"))+

#調整座標字形及字體大小

theme(axis.text.x = element_text(family = "BL", size=14), axis.text.y = element_text(family = "BL", size=14))

 

arrow
arrow
    全站熱搜

    晨晰部落格新站 發表在 痞客邦 留言(0) 人氣()