我试图获取一个空间数据集,旋转它,并用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“文件可以找到这里,"DEMOFunctions.R”脚本可以找到这里。这个脚本包含"ShiftToOrigin“和"RotateDispersion”函数。
提前感谢您的帮助!抱歉,代码格式和稀疏注释。此代码旨在作为“概念的证明”运行。
发布于 2017-10-18 11:04:43
当您旋转数据集时,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_))在旋转之前,这就是图的样子(我为四个角添加了标签,这样就可以更容易地遵循旋转):
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创建的相应的瓷砖彼此很好地联系在一起。
现在,让我们稍微旋转一下dataframe (我修改了来自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()将返回空白画布,因为每个瓷砖的宽度和高度被压缩到0,而geom_raster()则会抛出一个错误。
根据您的用例,geom_point()可能比geom_raster()或geom_tile()工作得更好。
https://stackoverflow.com/questions/46797547
复制相似问题