scale transformation中的trans
參數(shù)
以可視化log轉(zhuǎn)換的結(jié)果為例說明ggplot2是如何實(shí)現(xiàn)的:
# mpg為original data , p0為original data的可視化 帆卓,p1和p2為兩種實(shí)現(xiàn)方式
p0 <- ggplot(mpg,aes(displ,cty)) + geom_point() + labs(title="original mpg")
p1 <- ggplot(mpg,aes(displ,log10(cty))) + geom_point() + labs(title="change mpg")
p2 <- ggplot(mpg,aes(displ,cty)) + geom_point() + scale_y_continuous(trans="log10") + labs(title="scale transformation")
p3 <- ggplot(mpg,aes(displ,cty)) + geom_point() + coord_trans(x="log10",y="log10") + labs(title="coord_trans()")
ggpubr::ggarrange(p0,p1,p2,p3,ncol=1)
p1
和p2
除了縱坐標(biāo)labels泉手,其他看起來一模一樣。兩者的區(qū)別是:相對(duì)于p0
送滞,p1
直接對(duì)original data(mpg
)進(jìn)行transformat(改變了original data)寸谜,p2
通過scale進(jìn)行transformat(不改變original data)肚菠。
總結(jié)下來是:要實(shí)現(xiàn)坐標(biāo)軸的log轉(zhuǎn)換,對(duì)data進(jìn)行l(wèi)og轉(zhuǎn)換是必須的菱阵。p1
和p2
的區(qū)別其實(shí)是可視化實(shí)現(xiàn)方式(顯式轉(zhuǎn)換和隱式轉(zhuǎn)換)的區(qū)別踢俄。在log轉(zhuǎn)換后的可視化結(jié)果中,坐標(biāo)軸相同breaks處只是labels的區(qū)別晴及,實(shí)際對(duì)應(yīng)的數(shù)值是相同的褪贵,也就是對(duì)p2
來說,真實(shí)的數(shù)值被帶上了"面具"抗俄,”面具“與真實(shí)數(shù)值之間是一一對(duì)應(yīng)關(guān)系脆丁。
為什么推薦p2
?便于與p0
比較动雹,可以看到log轉(zhuǎn)換后哪些更細(xì)微的差別被顯示出來槽卫。
you use a transformed scale, the axes will be labelled in the original data space; if you transform the data, the axes will be labelled in the transformed space
相對(duì)于p0
,p3
所做的事情是original data不變胰蝠,使坐標(biāo)軸不再是一個(gè)線性數(shù)軸歼培,而是經(jīng)過log轉(zhuǎn)換的數(shù)軸,因此這種轉(zhuǎn)換可能會(huì)改變幾何對(duì)象的形狀茸塞。另外躲庄,breaks的位置會(huì)變,但實(shí)際對(duì)應(yīng)的值钾虐,也就是labels跟p0
是一樣的噪窘。
Regardless of which method you use, the transformation occurs before any statistical summaries. To transform after statistical computation use coord_trans()
在少數(shù)情況下,ggplot2為了簡化效扫,提供了幾種常用transformation的函數(shù):scale_x/y_log10()
倔监、scale_x/y_reverse()
、scale_x/y_sqrt()
菌仁。所以以下命令等價(jià):
p4 <- ggplot(mpg,aes(displ,cty)) + geom_point() + scale_x_log10()
p5 <- ggplot(mpg,aes(displ,cty)) + geom_point() + scale_x_continuous(trans="log10")
trans
參數(shù)的可選項(xiàng)如下:
transformation由transfer執(zhí)行来吩,一個(gè)transfer描述transformation及其逆轉(zhuǎn)換以及如何繪制labels荸实。以下命令等價(jià):
p5 <- ggplot(mpg,aes(displ,cty)) + geom_point() + scale_x_continuous(trans="log10")
p6 <- ggplot(mpg,aes(displ,cty)) + geom_point() + scale_x_continuous(trans=scales::log10_trans())
可以用trans_new()
構(gòu)建自己的transfer:
trans_new(
name, # transformation name
transform, # 函數(shù)或函數(shù)名睡毒,用來執(zhí)行transformation
inverse, # 函數(shù)或函數(shù)名生巡,用來執(zhí)行逆轉(zhuǎn)換
breaks = extended_breaks(), # default breaks function
minor_breaks = regular_minor_breaks(), # default minor breaks function
format = format_format(), # default format
domain = c(-Inf, Inf)
)
查看log_trans()
的源代碼:
> log_trans
function (base = exp(1))
{
force(base)
trans <- function(x) log(x, base)
inv <- function(x) base^x
trans_new(paste0("log-", format(base)), trans, inv, log_breaks(base = base),
domain = c(1e-100, Inf))
}