簡體   English   中英

將具有密度的 y 軸添加到脊線圖

[英]Add a y-axis with density to ridgeline plot

我很難在描述密度的山脊線圖中添加 y 軸。 如果我猜對了,山脊線圖是一種密度圖。 我用它代替箱線圖,還包括分位數線。 我喜歡它的樣子,但是我的主管沒有看到與箱線圖相比的好處,並且一直希望我包含一個 y 軸和密度。 是否可以添加它,或者我是否必須使用密度圖,我是否有可能像geom_density_ridges那樣將它們排列得漂亮? 這是我的情節之一: 在此處輸入圖片說明 這是一個可重現的示例:

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  geom_density_ridges(scale = 0.9) +
  theme_ridges() + 
  theme(legend.position = "none")

非常感謝!

一種選擇是讓您通過facet_grid_wrap以及一些額外的樣式進行繪圖,例如擺脫條形文本和面板之間的間距:

library(ggplot2)
library(ggridges)

ggplot(diamonds, aes(x = price, fill = cut)) +
  geom_density() +
  scale_y_continuous(expand = expansion(mult = c(0, .2))) +
  facet_grid(cut~., switch = "y") +
  xlim(-1000, NA) +
  theme_ridges() + 
  theme(legend.position = "none", 
        strip.text.x = element_blank(),
        strip.text.y.left = element_text(angle = 0, vjust = 0.01),
        strip.background.y = element_rect(fill = NA),
        strip.placement = "outside",
        panel.grid.major.y = element_blank(),
        panel.spacing.y = unit(0, "pt"))

我只是要繼續說這是一個糟糕而笨拙的解決方案,但我已經花時間了,那么為什么不發布呢? 誰知道; 這樣的黑客可能對其他人很方便。

計划是:我們將半手動地復制 ggridges 所做的事情,但是在 vanilla ggplot2 中並且以連續的規模進行。 為此,我們將濫用after_stat()函數來 (1) 用密度填充色帶和 (2) 為我們自己超級分配最大密度,我們將其用作偏移量。

library(ggplot2)

g <- ggplot(diamonds, aes(x = price, fill = cut)) +
  stat_density(
    geom = "ribbon", position = "identity",
    aes(ymax = after_stat(density + (group - 1) * max(density)),
        ymin = after_stat((group - 1) * {yoffset <<- max(density)}))
  )

整個計划的缺陷是我們事先不知道偏移量,因此我們需要至少構建一次圖才能實際使用它。

build <- ggplot_build(g)

最后,我們將非常手動地在比例尺上分配正確的值。 我們將對離散標簽使用主要標簽,對連續標簽使用次要標簽。 您可以查看現在應該在您的全局環境中的yoffset值,以了解正確的中斷和標簽是什么。

g + scale_y_continuous(
    breaks = yoffset * (4:0), labels = levels(diamonds$cut),
    sec.axis = dup_axis(
      breaks = rep(yoffset * (0:4), 4) + rep(seq(0, 0.0003, by = 0.0001), each = 5),
      labels = rep(seq(0, 0.0003, by = 0.0001), each = 5)
    )
  )

reprex 包(v1.0.0) 於 2021 年 7 月 15 日創建

一種更通用的設置中斷/標簽的方法:

levels <- levels(diamonds$cut)
labels <- scales::extended_breaks(3)(c(0, yoffset * 0.8))
offsets <- yoffset * (seq(length(levels), 1) - 1)

g + scale_y_continuous(
    breaks = offsets, labels = levels,
    sec.axis = dup_axis(
      breaks = rep(offsets, length(labels)) + rep(labels, each = length(offsets)),
      labels = rep(labels, each = length(offsets))
    )
  )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM