我有一个正态分布图和一个直方图,x轴以对数刻度显示0,10 ^ 0,10 ^ 1 ...我想在主要的之间包括小刻度。实际上我能够使用我previous question中给出的解决方案将主要的刻度格式从1,2,3等改为10 ^ 0,10 ^ 1,10 ^ 2,10 ^ 3。我使用以下代码作为主要标记:
major.ticks <- axTicks(1)
labels <- sapply(major.ticks,function(i)
as.expression(bquote(10^ .(i)))
)
axis(1,at=major.ticks,labels=labels)
这可以编辑为只标记次要刻度而不标记它们吗?
答案 0 :(得分:11)
包minor.tick
中有一个函数Hmisc
,但是那个函数与对数尺度相差很小。我使用以下函数来获得遵循对数标度的次要标记。 ax
是您使用它的轴(与函数axis
相同),n
是次刻度的数量(默认为9),t.ratio
是比率在主要和次要刻度之间,使用...
,您可以将额外参数传递给axis
编辑:评论中的好主意,所以我编辑了我的功能。有两个额外参数,mn
和mx
用于最小值,最大在对数刻度(mn=0
因此意味着最小值为10 ^ 0或1 !)
功能:
minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){
lims <- par("usr")
if(ax %in%c(1,3)) lims <- lims[1:2] else lims[3:4]
major.ticks <- pretty(lims,n=5)
if(missing(mn)) mn <- min(major.ticks)
if(missing(mx)) mx <- max(major.ticks)
major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx]
labels <- sapply(major.ticks,function(i)
as.expression(bquote(10^ .(i)))
)
axis(ax,at=major.ticks,labels=labels,...)
n <- n+2
minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1]
minors <- minors[-c(1,n)]
minor.ticks = c(outer(minors,major.ticks,`+`))
minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx]
axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE)
}
这可以按如下方式应用:
x <- 10^(0:8)
y <- 1:9
plot(log10(x),y,xaxt="n",xlab="x",xlim=c(0,9))
minor.ticks.axis(1,9,mn=0,mx=8)
给予:
答案 1 :(得分:4)
这是一个简单的功能:
log10.axis <- function(side, at, ...) {
at.minor <- log10(outer(1:9, 10^(min(at):max(at))))
lab <- sapply(at, function(i) as.expression(bquote(10^ .(i))))
axis(side=side, at=at.minor, labels=NA, tcl=par("tcl")*0.5, ...)
axis(side=side, at=at, labels=lab, ...)
}
以下是一个例子:
x <- exp(rnorm(200, 5))
hist(log(x), 20, xaxt="n", xlim=c(0, 8))
log10.axis(1, at=seq(0, 8, 2))
答案 2 :(得分:1)
在包magicaxis中尝试magaxis
。
答案 3 :(得分:1)
minorAxis
程序包中有一个StratigrapheR
函数,可用于任何类型的小刻度。它可以与seq_log
函数一起使用以进行对数刻度:
library(StratigrapheR)
x <- exp(rnorm(200, 5))
hist(log10(x), 20, xaxt="n", xlim=c(0, 4), xlab = "x", main = "Logarithmic Histogram of x")
ticks <- seq_log(10^0,10^4, divide = T)
lab <- sapply(0:4, function(i) as.expression(bquote(10^ .(i))))
minorAxis(1, at.maj = log10(ticks[[1]]), at.min = log10(ticks[[2]]), labels = lab)
答案 4 :(得分:0)
使用""
作为次要标记的标签。
答案 5 :(得分:0)
发生了一个小错误,
lims<-lims[3:4]
失踪
minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){
lims <- par("usr")
if(ax %in%c(1,3)) lims <- lims[1:2] else lims <- lims[3:4]
major.ticks <- pretty(lims,n=5)
if(missing(mn)) mn <- min(major.ticks)
if(missing(mx)) mx <- max(major.ticks)
major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx]
labels <- sapply(major.ticks,function(i)
as.expression(bquote(10^ .(i)))
)
axis(ax,at=major.ticks,labels=labels,...)
n <- n+2
minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1]
minors <- minors[-c(1,n)]
minor.ticks = c(outer(minors,major.ticks,`+`))
minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx]
axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE)
}
答案 6 :(得分:0)
在ggplot2
中,我们可以将annotation_logticks
与scales::trans_breaks
和scales::trans_format
一起使用。以下是从上面的链接中获取的示例。
library(ggplot2)
a <- ggplot(msleep, aes(bodywt, brainwt)) +
geom_point(na.rm = TRUE) +
scale_x_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10", scales::math_format(10^.x))
) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10", scales::math_format(10^.x))
) +
theme_bw()
a + annotation_logticks() # Default: log ticks on bottom and left
答案 7 :(得分:0)
此页第一张图中的x轴标签有误。 次刻度线分布不正确。