[英]how to set limits on rounded facet wrap y axis?
我有這個情節,我需要圍繞y軸,所以看起來是可以接受的除了我想不只是在y軸上顯示1值的事實。 我想在“scale_y_continuous”函數中添加“limit”,以便每個facet圖的限制對於各個facet是唯一的。
這里是僅在y軸上顯示60和80的圖
dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))
ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group
geom_line() + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
scale_y_continuous(breaks = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 ),
labels = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 )
) +
facet_wrap(~group ,ncol=2, scales = "free_y")
現在我在比例y連續中添加限制,它全局應用限制。
dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))
ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group
geom_line() + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
scale_y_continuous(breaks = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 ),
labels = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 ),
# limits = c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )
#limits = c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )
limits = c( floor( min(dat$A_low) /10)*10 ,ceiling(max(dat$A_up)/10)*10 )
) +
facet_wrap(~group ,ncol=2, scales = "free_y")
即
c( floor( min(dat$A_low) /10)*10 ,ceiling(max(dat$A_up)/10)*10 )
是50和90
但是我希望限制對於每個方面的情節都是獨一無二的
所以正確的情節將有限制
c( floor( min(dat$A_low[dat$group =="y"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="y"])/10)*10 )
50和70
而左圖將有限制
c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )
70和90
如何將限制調整為特定於各個方面圖?
dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))
dat <- data.table(dat)
dat[, y_min := floor( min(A_low) /10)*10, by = group]
dat[, y_max := ceiling(max(A_up)/10)*10 , by = group]
ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group
geom_line() + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
scale_y_continuous(breaks = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 ),
labels = seq( floor( (min(dat$A_low)-11) /10)*10 ,
ceiling( (max(dat$A_up)+11) /10)*10,10 )
) +
facet_wrap(~group ,ncol=2, scales = "free_y") +
geom_blank(aes(y = y_min)) + geom_blank(aes(y = y_max))
所以在這里我使用data.table by = group
來為每個組創建y_min
和y_max
。 然后在geom_blank
使用這些值來擴展繪圖區域。
顯然,這可以自動擴展到任意數量的組/方面。
一種選擇是分別制作每個刻面,然后將它們拼接在一起。 這有一個額外的好處,你可以使用10以外的其他東西進行中斷排序(例如,如果你的一個組跨越100到1000,你可以用200而不是一點點修補)。
首先,我正在創建一個計算休息時間的函數。 (如果您想要不同范圍的不同比例,則可以修改此功能。)
myBreaks <- function(x){
seq(floor( (min(x) ) /10)*10 ,
ceiling( (max(x) ) /10)*10,
10 )
}
然后,使用lapply
從每個組的數據子集繪制一個圖:
sepPlots <- lapply(levels(dat$group), function(thisGroup){
ggplot(data= dat[dat$group == thisGroup, ],
aes(x=as.factor(x), y=A, group = 1)) +
geom_line() + geom_point() +
geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
scale_y_continuous(breaks = myBreaks,
limits = range(myBreaks(dat[dat$group == thisGroup, c("A_up", "A_low")]))
) +
facet_wrap(~group)
})
請注意,我仍然使用facet_wrap
來獲得情節上方的strip
標題,但如果您更喜歡這種樣式,則可以使用ggtitle
。
然后,使用plot_grid
的cowplot
將所有東西縫合在一起。 請注意,如果您加載cowplot
它會設置它自己的默認主題。 要還原,請使用theme_set(theme_gray())
cowplot::plot_grid(plotlist = sepPlots)
給
cowplot
有很好的記錄,因此當您擴展到更多組時,您應該能夠根據需要調整繪圖。
我沒有安裝ggplot,但也許一個簡單的if () else
可以解決你的問題。 我的第一次嘗試是這樣的:
if {
(dat$group =="y") c( floor( min(dat$A_low[dat$group =="y"]) /10)*10, ceiling(max(dat$A_up[dat$group =="y"])/10)*10 )
else c( floor( min(dat$A_low[dat$group =="z"]) /10)*10, ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.