Форматирование осей графиков в r
Я хочу построить бета-распределение в двойном логарифмическом графике.
x <- seq(0, 1, length=1001)
y <- dbeta(x, 0.1, 0.1)
plot(x, y, type="h", log="xy")
Значения XT задаются в
0.001
0.005
0.01 (without label)
0.05
0.1 (without label)
0.5
1 (without label)
Как я могу определить:
-
Что метки даны для основных десятичных позиций (1.0, 0.1, 0.01, 0.001, 0.0001,...)
-
Что тики должны быть нарисованы для 9 позиции между десятичными позициями (для области между 0.01 и 0.1 это будет 0.01, 0.02, 0.03,....)
-
Что максимальный y-диапазон должен быть 0.5
Спасибо за помощь.
Свен
2 ответа:
Для точного управления осями постройте их отдельно, поэтому сначала подавите оси с помощью аргумента
axes = FALSE
в вызовеplot()
:plot(x, y, type="h", log="xy", axes = FALSE)
Затем добавьте оси, как вы хотите их
axis(side = 1, at = (locs <- 1/c(1,10,100,1000)), labels = locs) axis(side = 2) box()
На вопрос 2 можно ответить таким же образом, вам просто нужно указать места для галочек, возможно, установив аргумент argument
tcl
в вызовеaxis()
немного меньше, чем по умолчанию (который является-0.5
). Хитрость заключается в создании мелких тиков, которые вы хотите. Мне оставалось только подойти. с этим:foo <- function(i, x, by) seq(x[i,1], x[i, 2], by = by[i]) locs2 <- unlist(lapply(seq_along(locs[-1]), FUN = foo, x= embed(locs, 2), by = abs(diff(locs)) / 9))
Или
locs2 <- c(outer(1:10, c(10, 100, 1000), "/"))
Которые оба дают:
R> locs2 [1] 0.100 0.200 0.300 0.400 0.500 0.600 0.700 0.800 0.900 1.000 0.010 0.020 [13] 0.030 0.040 0.050 0.060 0.070 0.080 0.090 0.100 0.001 0.002 0.003 0.004 [25] 0.005 0.006 0.007 0.008 0.009 0.010
Мы используем их через другой вызов
axis()
:axis(side = 1, at = locs2, labels = NA, tcl = -0.2)
Мы подавляем метки здесь, используя
labels = NA
. Вам просто нужно решить, как сделать векторы дляat
...Сложив два шага вместе, мы имеем:
plot(x, y, type="h", log="xy", axes = FALSE) axis(side = 1, at = (locs <- 1/c(1,10,100,1000)), labels = locs) axis(side = 1, at = locs2, labels = NA, tcl = -0.3) axis(side = 2) box()
Который производит:
Что касается вопроса 3, что вы имеете в виду под максимальным диапазоном? Вы можете установить ограничения на оси y с помощью аргументаylim
, чтобыplot()
. Вы предоставляете ограничения (min и max) такplot(x, y, type="h", log="xy", axes = FALSE, ylim = c(0.2, 1)) axis(side = 1, at = (locs <- 1/c(1,10,100,1000)), labels = locs) axis(side = 2) box()
Но диапазон сам по себе не достаточен для определения границ, вам нужно будет сообщить нам одно из минимальных или максимальных значений, чтобы показать на графике или фактический диапазон значений, которые вы хотите.
Попробуйте это:
library(sfsmisc) x <- seq(0, 1, length=1001) y <- dbeta(x, 0.1, 0.1) plot(x, y, type="h", log="xy", xaxt="n", yaxt="n", ylim=c(0.01, 0.5), main="Title") atx <- c(0.0001, 0.001, 0.01, 0.1, 1, 10, 100) eaxis(1, at=atx, labels=format(atx, drop0trailing=TRUE, scientific=FALSE), drop.1=FALSE, small.mult=10 ) aty <- c(0.01, 0.1, 0.5, 1, 10, 100) eaxis(2, at=aty, labels=format(aty, drop0trailing=TRUE, scientific=FALSE), drop.1=FALSE, small.mult=10 ) grid()