R - рассчитать вероятность и перевернуть ось x/y кумулятивной кривой (ECDF)

В R я построил кумулятивную кривую, используя функцию ecdf, чтобы показать площадь в зависимости от высоты. По умолчанию высота откладывается по оси x, площадь — по оси y, где высота указана в общих значениях (например, 1000–3000 м), а площадь — в вероятности (0,0–1,0).

  • Я также хотел бы показать высоту в процентах/вероятностях.

  • Я хотел бы перевернуть ось и визуализировать площадь по оси x и высоту по оси y.

Как я могу это сделать? Я не мог найти решение.

Это мой код:

library(rgdal)
setwd("G:/data")
raster <- readGDAL("elevation.tif")
plot(ecdf(raster$band1), main="Hypsometric curve")

person the_chimp    schedule 08.06.2018    source источник
comment
Здравствуйте, можете ли вы предоставить небольшой набор данных, чтобы люди могли воспроизвести вашу проблему? Например, уменьшите elevation.tif до размера игрушки (100x100 пикселей или около того), затем выполните readDGAL и используйте dput, чтобы преобразовать результат в текстовую форму, которую вы можете вставить сюда. Вы можете отредактировать свой вопрос, чтобы улучшить его.   -  person akraf    schedule 08.06.2018


Ответы (1)


Практически любое решение начинается с создания массива, представляющего все вершины графика. Они получаются путем извлечения координат из объекта ecdf. Чтобы проиллюстрировать, давайте сгенерируем некоторые данные.

n <- 32
k <- floor(n/2)
x <- 1 - runif(n)^2
x <- c(x, sample(x, k, replace=TRUE))

Вот стандартный расчет и график ECDF для справки:

f <- ecdf(x)
plot(f, main="Default Plot")

График ECDF

R предпочитает размещать данные в data.frame объектах. Вот один из способов. Обратите внимание, как диапазон данных немного расширен, чтобы показать естественные конечные точки кривой, которая начинается на уровне y=0 и заканчивается на уровне y=1:

expand <- function(x, f=1.05, ...) {# Expand a data range
  r <- range(x, ...)
  (r - mean(r)) * f + mean(r) 
}
X <- with(environment(f), {
  x.range <- expand(x)
  data.frame(x=c(x.range[1], x), 
             xend=c(x, x.range[2]),
             y=c(0, y),
             yend=c(0, y))
})

Имея эту удобную структуру данных X, остается только описать график. Я использую ggplot2 для этого:

library(ggplot2)
g.ECDF <- ggplot(X, aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_hline(yintercept=0:1, linetype=2, size=1.0, color="Gray") +
  geom_segment(color="#b0b0b0", size=0.8) +
  geom_point(data=X[-1,]) +
  xlab("Elevation") + ylab("Proportion of Total") + 
  ggtitle("Hypsometric Curve")

print(g.ECDF)

версия ECDF от ggplot2

А теперь совершенный удар: просто скажите ggplot2 переключить оси:

print(g.ECDF + coord_flip() + ggtitle("Axes Flipped"))

Перевернутый ECDF

person whuber    schedule 08.06.2018
comment
Работает отлично! Можно ли добавить вторую линию на график и если да, то как? - person the_chimp; 11.06.2018
comment
Конечно. Естественным способом использования ggplot2 является добавление фрейма данных к первому, используя еще одно поле для различения записей в двух наборах данных. Подробнее см. ggplot2.tidyverse.org/reference/index.html. - person whuber; 11.06.2018