標籤糊成一坨?如何為圖表添加「帥帥」的指引線?

2021-02-20 基迪奧生物

在Seurat的輸出結果中,有一個展示表達量變化最大10個基因的圖表令人印象深刻,如下圖。關於該圖表的具體內容參考之前《單細胞轉錄組學習筆記之Seurat 3.0(一)》一文。那麼,常規散點圖能不能畫成這樣效果?

如果仍然使用針對單細胞數據高度定製的Seurat,顯然是非常麻煩的。而使用ggplot2繪製類似這樣的多標籤圖表,又容易出現「數據標籤重疊」、超出繪圖區域的標籤「顯示不全「和鄰近數據點」指示不明「三大難題。

於是ggrepel這個R包應用而生,它讓文字標籤周圍產生「力場」,相互排斥,相互靠近的點會添加「指引線」避免指示不明。

整個R包主要有兩個用法幾乎一樣的函數geom_text_repel()和geom_label_repel(),可以把它們視作ggplot2中geom_text()的加強版,很顯然,Seurat集成了這個R包。下面就仍以上圖的數據為例,一起看下具體如何使用ggrepel吧!

https://www.omicshare.com/forum/thread-6312-1-1.html

#讀入數據:
var.df <- read.table("var.genes.xls",header = T,sep = "\t")
head(var.df,10)

#載入dplyr包;
library(dplyr)
#按照variance.standardized這一列數值降序排列;
var.genes<-arrange(var.df,desc(vst.variance.standardized))
head(var.genes,10)

為了檢驗這個包的性能,我這裡選擇繪製15個標籤,當然選擇展示20個也沒問題。

#提取TopN基因集:
n <- 15
topn <- head(var.genes$gene,n)
topn
#追加標籤列;
var.genes$labels <- ""
var.genes$labels[1:n] <- topn
head(var.genes,10)

關於「散點」疊放細節調整,將數據改為升序排列,目的是先畫非高變基因,關注Topn的基因最後再畫,實現後者的散點置於「頂層」效果。

var.genes<-arrange(var.genes,vst.variance.standardized)

#載入所需的畫圖主力R包;
library(ggplot2)
library(ggrepel)
#常規的geom_text()函數的效果;
p1 <- ggplot(data = var.genes,aes(log10(vst.mean),vst.variance.standardized,
color=vst.variable,label=labels)) +
geom_point()
p1+geom_text(color="grey20",size=3)

從上圖我們可以看出,如果直接使用ggplot2的geom_text()函數會出現文本標籤相互重疊的情況(虛線橢圓所示),也會出現標籤對鄰近的點指示不明的情況,如上圖的CLU、NKG7基因。那麼如何避免上述問題呢?我們先使用一下geom_text()函數的加強版:geom_text_repel()。

set.seed(100)
p2 <- p1+geom_text_repel(color="grey20",size=3,point.padding = NA)
p2

geom_text_repel()geom_label_repel()的核心參數:數據點與相應數據標籤的距離,例如1表示標籤在點右/上的1個單位處,而-2.2表示標籤在點左/下2.2個單位處;標籤分布方向,x表水平分布,y 表示垂直分布,both 表示隨機分布;表示點周圍的空餘區域,決定連接線端點到到數據點中心的距離,單位為line。標籤的「排斥」效果很不錯,但是還不夠「高大上」。接著,在垂直方向上給標籤多一些偏移,並繪製箭頭指引線。

p3 <- p1+geom_text_repel(force=20,color="grey20",size=3,point.padding = 0.5,hjust = 0.5,
arrow = arrow(length = unit(0.01, "npc"), type = "open", ends = "last"),
segment.color="grey20",segment.size=0.2,segment.alpha=0.8,nudge_y=1)

p3

關於為線段添加「箭頭」,這裡主要用到grid::arrow()函數,注意,它的參數只適於調整「整支箭的箭頭」部分,如下:ends: "last", "first", "both", 指定線段的那端畫箭頭;type: "open"和"closed" 指定箭頭是否為封閉的三角形。然後應用自定義主題,調整縱軸範圍、散點顏色、圖表主題等。

p3 + scale_y_continuous(breaks = c(0, 3, 6, 9, 12),limits = c(0, 12)) +
xlab("Average expression") +
ylab("Standardized variance") +
scale_color_manual(values=c("#a2a9af", "#a8df65")) +
theme_classic()+
theme(plot.margin = unit(c(1,1,0.5,0.5),"cm"),
legend.position = "none",
axis.title = element_text(size = rel(1.2)),
axis.text = element_text(size=rel(1)),
axis.line = element_line(size = 0.5, colour = "grey30"))

上面的圖表添加上箭頭指引線,瞬間覺得最常見的散點圖也變得「高大上」起來了呢。但對於「審美強迫症」來說,這些標籤的排列還是有點亂,如何把他們排整齊呢?下面就增加點難度,以圖表的中軸線為界,把兩側的標籤整齊排列。具體實現方法就是根據橫坐標將數據集分成兩部分,分別指定標籤的偏移距離和排列方式。比如這裡以「0」為分界,使用subset()函數將數據框分成兩部分,分兩次添加文字標籤

p4 <- ggplot(data = var.genes,aes(log10(vst.mean),vst.variance.standardized,
color=vst.variable,label=labels)) +
geom_point() +
geom_text_repel(
data = subset(var.genes, log10(vst.mean) >= 0),
nudge_x = 3 - log10(subset(var.genes, log10(vst.mean) >= 0)$vst.mean),
color = "grey20",
point.padding = NA,
size = 3,
segment.size = 0.2,
segment.color = "grey50",
direction = "y",
hjust = 1
) +
geom_text_repel(
data = subset(var.genes, log10(vst.mean) < 0),
nudge_x = -3 - log10(subset(var.genes, log10(vst.mean) < 0)$vst.mean),
color = "grey20",
point.padding = NA,
size = 3,
segment.size = 0.2,
segment.color = "grey50",
direction = "y",
hjust = 0
) +
scale_x_continuous(
breaks = c(-3, -2, -1, 0, 1,2,3),
limits = c(-3.5, 3.5))
p4

這裡較難理解一點的是nudge_x(「標籤」到「點」的水平距離)的設置,要想標籤垂直對齊排列,需要為標籤指定同樣的橫坐標,如本文的-3和3,只要用-3和3分別減去「點」的橫坐標值就是對應的nudge_x值啦!當然這裡的hjust參數也很重要,「0」表示文字左對齊,「0.5」表示文字居中,「1」表示文字右對齊。接著是圖表的主題調整,方法同上。

p4 + scale_y_continuous(breaks = c(0, 3, 6, 9, 12),limits = c(0, 12)) +
xlab("Average expression") +
ylab("Standardized variance") +
scale_color_manual(values=c("#a2a9af", "#a8df65")) +
theme_classic()+
theme(plot.margin = unit(c(1,1,0.5,0.5),"cm"),
legend.position = "none",
axis.title = element_text(size = rel(1.2)),
axis.text = element_text(size=rel(1)),
axis.line = element_line(size = 0.5, colour = "grey30"))

如果覺得純文字標籤逼格還不夠,我們還可以用圓角矩形標籤的方式展示,這時候我們就用到了geom_label_repel()函數,參數與上文幾乎一樣,只需做簡單調整。主要是通過fill參數調整矩形標籤的顏色,其他不變。

p5 <- ggplot(data = var.genes,aes(log10(vst.mean),vst.variance.standardized,
color=vst.variable,label=labels)) +
geom_point() +
geom_label_repel(
data = subset(var.genes, log10(vst.mean) >= 0),
nudge_x = 3 - log10(subset(var.genes, log10(vst.mean) >= 0)$vst.mean),
color = "white",
alpha = 0.9,
point.padding = 0.5,
size = 3,
fill = "#96C93D",
segment.size = 0.5,
segment.color = "grey50",
direction = "y",
hjust = 1
) +
geom_label_repel(
data = subset(var.genes, log10(vst.mean) < 0),
nudge_x = -3 - log10(subset(var.genes, log10(vst.mean) < 0)$vst.mean),
color = "white",
alpha = 0.9,
point.padding = 0.5,
size = 3,
fill = "#9881F5",
segment.size = 0.5,
segment.color = "grey50",
direction = "y",
hjust = 0
) +
scale_x_continuous(
breaks = c(-3, -2, -1, 0, 1,2,3),
limits = c(-3.5, 3.5))
p5

p5 + scale_y_continuous(breaks = c(0, 3, 6, 9, 12),limits = c(0, 12)) +
xlab("Average expression") +
ylab("Standardized variance") +
scale_color_manual(values=c("#a2a9af", "#ff85cb")) +
theme_classic()+
theme(plot.margin = unit(c(1,1,0.5,0.5),"cm"),
legend.position = "none",
axis.title = element_text(size = rel(1.2)),
axis.text = element_text(size=rel(1)),
axis.line = element_line(size = 0.5, colour = "grey30"))

是不是好看多了?至此,添加個性化的標籤無需Ai(Illustrator)也能批量自動完成啦!今天的內容就先到這裡啦~實用科研工具推薦      
詳實生信軟體教程分享
前沿創新組學文章解讀
獨家生信視頻教程發布

相關焦點

  • 一文帶你掌握圖表如何添加注釋
    axvspan()和axhspan()函數:是用於繪製垂直於x軸和y軸的參考區域哦下面呢,咱們再一起討論幾個重要的函數吧,今天咱們討論的matplotlib庫中的函數是用於給圖表內容添加注釋的哦,它們同樣很重要!好啦,咱們就開始聊聊吧!
  • Python圖表繪製進階,圖例和標題你真的會添加嗎?一文講透
    在Python的圖表繪製中,圖例和標題是兩個重要的組件,尤其在繪圖區域出現多個圖形時,如果這些圖形不添加說明,那麼對於圖表受眾人員來說,就會很難識別出這些圖形中的主要內容,因此這就顯示出了圖例的重要性,因為圖例可以標記每個圖形所代表的內容;同樣,如果想讓受眾人員搞清楚繪圖區域中的內容所代表的意思
  • 組合圖表之不同量級數據展示
    有時候我們需要用組合圖表展示不同級別的數量。什麼概念呢,比如其中一組數據是按照月份匯總的,另一組數據是按照每天統計的,將這兩組數據繪製在同一個圖表中,知道該怎麼製作嗎?在日銷量系列上右單機,選擇「更改系列圖表類型」,將其更改為折線圖,並在其後面選中次坐標軸。發現,左面還是一坨,這是因為,兩個數據共用一個橫坐標,既然折線圖有了右面的次縱坐標,只需要給它添加一個次橫坐標不就可以了?在圖表右上角的加號點開,選擇「次要橫坐標軸」,這樣兩個圖表就獨立開來,互不影響了。
  • Excel小技巧-以柱形圖表為例詳細解析圖表構成
    Excel工作表中具有強大的圖表編輯功能,一般的圖表創建大家也都是很熟悉,比如說柱形圖表。但是創建出來的圖表又是由什麼構成呢?每一部分都代表的是什麼,大部分人可能就有些懵了,那如何去編輯圖表呢?今天小編就以柱形圖為例詳細解析圖表的編輯技巧。
  • Excel中如何製作組合圖表?——以柱狀圖折線圖組合為例
    在Excel中,有時候單一的圖表類型無法滿足數據的多元化展示,這時就要考慮多種圖表的組合,所以本文就以柱狀圖和折線圖的組合為例,介紹一下組合圖表的製作方法。在下圖中,以年份為橫坐標,營業收入用柱狀圖表示,利潤用折線圖表示。
  • 給Excel折線圖上添加最大值、最小值、平均值,讓圖表更直觀
    在日常工作中,為了讓表格數據更直觀,往往利用Excel的圖表功能生成圖表,如下圖中利用折線圖生成一個的銷售額。如果在上圖中標出上最大值、最小值和平均值,那圖表就更清晰直觀了。最大值和最小值可以直接在圖表上標註出來。平均值可以添加一條直線,哪些在平均值線下,哪些在線上,一目了然。
  • Excel雙坐標軸圖表,這才是同時展現2種數據的正確姿勢
    在Excel中做圖表,不是這兒不對就是那兒不對。相信各位都是經歷過風浪的人,今天就請將雙軸圖表的做法收入囊中。從此在制表的路上,少一坨絆腳石!默認情況下圖表只有1根Y軸和1根X軸,雙軸圖表,是指有2根Y軸的圖表,要這種「奇葩」的圖表有何用?當圖表需要展示2種數據,如銷量和增長率數據時,一個為數值數據,另一個為百分比數據,當然不能在1根Y軸上共處了,這時就需要2根Y軸。下面來看一下案例效果。如下圖的兩張圖所示,分別是原始數據,和將數據做成雙軸圖表的效果。
  • excel圖表製作技巧:多系列數據,如何製作組合圖表?
    本篇教程是做懂領導心思圖表的第三篇,分享多系列數據圖表的製作經驗。多系列數據圖表的製作,在工作中,一直是個難題。由於數據系列較多,做出來的圖表看著總顯得混亂,各數據之間的對比性也不強,基本違背了我們作圖的初衷。那有沒有什麼好的思路或者方法來製作多系列的圖表呢?下面我們就來看看excel高手是如何進行製作的。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
  • Python圖表繪製進擊,一文學會如何調整刻度範圍和刻度標籤
    Python數據化圖表相關的知識點。咱們今天所聊的內容就是關於圖表的刻度範圍調整和刻度標籤相關的東東!刻度範圍,大家都比較熟悉啦,就是圖表中繪圖區域中坐標軸的取值範圍區間,包括x軸和y軸的取值區間,而且刻度範圍是否合適直接決定繪圖區域中圖形所展示的效果的優劣,同樣,對於刻度標籤的樣式也同樣對圖表可視化的效果的優劣有所影響。
  • 做自己漂亮的圖表,一文學會如何用Python填充圖表樣式
    直接開門見山哈,咱們就以最為常見的柱狀圖為例說明吧,比如如果你想在柱體上來個填充樣式啦,也就是說在柱體上繪製裝飾線或者裝飾圖啦,統統都是可以的哦!其實最主要的一點就是記住一個參數哦,它可以說是決定了填充樣式的一切哦!
  • excel圖表製作技巧:如何將多個銷售項目,做成九宮格
    相信大家對「九宮格」都不陌生,日常朋友圈發說說配圖經常會用到九宮格的圖片效果,今天花花給大家分享一下如何使用Excel做一份九宮格的圖表。一起來看一下今天教學成品的效果,如下圖所示。話不多說,下面開始今天的圖表教學內容。
  • Python圖表繪製繼續進階,一文學會做自己獨特和帥氣的圖例
    昨天和大家一起探討了在Python中如何調用matplotlib庫中的legend()和title()函數為圖表添加圖例和標題,今天咱們接著上次所探討的內容繼續深入,依然繼續講解Python中添加圖例和標題相關的知識,希望通過咱們對這次的學習,大家在以後的使用中能夠做出屬於自己個人獨特風格的圖例和標題
  • 如何用Python畫一手漂亮的圖表
    但告別告別不加班(#如何看待拼多多加班文化#),告別Excel,我們用Python可以做到更漂亮更自動的圖形。怎麼來做呢?Python裡有這個強大的武器。那就是Matplotlib!Matplotlib是Python用戶的一種此類解決方案。它是一個全面的繪圖庫,對使用Python和NumPy的人有用。
  • 辦公小技巧:圓形百分比圖表怎麼做
    首先,選中數據插入一個簇狀柱形圖;選中插入的圖表,在「設計」選項卡中點擊「切換行/列」,讓兩個數據形成兩個系列;刪除圖表中不需要的元素,如圖例、網格線、橫坐標軸等;選中圖表縱坐標軸,右擊,選擇「設置坐標軸格式」,在右側窗口的「坐標軸選項」選項卡中,設置坐標軸的最大值為1、最小值為0;選中圖表中的任一系列,將「系列選項」的「系列重疊」值設置為100%,「間隙寬度
  • 如何在Excel中製作實時更新的動態圖表
    如圖,學生英語課程共有六門,目前為止已經完成4門,要求做一個動態圖表,在更新後續數據的同時,圖表也會實時更新。接下來利用函數來為動態圖表獲取數據。在「數據獲取」下的空白單元格輸入公式「=OFFSET($B$2,MATCH($A$10,$A$3:$A$6,0),0,1,COUNT($B$3:$G$3))」。
  • 圖表:一圖值千字
    在「摘要」一節的注意事項中我提到不少讀者只讀摘要,所以摘要必須能獨立成文,並能說明所有主要結果及其意義。有的讀者會隨後再看一下圖表來核實一下摘要中提到的結果,但仍然不讀全文。
  • 漂亮圖表也可信手拈來,一文學會用Python繪製堆積折線圖
    今天咱們還是接著上次的話題,繼續和大家聊聊關於Python繪圖相關的東東哦,上次已經和大家討論完了如何給自己所繪製的圖表中添加裝飾線以及修改裝飾線密度的方法,今天呢,咱們再聊點的新的東東哦,還是和大家繼續深耕Python經典的matplotlib庫哦!好啦,咱們就開始吧!
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    如果用Python進行繪製圖表,大家會如何操作呢?相信肯定會用到matplotlib庫,作為Python專業的二維和三維可視化庫之一,matplotlib庫是目前Python進行數據可視化最為常用的庫。
  • 吸引老闆的不僅僅是表格數據:一組彰顯科幻、未來的Excel圖表
    今天再分享一組具有科幻風格的Excel圖表,記住吸引老闆的不僅僅是表格數據,展現數據的美觀才更易閱讀具體操作步驟:第一步:準備數據:添加輔助數據,輸入公式:=1-F4,再下拉填充公式,也就是計算出未完成率2、製作圓環圖:點擊【插入】選項卡的中【插入餅圖或圓環圖】按鈕,選擇【圓環圖】3、添加數據:點擊【格式】
  • 圖表是如何欺騙我們的?
    我們經常在日常生活中見到各種各樣的圖表。圖表的作用是幫助人去理解繁瑣的數據,但是有些時候,圖表會起到反作用。差的圖表,不但不能幫我們直觀地理解數據,反而要耗費我們更多的大腦細胞才能明白其中含義,假如是這樣還不如不要圖表呢。下面,我們就舉5個例子來看看圖表是如何欺騙我們的。騙人的視角下面兩個3D餅形圖中表示某企業的總體支出費用,「工資費用」都佔了總體支出的30%。