ggmap + ggplot不会绘制某些值

时间:2017-10-17 19:12:18

标签: r plot ggplot2 geospatial ggmap

我正在尝试拍摄空间数据集,旋转它,并使用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"))

我可以得到&#34; DataPoints&#34;每次都要绘制但是旋转的&#34; Rotated_DataPoints&#34;有时候只有情节;这取决于我旋转多少。 (这可以通过&#34; RotateDispersion&#34;功能中包含的数字进行调整。)

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

&#34; JEC-10000m2.txt&#34;文件可以找到here和&#34; DEMOFunctions.R&#34;脚本可以找到here。这个脚本包含&#34; ShiftToOrigin&#34;和&#34; RotateDispersion&#34;功能

提前感谢您的帮助!很抱歉代码格式和稀疏评论。此代码旨在作为&#34;概念证明&#34;运行

1 个答案:

答案 0 :(得分:1)

旋转数据集时,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")

unrotated

我们可以看到数据点位于直行和列,垂直于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")

rotated

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

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

zoomed

对于某些旋转角度(例如theta = 25/100),geom_tile()将返回空白画布,因为宽度&amp;每个图块的高度被挤压到0,而geom_raster()会抛出错误。

根据您的使用案例,geom_point()可能比geom_raster()geom_tile()效果更好。