ggplot2
已經(jīng)非常好用了,但是大家對(duì)美的追求是永無(wú)止境的,比如對(duì)于坐標(biāo)軸,有人可能更喜歡base r那種,base r的很多默認(rèn)圖形,坐標(biāo)軸都是分離的,比如這種:
barplot(c(20,30,40,50,60), names.arg = c(paste0('Col ',1:5)), col = "steelblue")
但ggplot2
不是這樣的,很多人看多了,又覺(jué)得還是默認(rèn)圖形好看,但是又苦于默認(rèn)圖形語(yǔ)法的難以理解和記憶。還有人想要分離的、成組的、截?cái)嗟淖鴺?biāo)軸等等。
很多擴(kuò)展包都實(shí)現(xiàn)了,而且功能更加強(qiáng)大。
x軸和y軸分開(kāi)/離斷式坐標(biāo)軸
ggprism實(shí)現(xiàn)
先介紹基于ggprism
的實(shí)現(xiàn)方式,這個(gè)包原本是用于模仿Graphpad Prism
的圖形風(fēng)格的,非常好用,我前面專(zhuān)門(mén)介紹過(guò),傳送門(mén):
讓ggplot2變成Graphpad Prism樣式:ggprism(01)
讓ggplot2變成Graphpad Prism樣式:ggprims(05)
library(ggprism)
library(ggplot2)
library(patchwork)
其中prism_offset
可以實(shí)現(xiàn)x軸和y軸分開(kāi);
通過(guò)prism_bracket
可以實(shí)現(xiàn)截?cái)嗍降淖鴺?biāo)軸,但是只能用于離散型變量。
# 橫坐標(biāo)
p1 <- ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
geom_jitter(aes(shape = factor(dose)), width = 0.2, size = 2) +
scale_shape_prism() +
theme_prism() +
theme(legend.position = "none") +
scale_y_continuous(limits = c(0, 40), guide = "prism_offset") # y軸和x軸分開(kāi)
p2 <- p1 + scale_x_discrete(guide = "prism_bracket")
p1 + p2
ggprism
的實(shí)現(xiàn)方式比較簡(jiǎn)單,主要是模仿在graphpad prism中的樣式。對(duì)于這類(lèi)需要個(gè)性化坐標(biāo)軸的操作,還是ggh4x
更加擅長(zhǎng)。
ggh4x實(shí)現(xiàn)
ggh4x
是通過(guò)修改guide()
函數(shù)實(shí)現(xiàn)的。
library(ggh4x)
g <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
theme(axis.line = element_line(colour = "black"))
g1 <- g + guides(x = "axis_truncated", y="axis_truncated")
g + g1
可以自定義坐標(biāo)軸截?cái)嗟奈恢茫?/p>
g + guides(x = guide_axis_truncated(trunc_lower = c(2, 4),
trunc_upper = c(3, 5)),
# 注意看y軸的斷線的長(zhǎng)短
y = guide_axis_truncated(trunc_lower = ~ .x - 1,
trunc_upper = ~ .x + 2)
)
雙坐標(biāo)軸
眾所周知,ggplot2
現(xiàn)在默認(rèn)支持雙坐標(biāo)軸了,ggh4x
為第2條坐標(biāo)軸添加了更多自定義選項(xiàng)。
# 雙向圖形分別添加坐標(biāo)軸
df <- data.frame(x = seq(-3, 3, length.out = 6), y = LETTERS[1:6])
ggplot(df, aes(x, y)) +
geom_col() +
scale_x_continuous(
breaks = -3:0, guide = "axis_truncated",
sec.axis = dup_axis(
breaks = 0:3, guide = "axis_truncated",name = "second x")
) +
theme(axis.line.x = element_line())
嵌套坐標(biāo)軸
對(duì)于有交互項(xiàng)的圖形,也增加了更多的自定義選項(xiàng)。
df <- data.frame(
item = c("Coffee", "Tea", "Apple", "Pear", "Car"),
type = c("Drink", "Drink", "Fruit", "Fruit", ""),
amount = c(5, 1, 2, 3, 1),
stringsAsFactors = FALSE
)
# 默認(rèn)情況
p1 <- ggplot(df, aes(interaction(item, type), amount)) +
geom_col()
# 使用ggh4x修改
p2 <- ggplot(df, aes(interaction(item, type), amount)) +
geom_col() +
guides(x = "axis_nested")
p1 + p2
對(duì)于這個(gè)嵌套坐標(biāo)軸,可以進(jìn)行非常多的細(xì)節(jié)修改,比如最常見(jiàn)的顏色、粗細(xì)等。
ggplot(df, aes(weave_factors(item, type), amount)) +
geom_col() +
guides(x = "axis_nested") +
theme(
axis.ticks = element_line(colour = "red"),
ggh4x.axis.nestline.x = element_line(size = 5),
ggh4x.axis.nesttext.x = element_text(colour = "blue")
)
當(dāng)然也是支持多重嵌套的。
df$type2 <- c(rep("Consumables", 4), "Vehicle")
df$appletea <- c("", rep("Ingredient of apple tea", 2), rep(NA, 2))
ggplot(df, aes(weave_factors(item, type, appletea, type2), amount)) +
geom_col() +
guides(x = "axis_nested")
就簡(jiǎn)單介紹到這里,其實(shí)還有很多細(xì)節(jié)可以修改,大家有興趣可以自己探索,這個(gè)包很厲害,它擴(kuò)展的很多細(xì)節(jié)修改可能不是那么優(yōu)雅,但是確實(shí)解決了很多用戶(hù)的痛點(diǎn)!