Форматирование осей графиков в 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. Что метки даны для основных десятичных позиций (1.0, 0.1, 0.01, 0.001, 0.0001,...)

  2. Что тики должны быть нарисованы для 9 позиции между десятичными позициями (для области между 0.01 и 0.1 это будет 0.01, 0.02, 0.03,....)

  3. Что максимальный y-диапазон должен быть 0.5

Спасибо за помощь.

Свен

2 3

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()

Введите описание изображения здесь