ggplot масштабирует ось x с выражением

Я хотел бы преобразовать график ggplot так, чтобы 0,9, 0,99, 0,999, 0,9999 и т. д. находились на одинаковом расстоянии друг от друга по оси x.

В следующем примере эти разрывы сгруппированы с правой стороны. Я хотел бы, чтобы более высокие значения были растянуты по оси x. Это было бы противоположностью логарифмической шкале, которая сжимает большие значения.

p <- seq(0.001, 1, 0.001)
d <- seq(1, 1000)
percentile <- data.frame(p, d)
g1 <- ggplot(percentile, aes(p, d))
g1 <- g1 + geom_point()
g1 <- g1 + scale_x_continuous(breaks=c(0,0.9,.9,.99,.999,.9999))
g1

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

Я думаю, мне нужно масштабировать ось x с помощью выражения вроде log(1/(1-p)), но я не уверен, как масштабировать произвольное выражение.


person oneself    schedule 04.11.2015    source источник
comment
Но тогда это была бы вогнутая кривая, а не линия.   -  person DatamineR    schedule 05.11.2015
comment
Да, конечно, но я думаю, что это нормально для моей цели.   -  person oneself    schedule 05.11.2015
comment
Вы видели мое решение ниже?   -  person Mike Wise    schedule 10.11.2015


Ответы (3)


Думал об этом. Подумайте, что вы хотите:

Этот код:

#Generate our Data

p <- seq(0.001, 1-0.001, 0.001)
sin_p <- sin(p*pi)
xin <- c( 0.5,0.9,0.99,0.999 )
lxin <- as.character(xin)
pctdf <- data.frame(p,sinp)

# Plot it in raw form
g1 <- ggplot(pctdf, aes(p, sin_p)) +
  geom_point() +
  geom_vline(xintercept=xin,color="red") +
  labs(title="Raw")+
  scale_x_continuous(breaks=xin,labels=xin) +
  theme(axis.text.x = element_text(size = rel(1.0),angle=-90,hjust=0))
g1 

дает:

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

А затем преобразуем его (используя обратную логистическую функцию (по основанию 10)):

# Now transform it
transform <- function(x){
  -log10(((1/x) - 1))
}
xin <- transform(xin)
pctdf$p <- transform(pctdf$p)

# Plot it

g2 <- ggplot(pctdf, aes(p, sin_p)) +
  geom_point() +
  geom_vline(xintercept=xin,color="red") +
  labs(title="Transformed")+
  scale_x_continuous(breaks=xin,labels=lxin) +
  theme(axis.text.x = element_text(size = rel(1.0),angle=-90,hjust=0))
g2

уступая:

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

person Mike Wise    schedule 08.11.2015
comment
Привет Майк, спасибо за ваш ответ. Это определенно достаточно близко к тому, что мне нужно. Я смог использовать ваше решение для создания того, что искал. Я собираюсь опубликовать код, который работал у меня для полноты картины. - person oneself; 10.11.2015

Используя ответ Майка Уайза ниже в качестве шаблона, я смог заставить это работать. Вот код, который я придумал:

transform <- function(x){
  log(1/(1-x))
}
p <- transform(seq(0.001, 1, 0.001))
d <- seq(1, 1000)
xin <- transform(c(0.5,0.9,0.99,0.999))
lxin <- as.character(c(0.5,0.9,0.99,0.999))
percentile <- data.frame(p, d)
g1 <- ggplot(percentile, aes(p, d))
g1 <- g1 + geom_point()
g1 <- g1 + scale_x_continuous(breaks=xin, labels=lxin)
g1

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

person oneself    schedule 10.11.2015

Удалите scale_x_continuous и используйте

g1 + scale_x_log10(breaks=c(0,0.9,.9,.99,.999,.9999))

Но у вас будут проблемы с breaks == 0 с log10(0) = -Inf

Например:

p <- seq(0.001, 1, 0.001)
d <- seq(1, 1000)
percentile <- data.frame(p, d)
g1 <- ggplot(percentile, aes(p, d))
g1 <- g1 + geom_point()
g1 <- g1 + scale_x_log10(breaks=c(0.9,.9,.99,.999,.9999)) + xlim(c(.9,1))

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

person Alex W    schedule 04.11.2015
comment
Спасибо, но я думаю, что это было бы противоположностью тому, что я хотел бы, поскольку логарифмическая шкала сгущает значения по мере увеличения, я хотел бы расширять их по мере их роста. - person oneself; 05.11.2015