ggmap + ggplot 不会绘制某些值

ggmap + ggplot will not plot certain values

我正在尝试获取一个空间数据集,旋转它,然后用 ggplot/ggmap 绘制它们。我已经包含了数据集、用于围绕原点旋转数据集的函数以及我希望使用的绘图方法。

library(ggplot2)
library(ggmap)
library(scales)
source("DEMOFunctions.R")

PlantLAT <- 39.28682
PlantLON <- -96.1172
Emissions <- 12591532084.8523
Resolution <- 0.1

DataPoints <- read.delim("JEC-10000m2.txt", header = TRUE, sep = "")
Origin_DataPoints <- ShiftToOrigin("S", DataPoints, PlantLAT, PlantLON)

Rotated_Origin_DataPoints <- RotateDispersion(Origin_DataPoints, 25)

Rotated_DataPoints <- ShiftToOrigin("U", Rotated_Origin_DataPoints, 
PlantLAT, PlantLON)

Quantiles <- quantile(DataPoints$CO2, c(0.1, 0.955))
qn01 <- rescale(c(Quantiles, range(DataPoints$CO2)))

map <- get_map(location = c(lon = -95, lat = 43), zoom = 6, maptype = 
"terrain", colo = "bw")

ggmap(map) +
  geom_raster(data = DataPoints, aes(x = LON, y = LAT, fill = CO2), 
  interpolate = TRUE) +
  geom_raster(data = Rotated_DataPoints, aes(x = LON, y = LAT, fill = CO2), 
  interpolate = TRUE) +
  scale_fill_gradientn(colours = colorRampPalette(c("limegreen", "yellow", 
  "orange", "red4"))(50),
                   values = c(0, seq(qn01[1], qn01[2], length.out = 2000), 
    1), 
                   limits = c(min(DataPoints$CO2), max(DataPoints$CO2)),
                   name = "Concentration (kg/cbm)",
                   guide = FALSE) +
  coord_cartesian() +
  theme_bw() +
  xlab("Longitude") +
  ylab("Latitude") +
  theme(strip.text.y = element_text(size = 20, colour = "black", face = 
  "bold", angle = -90)) +
  theme(plot.title = element_text(size = 30, face = "bold")) +
  theme(axis.text=element_text(size=15), 
    axis.title=element_text(size=25,face="bold")) +
    theme(axis.title.y = element_text(margin = margin(t = 10, r = 10, b = 
10, l = 10))) +
  theme(plot.margin=unit(c(1,1,1,1),"cm"))

我每次都能让 "DataPoints" 绘图,但旋转后的 "Rotated_DataPoints" 有时只能绘图;这取决于我旋转了多少。 (这可以通过 "RotateDispersion" 函数中包含的数字进行调整。)

我对这种不一致感到困惑。 (在之前的解决方案尝试中,我将旋转色散文件中的小数位数限制为 4 位,但这只是一个很小的改进,并且仍然存在绘图不一致的问题。)

可以找到 "JEC-10000m2.txt" 文件 here and the "DEMOFunctions.R" script can be found here。此脚本包含 "ShiftToOrigin" 和 "RotateDispersion" 函数。

在此先感谢您的帮助!对代码的格式和稀疏的注释感到抱歉。此代码旨在作为 "proof of concept" 运行.

当您旋转数据集时,x 轴或 y 轴上的相邻点可能变得非常靠近 geom_raster()(或 geom_tile()geom_raster() 只是一个特例)最终创建宽度/高度为 0 的图块。

让我们用一个简单的例子来说明:

library(dplyr)

set.seed(123)
orig <- data.frame(
  x = rep(1:5, each = 4),
  y = rep(1:4, 5),
  z = rpois(20, lambda = 5)
)

orig <- orig %>%
  mutate(t = case_when(x == 1 & y == 1 ~ "C1",
                       x == 1 & y == 4 ~ "C2",
                       x == 5 & y == 4 ~ "C3",
                       x == 5 & y == 1 ~ "C4",
                       TRUE ~ NA_character_))

旋转之前,情节是这样的(我为 4 个角添加了标签,以便更容易跟随旋转):

p.orig <- ggplot(orig, aes(x = x, y = y, fill = z, label = t)) +
  coord_fixed(xlim = c(0, 6), y = c(0, 5)) +
  theme_bw()

p.orig + geom_point(shape = 22, size = 10) + geom_text() + ggtitle("Unrotated points")

p.orig + geom_raster() + geom_text() + ggtitle("Unrotated raster")

我们可以看到数据点位于垂直于 x / y 轴的直线行和列中。 geom_raster 创建的相应图块相互接触得很好。

现在让我们稍微旋转数据框(我改编了RotateDispersion()函数中的相关代码):

theta = 5/100
rotated <- orig %>%
  mutate(y = x * sinpi(theta) + y * cospi(theta),
         x = x * cospi(theta) - y * sinpi(theta))

p.rot <- ggplot(rotated, aes(x = x, y = y, fill = z, label = t)) +
  coord_fixed(xlim = c(0, 5), y = c(0.5, 5.5)) +
  theme_bw()

p.rot + geom_point(shape = 22, size = 10) + geom_text() + ggtitle("Rotated points")
p.rot + geom_raster() + geom_text() + ggtitle("Rotated raster")

geom_points() 的绘图旋转后没有任何其他差异(点大小由 size = 10 明确控制),但 geom_raster() 绘图中的图块显着缩小。

仔细观察会发现每个图块的大小受每个轴上相邻数据点之间的距离限制。 (使用 Photoshop 添加的线条)

对于某些旋转角度(例如 theta = 25/100),geom_tile() 将 return 空白 canvas 因为每个图块的宽度和高度都被压缩为 0,而 geom_raster() 会抛出错误。

根据您的使用情况,geom_point() 可能比 geom_raster()geom_tile() 更好。