ggplot2繪圖學(xué)習(xí)-箱線圖和小提琴圖

最近考種數(shù)據(jù)回來了,今年測得單株瘾蛋,本想用箱線圖表示俐镐,后來一并把小提琴圖也做了,順便做個筆記吧哺哼。

利用SUMIF對相同rowname數(shù)據(jù)合并

首先遇到了一個問題佩抹,由于之前在收花時分了好幾批收的,結(jié)果在最后考種統(tǒng)計時存在一個編號對應(yīng)了好幾個數(shù)據(jù)取董,所以第一步要把這些數(shù)據(jù)求和棍苹。
一定要相信推動科技進步的永遠是那些“懶漢”們,如果你比較勤快茵汰,可能會一個一個加起來在總結(jié)枢里,但是懶漢們不會,于是就有了SUMIF函數(shù)蹂午。 首先看下SUMIF函數(shù)是個什么玩意栏豺。

SUMIF函數(shù)是Excel常用函數(shù)。使用 SUMIF 函數(shù)可以對報表范圍中符合指定條件的值求和豆胸。Excel中sumif函數(shù)的用法是根據(jù)指定條件對若干單元格奥洼、區(qū)域或引用求和。
SUMIF(range,criteria,sum_range)
1)range 為用于條件判斷的單元格區(qū)域晚胡。
2)criteria 為確定哪些單元格將被相加求和的條件灵奖,其形式可以為數(shù)字、文本搬泥、表達式或單元格內(nèi)容桑寨。例如伏尼,條件可以表示為 32忿檩、"32"、">32" 爆阶、"apples"或A1燥透。條件還可以使用通配符:問號 (?) 和星號 (* )沙咏,如需要求和的條件為第二個數(shù)字為2的,可表示為"?2*",從而簡化公式設(shè)置班套。
3)sum_range 是需要求和的實際單元格肢藐。

  • 第一步就是先復(fù)制編號到另外一列,(不要和已有的數(shù)據(jù)挨著吱韭,中間空幾列)吆豹,然后去重,就剩下唯一的編號理盆。
  • 然后就按照上面SUMIF的語法寫自己的公式了痘煤,我的公式:=SUMIF($A$2:$A$802,$F2,B$2:B$504)。dolor符號$在excel中表示絕對引用猿规,因為后面要直接往下拉衷快,同時要找出其他條目還要橫向拉,excel在拉的時候?qū)?yīng)的單元格也會自動調(diào)整姨俩,但是我要找的范圍其實是固定的從A2單元格到A802單元格蘸拔,這個范圍是我們?nèi)康木幪枀^(qū)域,
  1. 所以為了避免在下拉或者向右拉的時候這個區(qū)域改變我們限定不管你函數(shù)跑到哪個單元格range的范圍總是在A2到A802环葵,所以range$A$2:$A$802调窍;
  2. 然后是criteria也就是我們要找的唯一值,也就是剛才去重的編號张遭,在這里我們需要縱向拉的時候單元格隨著變化陨晶,但是橫向拉不變,所以用$F限定criteria數(shù)據(jù)永遠在F列帝璧,當你向下拉的時候隨著你公式位置的變化先誉,criteria隨著公式的位置變化成F2,F(xiàn)3的烁,F(xiàn)...褐耳。注意這里不能用$限定2! 原因..沒必要解釋了吧渴庆;
  3. 最后是sum_range,意思就是你要求和的數(shù)據(jù)铃芦,因為我這里統(tǒng)計了鈴數(shù),籽棉重襟雷,皮棉重三個數(shù)據(jù)刃滓,所以在做完鈴數(shù)后向右一拉籽棉重和皮棉重的數(shù)據(jù)也出來了,但是前提是范圍仍舊是2-504這個大范圍耸弄,向右拉的時候要求求和數(shù)據(jù)列從B變?yōu)镃再到D咧虎,所以我用$限定了2-504的范圍,而沒有限定列计呈,讓列名隨著函數(shù)位置的改變隨著改變砰诵,所以sum_range部分為B$2:B$504征唬。

自己胡編了個數(shù)據(jù)做了個動圖:


Sumif實現(xiàn)指定條件求和

用ggplot2畫箱線圖和小提琴??圖

  • ggplot2要求的數(shù)據(jù)輸入方式
    額,數(shù)據(jù)沒發(fā)表所以有碼圖如下,


    數(shù)據(jù)準備

    首先看下ggplot的圖形語法茁彭。

盡管qplot作為ggplot2的快速作圖(quick plot)函數(shù), 能夠極大的簡化作圖步驟, 容易入門和上手, 但是qplot卻不是泛型函數(shù), 而ggplot()作為泛型函數(shù), 能對任意類型的R對象進行可視化操作, 是ggplot2的精髓所在, 因而在本文中主要的繪圖都是通過ggplot()來完成的总寒。有關(guān)于qplot的介紹可以細看Hadley的官方介紹。
在Hadley的ggplot2官方文檔中, Hadely這樣對Wilkinson的圖形語法進行了描述:“一張統(tǒng)計圖形就是從數(shù)據(jù)到幾何對象(geometric object, 縮寫為geom, 包括點理肺、線摄闸、條形等)的圖形屬性(aesthetic attributes, 縮寫為aes, 包括顏色、形狀妹萨、大小等)的一個映射贪薪。此外, 圖形中還可能包含數(shù)據(jù)的統(tǒng)計變換(statistical transformation, 縮寫為stats), 最后繪制在某個特定的坐標系(coordinate system, 縮寫為coord)中, 而分面(facet, 指將繪圖窗口劃分為若干個子窗口)則可以用來生成數(shù)據(jù)中不同子集的圖形∶吒保”因此在ggplot2中, 圖形語法中至少包括了如下幾個圖形部件:

  • 數(shù)據(jù)(data)
  • 映射(mapping)
  • 幾何對象(geom)
  • 統(tǒng)計變換(stats)
  • 標度(scale)
  • 坐標系(coord)
  • 分面(facet)
    這些組件之間是通過“+”, 以圖層(layer)的方式來粘合構(gòu)圖的, 所以圖層是ggplot2中一個重要的概念画切。當然, 在掌握基本的圖形部件基礎(chǔ)上, 要完成一幅高質(zhì)量的統(tǒng)計繪圖, 仍然需要其他圖形部件來進一步擴展, 這包括了:
  • 主題(theme)
  • 存儲和輸出

對于數(shù)據(jù),ggplot規(guī)定了必須是dataframe的形式囱怕,

#數(shù)據(jù)輸入霍弹,將全部數(shù)據(jù)先導(dǎo)進來
phenotype = read.table("2018phenotype.txt", header = T, sep = "\t")
phenotype[1:4,1:4]
rownames(phenotype)=phenotype[,1]
phenotype=phenotype[,-1]
head(phenotype)
#將鈴數(shù)的數(shù)據(jù)新建一個數(shù)據(jù)框
MBN = data.frame(BN = phenotype$Ball_Num.,
                 cultivar = phenotype$cultivar)

這里將所有數(shù)據(jù)導(dǎo)入后想用鈴數(shù)畫箱線圖,那么要把鈴數(shù)的數(shù)據(jù)先拎出來娃弓,此外還得“標注”清楚那個這些鈴重數(shù)據(jù)來自哪個品種典格。那么就新建一個數(shù)據(jù)框,一列為ball number台丛,BN耍缴,另一列就是cultivar
看下ggplotmanual中的例子

base <- ggplot(mpg, aes(displ, hwy)) + geom_point()
    base + geom_smooth()
    # To override the data, you must use %+%
    base %+% subset(mpg, fl == "p")
    # Alternatively, you can add multiple components with a list.
    # This can be useful to return from a function.
    base + list(subset(mpg, fl == "p"), geom_smooth())
  • Description
    Aesthetic mappings describe how variables in the data are mapped to visual properties (aesthetics) of geoms. Aesthetic mappings can be set in ggplot2() and in individual layers.
  • Usage
    aes(x, y, ...)
  • Arguments
    x, y, ...
  • Details
    List of name value pairs giving aesthetics to map to variables. The names for x and y aesthetics are typically omitted because they are so common; all other aesthetics must be named.
    This function also standardises aesthetic names by converting color to colour (also in substrings, e.g. point_color to point_colour) and translating old style R names to ggplot names (eg. pch to shape, cex to size).
  • Value
    A list with class uneval. Components of the list are either quosures or constants. Quasiquotation
    aes() is a quoting function. This means that its inputs are quoted to be evaluated in the context of the data. This makes it easy to work with variables from the data frame because you can name those directly. The flip side is that you have to use quasiquotation to program with aes(). See a tidy evaluation tutorial such as the dplyr programming vignette to learn more about these techniques.
  • See Also
    vars() for another quoting function designed for faceting specifications.

其實主體就是:

base <- ggplot(mpg, aes(displ, hwy))

其中mpg可以理解為我們畫圖數(shù)據(jù)新建的data.frame挽霉,displ為x軸防嗡,hwy為y軸數(shù)據(jù)。所以我們圖的主體就是:

pMBN <- ggplot(MBN, aes(x=cultivar, y=BN, fill=cultivar))
# fill = cultivar 表示顏色按照cultivar分類填充侠坎。

然后通過+對圖形進行調(diào)整蚁趁。

library(RColorBrewer)
colourCount = length(unique(mtcars$hp))
getPalette = colorRampPalette(brewer.pal(9, "Set3"))
pMBN <- ggplot(MBN, aes(x=cultivar, y=BN, fill=cultivar))+
  geom_boxplot()+
  scale_fill_manual(values = getPalette(colourCount))+ 
  labs(title = "Ball number per plant of each cultivar")+
  theme(plot.title = element_text(hjust = 0.5),
        axis.title = element_text(size = 10, color = "blue", face = "bold"),
        axis.text.x = element_text(size = 8, angle = 45, hjust = 1, vjust = 1, face = "bold"))

其中發(fā)生了一點小意外,就是在用scale_fill_brewer()函數(shù)調(diào)用調(diào)色板給box上色的時候發(fā)現(xiàn)超過8個后都成了灰色实胸,布吉島為啥他嫡,百度后發(fā)現(xiàn):

有3類調(diào)色板(palettes)- sequential, diverging, and qualitative - 每一類調(diào)色板包含8到12種顏色(可以利用
brewer.pal.info 或者 ?RColorBrewer看到更多的細節(jié))。
好奇的讀者可能注意到如果柱狀圖包含13或者更多的柱子庐完,就可能出現(xiàn)顯示不出更多顏色钢属,
的確, length(unique(mtcars$hp)) 有 22 個唯一值门躯,然而調(diào)色板 Set2 只有 8 中顏色淆党。調(diào)色板中的顏色缺乏導(dǎo)致了ggplot如下的警告:

  • Warning message:
    In RColorBrewer::brewer.pal(n, pal) : n too large, allowed maximum for palette Set2 is 8
    Returning the palette you asked for with that many colors
  • RColorBrewer為我們提供了一種通過使用構(gòu)造函數(shù)colorRampPalette插入現(xiàn)有調(diào)色板來生成更大調(diào)色板的方法。它生成實際工作的函數(shù):它們通過插入現(xiàn)有的調(diào)色板來構(gòu)建具有任意數(shù)量顏色的調(diào)色板。

總結(jié)就是用Set2或者Set3中的顏色超過8個可能就GG了宁否,所以用RColorBrewer包擴充Set2或者Set3的顏色,所以相應(yīng)的用scale_fill_manual()代替了scale_fill_brewer()窒升。前面的geom_boxplot()直接簡單理解成畫了個箱線圖把缀遍,而后面的labs()可以看出來是加標題的慕匠,同樣用xlab()加x軸標題,ylab()加y軸標題域醇,theme()則是對圖的美化台谊,比如字體,顏色啥的譬挚,偶然發(fā)現(xiàn)一個思路可以事先新建好一個自己喜歡的theme锅铅,然后每次作圖的時候直接+mytheme于是就模仿著畫了個。

##自己的主題1
mytheme <- theme(plot.title = element_text(face = "bold.italic",
                                           size = "14", color = "brown"),
                 axis.title = element_text(face = "bold.italic",
                                           size = "10",color = "blue"),
                 axis.text.x = element_text(face = "bold",
                                            size = 9, angle = 45, hjust = 1, vjust = 1),
                 panel.background = element_rect(fill = "white", 
                                                 color = "black"),
                 panel.grid.major.y = element_line(color = "black", 
                                                   linetype = 2),
                 panel.grid.minor.y = element_line(color = "black",
                                                   linetype = 2),
                 panel.grid.minor.x = element_blank())
#自己的主題2
mytheme2 <- theme(plot.title = element_text(face = "bold.italic",
                                            size = "14", color = "brown"),
                  axis.title = element_text(face = "bold.italic",
                                            size = "10",color = "blue"),
                  axis.text.x = element_text(face = "bold",
                                             size = 8, angle = 45, hjust = 1, vjust = 1),
                  axis.text.y = element_text(face = "bold",size = 8),
                  panel.background = element_rect(fill = "white", 
                                                  color = "black"),
                  panel.grid.major.y = element_blank(),
                  panel.grid.minor.y = element_blank(),
                  legend.text = element_text(size = 8),
                  legend.title = element_text(size = 10,
                                              face = "bold"),
                  panel.grid.minor.x = element_blank())

mythemepolor <- theme(plot.title = element_text(face = "bold.italic",
                                           size = "14", color = "brown", hjust = 0.5),
                 axis.title = element_text(face = "bold.italic",
                                           size = "10",color = "blue"),
                 axis.text.x = element_text(face = "bold", color = "purple", 
                                            size = 9),
                 panel.background = element_rect(fill = "white", 
                                                 color = "black"),
                 panel.grid.major.y = element_line(color = "black", 
                                                   linetype = 2),
                 panel.grid.minor.y = element_line(color = "black",
                                                   linetype = 2),
                 panel.grid.minor.x = element_blank())

一共搞了3個theme减宣,第一個屬于有y軸標線的盐须,第二個為空白背景的,第三個是畫極坐標的漆腌,有了這些贼邓,就開始畫圖

## 直接用新主題加前面的圖,覆蓋掉前面的主題
pMBNfinal = pMBN_ylab + mytheme2
## 保存成pdf
ggsave(file="ball number per plant of each cultivar boxplot.pdf",plot=pMBNfinal, width = 12, height = 6)

看看加主題和沒加主題的效果吧:


單株鈴數(shù)
  • 小提琴圖的畫法
    根據(jù)上面畫boxplot的思路闷尿,小提琴的畫法如下
vMBN <- ggplot(MBN, aes(x=cultivar, y=BN)) + 
  geom_violin(fill="lightblue") + 
  geom_boxplot(fill="lightgreen", width= .2) +
  labs(title = "Ball number per plant of each cultivar") + 
  ylab("Number")
vMBNfinal = vMBN +  mytheme2

當然這里不是一個單純的小提琴圖塑径,因為geom_boxplot(fill="lightgreen", width= .2)加入了箱線圖,如果不想要箱線圖填具,直接去掉這一行统舀,并且補充fill參數(shù)因為單純的箱線圖可以提供的信息是最大值,最小值劳景,上四分位數(shù)誉简,下四分位數(shù),但是無法反映數(shù)據(jù)分布和數(shù)據(jù)密度盟广,此次單株性狀統(tǒng)計按道理來說應(yīng)該符合正態(tài)分布描融,當然可以用夏皮羅檢驗做正態(tài)分布檢驗,但是也可以從小提琴圖看數(shù)據(jù)是否符合正態(tài)分布衡蚂。

小提琴圖

結(jié)果顯而易見窿克,有部分的數(shù)據(jù)缺失不太符合正態(tài)分布,究其原因可能是因為邊際效用等作用造成的毛甲,同一行中在兩邊的單株通常長勢較好年叮,但是中間的有些差,所以鈴數(shù)這個性狀可能不會優(yōu)先考慮玻募。認為比較有說服力的還是鈴重只损。

  • 極坐標下的小提琴圖畫法
    純屬娛樂..不過效果不錯。
#polor violin
polor2 = ggplot(lwpb, aes(x = cultivar,
                          y = lw,
                          fill = cultivar))+
  geom_violin(alpha = 0.95, width = 1) + 
  theme_bw()+
  coord_polar()+
  scale_fill_discrete(c=100, l=100)+
  labs(title = "lint weight per ball")+
  xlab("cultivar")+
  ylab("weight(g)")
polor2finnal = polor2 + 
  mythemepolor
ggsave(file = "lint weight per ball_polor.pdf", plot = polor2finnal)

效果:

極坐標下的violin plot

這個是皮棉重,相比鈴重的數(shù)據(jù)跃惫,這個數(shù)據(jù)的分布基本上都會趨向于正態(tài)分布了叮叹。
就這么多吧。Reference太多了爆存,后面會整理補上蛉顽。
最后用李老師曾經(jīng)說過的一句名言結(jié)束吧:生命在于尋找,想搞科研先较,先學(xué)會百度google吧携冤,在準備問別人之前先問問自己,自己努力尋找過了嗎闲勺?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曾棕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菜循,更是在濱河造成了極大的恐慌翘地,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌幕,死亡現(xiàn)場離奇詭異衙耕,居然都是意外死亡,警方通過查閱死者的電腦和手機序芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門臭杰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谚中,你說我怎么就攤上這事渴杆。” “怎么了宪塔?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵磁奖,是天一觀的道長。 經(jīng)常有香客問我某筐,道長比搭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任南誊,我火速辦了婚禮身诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抄囚。我一直安慰自己霉赡,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布幔托。 她就那樣靜靜地躺著穴亏,像睡著了一般蜂挪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗓化,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天棠涮,我揣著相機與錄音,去河邊找鬼刺覆。 笑死严肪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的隅津。 我是一名探鬼主播诬垂,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼劲室,長吁一口氣:“原來是場噩夢啊……” “哼伦仍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起很洋,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤充蓝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喉磁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谓苟,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年协怒,在試婚紗的時候發(fā)現(xiàn)自己被綠了涝焙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡孕暇,死狀恐怖仑撞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妖滔,我是刑警寧澤隧哮,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站座舍,受9級特大地震影響沮翔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曲秉,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一采蚀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧承二,春花似錦榆鼠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春责静,著一層夾襖步出監(jiān)牢的瞬間袁滥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工灾螃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留题翻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓腰鬼,卻偏偏與公主長得像嵌赠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熄赡,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345