R - 计算概率并翻转累积曲线 (ECDF) 的 x/y 轴
R - calculate probability and flip x/y axis of cumulative curve (ECDF)
在 R 中,我使用 ecdf 函数绘制了一条累积曲线,以显示面积与海拔的关系。默认情况下,高程绘制在 x 轴上,面积绘制在 y 轴上,其中高程以总值(例如 1000-3000m)给出,面积以概率(0.0-1.0)给出。
我也想在 percentage/probability 值中显示高度。
我想翻转轴并可视化 x 轴上的区域和 y 轴上的高程。
我该怎么做?我找不到解决方案。
这是我的代码:
library(rgdal)
setwd("G:/data")
raster <- readGDAL("elevation.tif")
plot(ecdf(raster$band1), main="Hypsometric curve")
几乎任何解决方案都将首先创建一个表示图中所有顶点的数组。它们是通过从 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")
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)
现在,致命一击:只需告诉 ggplot2
切换坐标轴即可:
print(g.ECDF + coord_flip() + ggtitle("Axes Flipped"))
在 R 中,我使用 ecdf 函数绘制了一条累积曲线,以显示面积与海拔的关系。默认情况下,高程绘制在 x 轴上,面积绘制在 y 轴上,其中高程以总值(例如 1000-3000m)给出,面积以概率(0.0-1.0)给出。
我也想在 percentage/probability 值中显示高度。
我想翻转轴并可视化 x 轴上的区域和 y 轴上的高程。
我该怎么做?我找不到解决方案。
这是我的代码:
library(rgdal)
setwd("G:/data")
raster <- readGDAL("elevation.tif")
plot(ecdf(raster$band1), main="Hypsometric curve")
几乎任何解决方案都将首先创建一个表示图中所有顶点的数组。它们是通过从 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")
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)
现在,致命一击:只需告诉 ggplot2
切换坐标轴即可:
print(g.ECDF + coord_flip() + ggtitle("Axes Flipped"))