gpt4 book ai didi

r - 为什么 geom_tile 会绘制我的数据的一个子集,而不是更多?

转载 作者:行者123 更新时间:2023-12-03 18:11:23 24 4
gpt4 key购买 nike

我正在尝试绘制 map ,但我无法弄清楚为什么以下内容不起作用:

这是一个最小的例子

testdf <- structure(list(x = c(48.97, 44.22, 44.99, 48.87, 43.82, 43.16, 38.96, 38.49, 44.98, 43.9), y = c(-119.7, -113.7, -109.3, -120.6,  -109.6, -121.2, -114.2, -118.9, -109.7, -114.1), z = c(0.001216,  0.001631, 0.001801, 0.002081, 0.002158, 0.002265, 0.002298, 0.002334, 0.002349, 0.00249)), .Names = c("x", "y", "z"), row.names = c(NA, 10L), class = "data.frame")

这适用于 1-8 行:
ggplot(data = testdf[1,], aes(x,y,fill = z)) + geom_tile()
ggplot(data = testdf[1:8,], aes(x,y,fill = z)) + geom_tile()

但不适用于 9 行:
ggplot(data = testdf[1:9,], aes(x,y,fill = z)) + geom_tile()

最终,我正在寻找一种在非常规网格上绘制数据的方法。我使用 geom_tile 不是必需的,但是点上的任何空间填充插值都可以。

完整数据集以 gist 形式提供
testdf上面是完整数据集的一个小子集,美国的高分辨率栅格(> 7500 行)
require(RCurl) # requires libcurl; sudo apt-get install libcurl4-openssl-dev
tmp <- getURL("https://gist.github.com/raw/4635980/f657dcdfab7b951c7b8b921b3a109c7df1697eb8/test.csv")
testdf <- read.csv(textConnection(x))

我尝试过的:
  • 使用 geom_point 有效,但没有达到预期的效果:
    ggplot(data = testdf, aes(x,y,color=z)) + geom_point()
  • 如果我将 x 或 y 转换为向量 1:10,则绘图按预期工作:
    newdf <- transform(testdf, y =1:10)

    ggplot(data = newdf[1:9,], aes(x,y,fill = z)) + geom_tile()

    newdf <- transform(testdf, x =1:10)
    ggplot(data = newdf[1:9,], aes(x,y,fill = z)) + geom_tile()

  • sessionInfo()R version 2.15.2 (2012-10-26) Platform: x86_64-pc-linux-gnu (64-bit)


    > attached base packages: [1] stats graphics grDevices utils
    > datasets methods base

    > other attached packages: [1] reshape2_1.2.2 maps_2.3-0
    > betymaps_1.0 ggmap_2.2 ggplot2_0.9.3

    > loaded via a namespace (and not attached): [1] colorspace_1.2-0
    > dichromat_1.2-4 digest_0.6.1 grid_2.15.2
    > gtable_0.1.2 labeling_0.1 [7] MASS_7.3-23
    > munsell_0.4 plyr_1.8 png_0.1-4
    > proto_0.3-10 RColorBrewer_1.0-5 [13] RgoogleMaps_1.2.0.2
    > rjson_0.2.12 scales_0.2.3 stringr_0.6.2
    > tools_2.15.2

    最佳答案

    不能使用的原因geom_tile() (或者更合适的 geom_raster() 是因为这两个 geoms 依赖于您的切片均匀分布,而它们不是。您需要将数据强制转换为点,然后将这些重新采样为均匀分布的栅格,然后您可以使用 geom_raster() 绘图。您必须接受您需要对原始数据稍微重新采样才能按您的意愿绘制此图。

    您还应该阅读 raster:::projectionrgdal:::spTransform有关 map 投影的更多信息。

    require( RCurl )
    require( raster )
    require( sp )
    require( ggplot2 )
    tmp <- getURL("https://gist.github.com/geophtwombly/4635980/raw/f657dcdfab7b951c7b8b921b3a109c7df1697eb8/test.csv")
    testdf <- read.csv(textConnection(tmp))
    spdf <- SpatialPointsDataFrame( data.frame( x = testdf$y , y = testdf$x ) , data = data.frame( z = testdf$z ) )

    # Plotting the points reveals the unevenly spaced nature of the points
    spplot(spdf)

    enter image description here
    # You can see the uneven nature of the data even better here via the moire pattern
    plot(spdf)

    enter image description here
    # Make an evenly spaced raster, the same extent as original data
    e <- extent( spdf )

    # Determine ratio between x and y dimensions
    ratio <- ( e@xmax - e@xmin ) / ( e@ymax - e@ymin )

    # Create template raster to sample to
    r <- raster( nrows = 56 , ncols = floor( 56 * ratio ) , ext = extent(spdf) )
    rf <- rasterize( spdf , r , field = "z" , fun = mean )

    # Attributes of our new raster (# cells quite close to original data)
    rf
    class : RasterLayer
    dimensions : 56, 135, 7560 (nrow, ncol, ncell)
    resolution : 0.424932, 0.4248191 (x, y)
    extent : -124.5008, -67.13498, 25.21298, 49.00285 (xmin, xmax, ymin, ymax)

    # We can then plot this using `geom_tile()` or `geom_raster()`
    rdf <- data.frame( rasterToPoints( rf ) )
    ggplot( NULL ) + geom_raster( data = rdf , aes( x , y , fill = layer ) )

    enter image description here
    # And as the OP asked for geom_tile, this would be...
    ggplot( NULL ) + geom_tile( data = rdf , aes( x , y , fill = layer ) , colour = "white" )

    enter image description here

    当然,我应该补充一点,这些数据毫无意义。您真正必须做的是获取 SpatialPointsDataFrame,为其分配正确的投影信息,然后通过 spTransform 转换为经纬度坐标,然后对转换后的点进行光栅化。实际上,您需要了解有关栅格数据的更多信息。你在这里得到的是一个近似值,但最终它不是数据的真实反射(reflect)。

    关于r - 为什么 geom_tile 会绘制我的数据的一个子集,而不是更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512381/

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