【问题标题】:R - calculate probability and flip x/y axis of cumulative curve (ECDF)R - 计算概率并翻转累积曲线 (ECDF) 的 x/y 轴
【发布时间】:2018-06-08 21:28:34
【问题描述】:

在 R 中,我使用 ecdf 函数绘制了一条累积曲线,以显示面积与海拔的关系。默认情况下,高程绘制在 x 轴上,区域绘制在 y 轴上,其中高程以总值(例如 1000-3000m)和概率区域(0.0-1.0)给出。

  • 我也想以百分比/概率值显示高程。

  • 我想翻转轴并可视化 x 轴上的区域和 y 轴上的高度。

我该怎么做?我找不到解决方案。

这是我的代码:

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

【问题讨论】:

  • 您好,您能否提供一个小型数据集,以便人们可以重现您的问题?例如,将elevation.tif 缩小到玩具大小(100x100 像素左右),然后执行readDGAL 并使用dput 将结果转换为文本形式,您可以将其粘贴到此处。你可以edit你的问题来改进它。

标签: r ecdf


【解决方案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")

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

【讨论】:

  • 工作得很好!是否可以在图表中添加第二条线,如果可以,如何?
  • 当然。使用ggplot2 的自然方法是将数据框附加到第一个数据框,再使用一个字段来区分两个数据集中的记录。详情请见ggplot2.tidyverse.org/reference/index.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多