我有一個用 facet_wrap 創建的圖形,可視化了許多組的估計密度。一些組的方差比其他組小得多。這導致某些面板無法讀取 x 軸。最小可重現示例:
library(tidyverse)
x1 <- rnorm(1e4)
x2 <- rnorm(1e4,mean=2,sd=0.00001)
data.frame(x=c(x1,x2),group=c(rep("1",length(x1)),rep("2",length(x2)))) %>%
ggplot(.) geom_density(aes(x=x)) facet_wrap(~group,scales="free")

該問題的明顯解決方案是增加圖形大小,以便一切都變得可讀。但是,面板太多,無法使其成為有用的解決方案。我最喜歡的解決方案是控制軸刻度的數量,例如在所有 x 軸上只允許兩個刻度。有沒有辦法做到這一點?
建議后編輯:
添加 scale_x_continuous(n.breaks = 2)看起來應該完全符合我的要求,但實際上并沒有:

按照建議的問題
uj5u.com熱心網友回復:
您可以添加if(seq[2]-seq[1] < 10^(-r)) seq else round(seq, r)到
正如您正確指出的那樣,這個答案只給出了數字位數的兩種選擇;所以另一種可能性是 return round(seq, -floor(log10(abs(seq[2]-seq[1])))),它獲得每個方面的“最佳”位數。
equal_breaks <- function(n = 3, s = 0.1,...){
function(x){
d <- s * diff(range(x)) / (1 2*s)
seq = seq(min(x) d, max(x)-d, length=n)
round(seq, -floor(log10(abs(seq[2]-seq[1]))))
}
}
data.frame(x=c(x1,x2,x3),group=c(rep("1",length(x1)),rep("2",length(x2)),rep("3",length(x3)))) %>%
ggplot(.) geom_density(aes(x=x)) facet_wrap(~group, scales="free")
scale_x_continuous(breaks=equal_breaks(n=3, s=0.1))

uj5u.com熱心網友回復:
非常感謝這么多有用的建議和很好的答案!我通過@ MAEL修改方法,并從RHertel借款的巨大作用想出了一個解決方案,為任意復雜的資料集作品(至少我希望如此),
為回答我自己的問題而道歉......但如果沒有社區的大力幫助,這是不可能的:-)
uj5u.com熱心網友回復:
實作您想要的結果的一種選擇是使用自定義中斷和限制函式,該函式scales::breaks_extended首先為范圍獲得漂亮的中斷,然后利用seq來獲得所需的中斷次數。然而,根據所需的休息次數,這種簡單的方法并不能確保我們最終得到漂亮的休息:
library(ggplot2)
set.seed(123)
x1 <- rnorm(1e4)
x2 <- rnorm(1e4,mean=2,sd=0.00001)
mylimits <- function(x) range(scales::breaks_extended()(x))
mybreaks <- function(n = 3) {
function(x) {
breaks <- mylimits(x)
seq(breaks[1], breaks[2], length.out = n)
}
}
d <- data.frame(x=c(x1,x2),group=c(rep("1",length(x1)),rep("2",length(x2))))
ggplot(d)
geom_density(aes(x=x))
scale_x_continuous(breaks = mybreaks(n = 3), limits = mylimits)
facet_wrap(~group,scales="free")

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371930.html
上一篇:在ggplot中為點添加垂直線
