Форматирование осей графиков в г - PullRequest
3 голосов
/ 07 июня 2011

Я хочу построить бета-распределение в двойном логарифмическом графике.

x <- seq(0, 1, length=1001)
y <- dbeta(x, 0.1, 0.1)
plot(x, y, type="h", log="xy")

xtics установлены на

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

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

Sven

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Для точного управления осями, расположите их отдельно, поэтому сначала подавьте оси, используя аргумент 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 можно ответить таким же образом, вам просто нужно указать места для отметок, возможно установив аргумент аргумента 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()

, который производит:

plot produced by axis calls

Что касается вопроса 3, что вы подразумеваете под максимальным диапазоном?Вы можете установить пределы для оси Y, используя аргумент ylim, равный plot().Вы предоставляете пределы (минимальные и максимальные) следующим образом:

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

Но одного диапазона недостаточно для определения пределов, вам нужно указать нам одно из минимальных или максимальных значений, чтобы отобразитьна графике или фактическом диапазоне значений, которые вы хотите.

1 голос
/ 07 июня 2011

Попробуйте это:

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

enter image description here

...