正符号と負符号の裾が非常に重いデータの場合、単位区間の構造を隠さずにすべてのデータをプロットに表示したい場合があります。
Python で Matplotlib を使用してプロットする場合、ある間隔の外側で対数変換を使用し、その内側で線形プロットを使用するsymlog scaleを選択することで、これを実現できます。
以前の RI では、1 回限りのアークサインでデータを変換することにより、同様の動作を構築していました。ただし、目盛りラベルなどを正しく行うのは非常に難しいです (以下を参照)。
現在、ラティスまたはggplotでのサブセット化が非常に便利な一連のデータに直面しています。サブセット化のために Matplotlib を使用したくありませんが、確かにsymlogがありません。
編集:
ggplot が scales というパッケージを使用していることがわかります。これにより、この問題の多くが解決されます (機能する場合)。ただし、目盛りとラベルの配置を自動的に選択することは、まだかなり難しいように見えます。log_breaks
とcbreaks
おそらくのいくつかの組み合わせ?
編集2:
次のコードはそれほど悪くありません
sinh.scaled <- function(x,scale=1){ sinh(x)*scale }
asinh.scaled <- function(x,scale=1) { asinh(x/scale) }
asinh_breaks <- function (n = 5, scale = 1, base=10)
{
function(x) {
log_breaks.callable <- log_breaks(n=n,base=base)
rng <- rng <- range(x, na.rm = TRUE)
minx <- floor(rng[1])
maxx <- ceiling(rng[2])
if (maxx == minx)
return(sinh.scaled(minx, scale=scale))
big.vals <- 0
if (minx < (-scale)) {
big.vals = big.vals + 1
}
if (maxx>scale) {
big.vals = big.vals + 1
}
brk <- c()
if (minx < (-scale)) {
rbrk <- log_breaks.callable( c(-min(maxx,-scale), -minx ) )
rbrk <- -rev(rbrk)
brk <- c(brk,rbrk)
}
if ( !(minx>scale | maxx<(-scale)) ) {
rng <- c(max(minx,-scale), min(maxx,scale))
minc <- floor(rng[1])
maxc <- ceiling(rng[2])
by <- floor((maxc - minc)/(n-big.vals)) + 1
cb <- seq(minc, maxc, by = by)
brk <- c(brk,cb)
}
if (maxx>scale) {
brk <- c(brk,log_breaks.callable( c(max(minx,scale), maxx )))
}
brk
}
}
asinh_trans <- function(scale = 1) {
trans <- function(x) asinh.scaled(x, scale)
inv <- function(x) sinh.scaled(x, scale)
trans_new(paste0("asinh-", format(scale)), trans, inv,
asinh_breaks(scale = scale),
domain = c(-Inf, Inf))
}