2015-11-04 4 views
2

Я хотел бы преобразовать граф ggplot таким образом, чтобы 0,9, 0,99, 0,999, 0,9999 и т. Д. Находились на равных расстояниях друг от друга по оси x.шкала ggplot 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 

enter image description here

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

+0

Но тогда это будет вогнутой кривой, а не линия – DatamineR

+0

Да, конечно, но я думаю, что это хорошо для моей цели. – oneself

+0

Вы видели мое решение ниже? –

ответ

2

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

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 

enter image description here

+2

выглядит довольно хорошо. –

1

Удалить 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)) 

enter image description here

+0

Спасибо, но я думаю, что это было бы противоположностью того, что я хотел бы, поскольку масштаб журнала конденсирует ценности как растущие большие, я хотел бы расширить их по мере их роста. – oneself

2

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

Этот код:

#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 

выходы:

enter image description here

И тогда мы его трансформируют (используя логистическую функцию обратной (по основанию 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 

получают:

enter image description here

+0

Не то, что вы хотели? –

+0

Привет, Майк, спасибо за ваш ответ. Это определенно достаточно близко к тому, что мне нужно. Я смог использовать ваше решение для создания той, которую я искал. Я собираюсь опубликовать код, который работал для меня для полноты. – oneself

 Смежные вопросы

  • Нет связанных вопросов^_^