gpt4 book ai didi

r - 基于值通过R中的ggmap生成空间热图

转载 作者:行者123 更新时间:2023-12-01 13:32:14 25 4
gpt4 key购买 nike

我想使用以下数据点生成区域分布图:

  • 经度
  • 纬度
  • 价格

  • 这是数据集 - https://www.dropbox.com/s/0s05cl34bko7ggm/sample_data.csv?dl=0

    我希望 map 显示价格较高和价格较低的区域。它很可能看起来像这样(示例图像):

    enter image description here

    这是我的代码:
    library(ggmap)

    map <- get_map(location = "austin", zoom = 9)
    data <- read.csv(file.choose(), stringsAsFactors = FALSE)
    data$average_rate_per_night <- as.numeric(gsub("[\\$,]", "",
    data$average_rate_per_night))
    ggmap(map, extent = "device") +
    stat_contour( data = data, geom="polygon",
    aes( x = longitude, y = latitude, z = average_rate_per_night,
    fill = ..level.. ) ) +
    scale_fill_continuous( name = "Price", low = "yellow", high = "red" )

    我收到以下错误消息:
    2: Computation failed in `stat_contour()`:
    Contour requires single `z` at each combination of `x` and `y`.

    我真的很感激有关如何修复此问题或生成此类热图的任何其他方法的任何帮助。请注意,我对 价格的权重感兴趣,而不是记录的密度。

    最佳答案

    如果您坚持使用轮廓方法,那么您需要为数据中的每个可能的 x,y 坐标组合提供一个值。为了实现这一点,我强烈建议对空间进行网格化并为每个 bin 生成一些汇总统计信息。

    我根据您提供的数据在下面附上一个工作示例:

    library(ggmap)
    library(data.table)

    map <- get_map(location = "austin", zoom = 12)
    data <- setDT(read.csv(file.choose(), stringsAsFactors = FALSE))

    # convert the rate from string into numbers
    data[, average_rate_per_night := as.numeric(gsub(",", "",
    substr(average_rate_per_night, 2, nchar(average_rate_per_night))))]

    # generate bins for the x, y coordinates
    xbreaks <- seq(floor(min(data$latitude)), ceiling(max(data$latitude)), by = 0.01)
    ybreaks <- seq(floor(min(data$longitude)), ceiling(max(data$longitude)), by = 0.01)

    # allocate the data points into the bins
    data$latbin <- xbreaks[cut(data$latitude, breaks = xbreaks, labels=F)]
    data$longbin <- ybreaks[cut(data$longitude, breaks = ybreaks, labels=F)]

    # Summarise the data for each bin
    datamat <- data[, list(average_rate_per_night = mean(average_rate_per_night)),
    by = c("latbin", "longbin")]

    # Merge the summarised data with all possible x, y coordinate combinations to get
    # a value for every bin
    datamat <- merge(setDT(expand.grid(latbin = xbreaks, longbin = ybreaks)), datamat,
    by = c("latbin", "longbin"), all.x = TRUE, all.y = FALSE)

    # Fill up the empty bins 0 to smooth the contour plot
    datamat[is.na(average_rate_per_night), ]$average_rate_per_night <- 0

    # Plot the contours
    ggmap(map, extent = "device") +
    stat_contour(data = datamat, aes(x = longbin, y = latbin, z = average_rate_per_night,
    fill = ..level.., alpha = ..level..), geom = 'polygon', binwidth = 100) +
    scale_fill_gradient(name = "Price", low = "green", high = "red") +
    guides(alpha = FALSE)

    enter image description here

    然后,您可以使用 bin 大小和轮廓 binwidth 来获得所需的结果,但您还可以在网格上应用平滑函数以获得更平滑的等高线图。

    关于r - 基于值通过R中的ggmap生成空间热图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319970/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com