R可視化快速入門-- (20) 脊線圖

2021-02-14 BioparaMeta

Ridgeline 圖(脊線圖),(有時稱為Joyplot)可以同時顯示幾個組的數值分布情況,分布可以使用直方圖或密度圖來表示,它們都與相同的水平尺度對齊,並略有重疊。常常被用來可視化隨時間或空間變化的多個分布/直方圖變化。

安裝包ggridges
# Cran安裝
install.packages("ggridges")
# github上安裝
library(devtools)
install_github("clauswilke/ggridges")

繪圖基礎圖形

主要利用geom_density_ridges函數

# library
library(ggridges)
library(ggplot2)

# Diamonds dataset is provided by R natively
#head(diamonds)

# basic example
ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  geom_density_ridges(alpha = 0.5) +
  theme_ridges() + 
  theme(legend.position = "none")

基礎圖

另外,有時候我們也可分面展示不同範圍的脊線圖

diamonds$label= ifelse(diamonds$price >= 10000,'great','bad')
ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  geom_density_ridges() +
  theme_ridges() + 
  theme(legend.position = "none")+
  facet_wrap(~label)

不同範圍分面展示增加統計信息

這裡利用到stat_density_ridges函數,可以在圖形上增加代表統計信息的線段, 比如增加上 、下四分位數線(Q1 Q3)和中位數線 Q2 。

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  stat_density_ridges(quantile_lines = TRUE)+
  theme_ridges() + 
  theme(legend.position = "none")
  

# 當然,我們也可自定義分位數線 比如2.5% 和 60%的線
ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  stat_density_ridges(quantile_lines = TRUE, quantiles = c(0.025, 0.600), alpha = 0.7)+
  theme_ridges() + 
  theme(legend.position = "none")

將上述代碼中fill的映射值改為factor(stat(quantile)),可以將不同顏色映射在不同的分區,並自定義顏色,如:

ggplot(diamonds, aes(x = price, y = cut, fill = factor(stat(quantile)))) +
  stat_density_ridges(
    geom = "density_ridges_gradient", calc_ecdf = TRUE,
    quantiles = 4, quantile_lines = TRUE
  ) +theme_ridges() + 
  scale_fill_manual(
    name = "Probability", values = c("#FF0000A0", "#A0A0A0A0", "#0000FFA0",'gold'),
    labels = c("(0, 0.025]", "(0.025, 0.050]","(0.050,0.075]", "(0.075, 1]")
  )

按照範圍分組散點圖顯示

參考了[1],代碼中設置jittered_points = TRUE來實現散點的繪製,無論是在stat_density_ridges還是在geom_density_ridges

點可以有以下幾種選擇方式:

position = 'sina',在基線和山脊線之間的山脊線圖中隨機分布點。這是默認選項。position= 'jitter', 隨機抖動山脊線圖中的點。點隨機上下移動和/或左右移動。position = 'raincloud': 在山脊線圖下方創建隨機抖動點的雲。
# 增加散點圖
A <- ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(jittered_points = TRUE)

# 控制點位置
# position = "raincloud"
B <- ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(
    jittered_points = TRUE, position = "raincloud",
    alpha = 0.7, scale = 0.9
  )

# position = "points_jitter"
C <- ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(
    jittered_points = TRUE, position = "points_jitter",
    alpha = 0.7, scale = 0.9
  )

# 增加邊際線
D <- ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1, alpha = 0.7,
  )

library(patchwork)
(A + B)/(C + D)+ plot_annotation(tag_levels = 'A')

自定義散點的樣式、顏色

ggplot(iris, aes(x = Sepal.Length, y = Species, fill = Species)) +
  geom_density_ridges(
    aes(point_color = Species, point_fill = Species, point_shape = Species),
    alpha = .2, point_alpha = 1, jittered_points = TRUE
  ) +
  scale_point_color_hue(l = 40) +
  scale_discrete_manual(aesthetics = "point_shape", values = c(21, 22, 23))

自定義其它(漸變色)

除了上述比較單一的色彩,還可使用此包中geom_density_ridges_gradient函數添加漸變色,拿Example數據為例,可以通過?geom_density_ridges_gradient進行查看更多的控制參數,

# library
library(ggridges)
library(ggplot2)
library(viridis)
library(hrbrthemes)

# Plot
ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = `Month`, fill = ..x..)) +
  geom_density_ridges_gradient(scale = 3, rel_min_height = 0.01) +
  scale_fill_viridis(name = "Temp. [F]", option = "C") +
  labs(title = 'Temperatures in Lincoln NE in 2016') +
  theme_ipsum() +
  theme(
    legend.position="none",
    panel.spacing = unit(0.1, "lines"),
    strip.text.x = element_text(size = 8)
  )

## geom_density_ridges_gradient參數很多,可以?詳細查看
 geom_density_ridges_gradient(
  mapping = NULL,
  data = NULL,
  stat = "density_ridges",
  position = "points_sina",
  panel_scaling = TRUE,
  na.rm = TRUE,
  gradient_lwd = 0.5,
  show.legend = NA,
  inherit.aes = TRUE,
  ...
)

漸變色直方圖顯示

除了上述的密度圖,只需添加上stat=binline參數即可。

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  geom_density_ridges(alpha = 0.5, stat="binline", bins=20) +
  theme_ridges() + 
  theme(legend.position = "none")

直方圖參考資料[1]

ELEGANT VISUALIZATION OF DENSITY DISTRIBUTION IN R USING RIDGELINE: https://www.datanovia.com/en/blog/elegant-visualization-of-density-distribution-in-r-using-ridgeline/

相關焦點

  • R語言學習筆記之相關性矩陣分析及其可視化
    rcorr(x, type = c(「pearson」,「spearman」))。library(Hmisc)#加載包res2 <- rcorr(as.matrix(mydata))res2#可以用res2$r、res2$P來提取相關係數以及顯著性p-valueres2$r
  • 【R教程】《即刻R入門》What is R?
    R有著廣泛地用途,很多數據分析師、數據科學家都用R做事情,比方說數據預處理、數據分析、數據可視化,甚至數據報告等。R提供和實現了很多數據分析方法。Summary《即刻R入門》第一課解決R是什麼?這個核心問題。通過這個問題的認識,可以感受到R的作為。《即刻R入門》第一課還談及了R幫助文檔和R包兩個非常重要的概念,前者是學習R的很好方法,有R問題,查幫助和實例,後者是R應用廣、功能強的基礎。
  • 11個免費工具助你快速入門數據可視化
    這裡列出了11個可讓初學者快速製作漂亮可視化成果的免費工具,這些工具均可免費使用,但如果你想升級服務以獲得更多(可視化)選擇(尤其是雲服務),部分工具可能還提供有Premium版本。Data wrapper (https://www.datawrapper.de/)讓製作圖表和地圖變得更加容易。你只需點一點滑鼠,便可以很輕鬆生成分級地圖、圖例和定位指示圖。
  • 工具分享 | linemap-快速繪製山巒地圖的R可視化包介紹
    上一次介紹了Python繪製svg的優秀可視化庫Pygal,今天我們介紹一下一個優秀的R地圖可視化繪製包-linemap包,顧名思義,該包是是為了繪製由線組成的地圖,其官網如下:https://github.com/rCarto/linemap。
  • 技術貼 | R語言:組學關聯分析和pheatmap可視化
    基本方法是用R語言psych包corr.test函數進行兩組數據的相關分析,結果經格式化後用pheatmap可視化得熱圖。一、模擬輸入 1.KO豐度表代碼:ko_abun = as.data.frame(matrix(abs(round(rnorm(200, 100, 10))), 10, 20))colnames(ko_abun) = paste("KO", 1:20, sep="_")rownames(ko_abun) = paste("sample", 1:10, sep="_")
  • R語言可視化學習筆記之添加p-value和顯著性標記
    利用ggpaired()進行可視化ggpaired(ToothGrowth, x="supp", y="len", color = "supp", line.color = "gray",line.size =
  • 快速入門 | 學習 R 語言
    函數入門與 Python 類似,函數同樣是 R 語言編程的核心下面的函數統計向量中奇數的個數其中 %% 是求餘操作符(Python 中是 %)oddcount <- function(x) { k <- 0 for (n in x) { if (n %% 2 == 1) k <
  • R+ECharts2Shiny實現web動態交互式可視化數據(上)
    作者:糖甜甜甜,R語言中文社區專欄作者公眾號:經管人學數據分析前言之前過年的時候有好友詢問,沒, 8 9  # Sidebar layout with input and output definitions ----10  sidebarLayout(1112    # Sidebar panel for inputs ----13    sidebarPanel(1415      # Input: Slider for the
  • 【好書共享】《R for Data Science》的中譯版
    這本書原版就是開源的(網址:http://r4ds.had.co.nz/),但是中文看得更快,學R語言一定要買一本紙質書放在案頭,多多翻閱。R for Data Science關於這本書這本書將教我們如何用R來做數據科學:學習如何將自己的數據導入R中,把它變成最有用的結構,轉換,可視化並對數據進行建模。
  • 快速入門 Matplotlib
    以下是原文正文:數據的處理、分析和可視化已經成為 Python 近年來最重要的應用之一。這種現象又進一步引出「大數據」分析等類似的話題,而大數據分析在人們所能預見的諸多領域內都有廣泛應用,這其中就包含筆者個人感興趣的機器學習。
  • 文科生快速入門python(十三) | 文件讀寫詳解
    運行後,只有第一個word[:20]有結果,第二個words[:20]的結果是空的。f = open(r"word.txt","r",encoding="utf-8")word = f.read()words = f.read()print(word[:20])print("--")print(words[:
  • 數據可視化之R語言
    分類數據的可視化使用條形圖、點圖、柱形圖、脊柱圖、馬賽克圖、餅圖及四折圖連續數據的可視化使用箱線圖、直方圖、散點圖及其變種、帕累託圖==============================================一、分類數據的可視化
  • R語言可視化之UpSetR包
    今天介紹一個R包UpSetR,專門用來集合可視化,來源於UpSet,Python裡面也有一個相似的包py-upset。此外還有個UpSetR shiny app以及原始碼.UpsetR繪製集合可視化圖形使用函數upset()。
  • pandas數據可視化原來也這麼厲害
    作者:小伍哥 來源:AI入門學習(公眾號)在python中,常見的數據可視化庫有3個:matplotlib:最常用的庫,可以算作可視化的必備技能庫,比較底層,api多,學起來不太容易。seaborn:是建構於matplotlib基礎上,能滿足絕大多數可視化需求,更特殊的需求還是需要學習matplotlib。pyecharts:上面的兩個庫都是靜態的可視化庫,而pyecharts有很好的web兼容性,可以做到可視化的動態效果。並且種類也比較豐富。
  • R入門?從Tidyverse學起!
    這種入門的學習路徑屬於base R first,學習的流程基本是先了解變量的類型、數據的結構,再深入點就會學到循環與自定義函數。有些類似於先認識編程,再按照數據處理、可視化、統計分析等應用方向開始下一個學習的旅程。但是對於很多人來說,R僅僅是一個可視化工具,來做出漂亮的圖,或者是一個可以方便的做回歸分析,生存分析,顯著性檢驗的統計工具。
  • Tidy時代R語言學習的一些ABC
    因此,如何入門R語言,實際上就變成了如何入門tidyverse。cookbooktidyverse體系下的可視化工具以ggplot2作為基礎。關於ggplot2的圖書有很多,我選擇的這本R graphics cookbook (2018年第2版)以大量的案例詳細展示了ggplot2的各種基本做圖功能,常見的做圖問題差不多都包括進來了,非常適合在遇到問題的時候進行快速參考。缺點是對複雜圖形以及ggplot2基礎上的大量擴展工具介紹的不夠多。
  • 社會科學研究中的R語言與數據可視化系列直播課
    當今市場上的數據可視化工具有很多,包括EXCEL, SPSS等,但效果差強人意。再來看R語言,R語言最初是統計學家開發的,因此統計計算和數據可視化就成了可在R身上最深的烙印,這也是R語言核心功能的兩大方向。然而就目前來看,R語言的功能已經遠遠超出了它的初衷,可以在諸多領域進行,比如數據挖掘、社交網絡、金融數據分析等。
  • 從入門到精通,全球20個最佳大數據可視化工具!
    Visual.lyVisual.ly是一個可視化的內容服務。它提供專門的大數據可視化的服務,用戶包括了VISA,耐克,Twitter,福特和國家地理等。如果你想完全外包可視化文件給第三方。開源,只有11KB大小,這使得它快速且易於使用,它支持多種圖表類型: 餅圖,線性圖和雷達圖等。15.
  • 從入門到精通,全球20個最佳大數據可視化工具
    InfogramInfogram的最大優勢在於,讓您的可視化信息圖表與實時大數據相連結。只須三個簡單步驟,您可以選擇在眾多圖表,地圖,甚至是視頻可視化模板中進行選擇。 Infogram支持團隊帳號。3. ChartBlocks
  • 5分鐘入門 Seaborn 熱力圖可視化
    Seaborn是基於matplotlib的Python