[英]Logarithmic y-axis Tick Marks in R plot() or ggplot2()
我在本文中看到了log="y"
plot 的理想刻度标记结构,图 3b 3c 3d。
它有没有标签的短的、对数间隔的次要刻度线,以及带有标签的长的、对数间隔的主要刻度线。
有谁知道如何在R
中实现这一点?
在基础 R 中,只需根据需要构建轴。 这样的事情可能是一个开始。
set.seed(5)
d <- data.frame(x=1:100, y=rlnorm(100, meanlog=5, sdlog=3))
with(d, {
plot(x, y, log="y", yaxt="n")
y1 <- floor(log10(range(y)))
pow <- seq(y1[1], y1[2]+1)
ticksat <- as.vector(sapply(pow, function(p) (1:10)*10^p))
axis(2, 10^pow)
axis(2, ticksat, labels=NA, tcl=-0.25, lwd=0, lwd.ticks=1)
})
在lattice
中, latticeExtra
package 具有以下能力:
library(lattice)
library(latticeExtra)
xyplot(y~x, data=d, scales=list(y=list(log=10)),
yscale.components=yscale.components.log10ticks)
对于ggplot2
,您指定刻度的唯一选项似乎是size
(即宽度)。
# A plot of any old data
dfr <- data.frame(x = 1:100, y = rlnorm(100))
p <- ggplot(dfr, aes(x, y)) +
geom_point() +
scale_y_log10(breaks = breaks, labels = breaks)
#Tick locations
get_breaks <- function(x)
{
lo <- floor(log10(min(x, na.rm = TRUE)))
hi <- ceiling(log10(max(x, na.rm = TRUE)))
as.vector(10 ^ (lo:hi) %o% 1:9)
}
breaks <- get_breaks(dfr$y)
log10_breaks <- log10(breaks)
#Some bigger ticks
p + opts(axis.ticks = theme_segment(
size = ifelse(log10_breaks == floor(log10_breaks), 2, 1)
))
这已在 package::sfsmisc 中完成。 请参阅帮助中的示例(axTexpr)
这是一个ggplot2
解决方案:
library(ggplot2)
set.seed(20180407)
df = data.frame(x = seq(from = 1, by = 1, length.out = 20),
y = 2^(seq(to = 1, by = -1, length.out = 20) + rnorm(20, 0, 0.7)))
ggplot(data = df, aes(x = x, y = y)) +
geom_line() +
scale_y_log10() +
annotation_logticks(sides = "l")
您可以通过某些主题使它看起来比您链接到的论文更多:
ggplot(data = df, aes(x = x, y = y)) +
geom_line(colour = "blue") +
geom_point(colour = "blue") +
scale_y_log10() +
annotation_logticks(sides = "l") +
theme_minimal() +
theme(panel.grid = element_blank(),
axis.line = element_line(),
axis.ticks.x = element_line())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.