R:ggmap:如何在 ggmap 上仅使用已知角度绘制线条?我的 geom_spoke 方法无效
R: ggmap: How do I draw lines using only known angles on a ggmap? My geom_spoke method is not working
我正在尝试在 ggmap
上以极坐标画线。一般方法在 ggplot
:
中工作正常
library(ggmap)
library(rgdal)
library(ggplot2)
#####################################
## build data frame with triangulation data
t1 <- c(534325, 4858925, 338, 0955)
t2 <- c(534383, 4859261, 290, 1010)
t3 <- c(534386, 4859011, 301, 1015)
df <- as.data.frame(rbind(t1, t2, t3))
colnames(df) <- c("Easting", "Northing", "Azimuth", "Time")
df$Time <- as.character(df$Time)
## plot coordinates with triangulation
ggplot(df, aes(x=Easting, y=Northing, label=Time)) +
geom_point() +
geom_text(nudge_x = 50) +
geom_spoke(aes(angle = Azimuth, radius = -500)) +
theme_bw()
没有底图的三角测量:
这就是我想要的,但是背景没有底图。
但是,当我在 ggmap
中尝试此方法时:
## convert utms to lat long
utmcoor <- SpatialPoints(cbind(df$Easting,df$Northing),
proj4string=CRS("+proj=utm +zone=12"))
lonlatcoor <- as.data.frame(spTransform(utmcoor,CRS("+proj=longlat")))
colnames(lonlatcoor) <- c("lon", "lat")
df$lon <- lonlatcoor$lon
df$lat <- lonlatcoor$lat
## plot on base map
zoom <- 15
meanlon <- mean(df$lon)
meanlat <- mean(df$lat)
basemap <- get_googlemap(center=c(lon=meanlon, lat=meanlat), zoom=zoom,
maptype="hybrid")
ggmap(basemap) +
geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius=-200) +
theme_void()
我收到错误
Warning message:
Removed 3 rows containing missing values (geom_segment).
代码在没有 geom_spoke
行的情况下工作正常,导致底图没有三角测量:
我知道这个函数通常用于箭袋图之类的东西。 ggmap
不支持geom_spoke
吗?有没有我不知道的更好的功能?
提前致谢。
问题出在坐标上:您给 geom_spoke
的半径为 -200,但您使用的坐标小了几个数量级。我拿出 theme_void
只是为了提醒自己规模有多小;你想要一个类似 0.01 的半径。乱用我放在这里的半径值。
geom_spoke
基本上在幕后做了一点三角函数来计算每个辐条的端点,然后绘制一条线段。如果该端点超出绘图范围,您将收到缺失值警告。我不确定 -200 是您坚持使用的半径,还是只是一个虚拟值,但您可以使用原始坐标和角度来计算端点,然后投影这些点以计算出半径。或者只是使用这些端点自己绘制 geom_segment
。我会将这些计算留给您,否则可能会产生另一个问题。我非常偏爱 sf
并且感觉可以提供一种足够简单的方法来获得这些分数。
library(ggmap)
library(rgdal)
library(ggplot2)
# .....
# everything up until ggmap is the same as in question
ggmap(basemap) +
geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius = -1e-2)
由 reprex package (v0.2.0) 创建于 2018-07-18。
我正在尝试在 ggmap
上以极坐标画线。一般方法在 ggplot
:
library(ggmap)
library(rgdal)
library(ggplot2)
#####################################
## build data frame with triangulation data
t1 <- c(534325, 4858925, 338, 0955)
t2 <- c(534383, 4859261, 290, 1010)
t3 <- c(534386, 4859011, 301, 1015)
df <- as.data.frame(rbind(t1, t2, t3))
colnames(df) <- c("Easting", "Northing", "Azimuth", "Time")
df$Time <- as.character(df$Time)
## plot coordinates with triangulation
ggplot(df, aes(x=Easting, y=Northing, label=Time)) +
geom_point() +
geom_text(nudge_x = 50) +
geom_spoke(aes(angle = Azimuth, radius = -500)) +
theme_bw()
没有底图的三角测量:
这就是我想要的,但是背景没有底图。
但是,当我在 ggmap
中尝试此方法时:
## convert utms to lat long
utmcoor <- SpatialPoints(cbind(df$Easting,df$Northing),
proj4string=CRS("+proj=utm +zone=12"))
lonlatcoor <- as.data.frame(spTransform(utmcoor,CRS("+proj=longlat")))
colnames(lonlatcoor) <- c("lon", "lat")
df$lon <- lonlatcoor$lon
df$lat <- lonlatcoor$lat
## plot on base map
zoom <- 15
meanlon <- mean(df$lon)
meanlat <- mean(df$lat)
basemap <- get_googlemap(center=c(lon=meanlon, lat=meanlat), zoom=zoom,
maptype="hybrid")
ggmap(basemap) +
geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius=-200) +
theme_void()
我收到错误
Warning message:
Removed 3 rows containing missing values (geom_segment).
代码在没有 geom_spoke
行的情况下工作正常,导致底图没有三角测量:
我知道这个函数通常用于箭袋图之类的东西。 ggmap
不支持geom_spoke
吗?有没有我不知道的更好的功能?
提前致谢。
问题出在坐标上:您给 geom_spoke
的半径为 -200,但您使用的坐标小了几个数量级。我拿出 theme_void
只是为了提醒自己规模有多小;你想要一个类似 0.01 的半径。乱用我放在这里的半径值。
geom_spoke
基本上在幕后做了一点三角函数来计算每个辐条的端点,然后绘制一条线段。如果该端点超出绘图范围,您将收到缺失值警告。我不确定 -200 是您坚持使用的半径,还是只是一个虚拟值,但您可以使用原始坐标和角度来计算端点,然后投影这些点以计算出半径。或者只是使用这些端点自己绘制 geom_segment
。我会将这些计算留给您,否则可能会产生另一个问题。我非常偏爱 sf
并且感觉可以提供一种足够简单的方法来获得这些分数。
library(ggmap)
library(rgdal)
library(ggplot2)
# .....
# everything up until ggmap is the same as in question
ggmap(basemap) +
geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius = -1e-2)
由 reprex package (v0.2.0) 创建于 2018-07-18。