我在海洋学的背景下使用ggplot2,我想添加一张简单的土地图作为参考。这是基本图形中的最低工作示例:
library(ggplot2)
library(maps)
#Setup fake data - some points in the North Sea
n <- 100
d <- data.frame(lon=rnorm(n,5),lat=rnorm(n,55))
#Plotting with base-graphics, then overlaying map
plot(lat~lon,d,pch=16,col="red",asp=1)
map("world",add=TRUE,col="black",fill=TRUE)
请注意,此图的xlim和ylim由数据范围设置。
现在,尝试在ggplot中重现这个:
#And now with ggplot
g <- ggplot(d,aes(lon,lat))+geom_point(col="red",pch=16)+
borders("world",fill="black",colour="black")
plot(g)
......技术上是正确的 - 轴被设置为覆盖所有点 - 但实际上并不是我所追求的。
我当然可以使用例如手动设置轴。 coord_cartesian
或类似的,但这有很高的刺激因素 - 特别是在尝试自动生成大量类似的地图时。理想情况下,我希望能够覆盖边界/海岸线,并告诉ggplot在确定轴时不要考虑它们。或者,我的印象是geom_map
地图是前进的方向,但我没有取得多大成功..
有什么建议吗?
标记
答案 0 :(得分:2)
使用 public class UserController : ODataController
{
[HttpPost]
public HttpResponseMessage Post(LoginEntityDto objLogin)
{
//mylogin
}
}
//Custom class
public class LoginEntityDto
{
public string username { get; set; }
public string password { get; set; }
}
的替代方法,您可以手动或迭代地获取所需区域的地图:
{
"username": "C201566",
"password" : "pwd"
}
这会产生以下地图:
请注意,您为一个Google查询(“北海”)或一对纬度/经度点设置了两个坐标。
相同(相似)的地图,其中为该位置传递了一对点(来自数据):
ggmap
以下版本更接近原始情节的精神(虽然有实际黑海):
library(ggmap)
northseamap <- get_map(location = "north sea", zoom=6)
g <- ggmap(northseamap) +geom_point(data = d, aes(x=lon, y=lat), col="red",pch=16)
g
答案 1 :(得分:2)
这对ggplot来说绝对可行,但你需要得到朋友的一些帮助,因为你是正确的,geom_map
需要获得美学上令人愉悦的结果。
library(ggplot2)
library(ggthemes)
library(maps)
require(sp)
require(maptools)
# your data
n <- 100
set.seed(1492) # makes the results reproducible
d <- data.frame(lon=rnorm(n, 5),
lat=rnorm(n, 55))
# get the map, don't plot it but `fill` gets us named 'map' polygons
world <- map("world", fill=TRUE, plot=FALSE)
# convert the 'map' to something we can work with via geom_map
IDs <- sapply(strsplit(world$names, ":"), function(x) x[1])
world <- map2SpatialPolygons(world, IDs=IDs, proj4string=CRS("+proj=longlat +datum=WGS84"))
# this does the magic for geom_map
world_map <- fortify(world)
# setup the plot
g <- ggplot(d, aes(lon, lat))
# add the map
g <- g + geom_map(data=world_map, map=world_map,
aes(x=long, y=lat, map_id=id),
fill="black")
# add your points
g <- g + geom_point(col="red", pch=16)
# set the map limits to the extent of your actual data
# (plus a wee bit more)
g <- g + xlim(extendrange(d$lon, f=1))
g <- g + ylim(extendrange(d$lat, f=0.5))
# approximate mercator without dealing with potential
# issues with coord_map()
g <- g + coord_quickmap()
# quick, nice map theme
g <- g + theme_map()
# show the results
g
根据您在数据上的最终位置,可能仍然存在错误多边形线的问题。如果是这样,请发表评论,我可以更新答案,了解如何使用较少的错误地图数据,然后使用当前的内置数据。
答案 2 :(得分:0)
事实证明,自2011年左右(!)以来,ggplot2中一直存在此功能(完全隐藏)-annotation_map()
函数将地图添加为图层。因此,该问题的解决方案将是:
g <- ggplot(d,aes(lon,lat))+
annotation_map(map_data("world"))+ #Add the map as a base layer before the points
geom_point(col="red",pch=16)+
coord_quickmap() #Sets aspect ratio
plot(g)
coord_quickmap()
函数在此处将纵横比设置为看起来不错的东西时特别有用。它也可以用于扩展图,使其覆盖整个北海:
g1 <- g+ coord_quickmap(xlim=c(0,15),ylim=c(50,60))
plot(g1)
在帮助文件中:“ coord_quickmap()
是一种快速近似,它确实保留了直线。它最适合靠近赤道的较小区域。”有关更多标准投影,请参见coord_map()
功能。
答案 3 :(得分:-1)
ggplot(dat,aes(x=lon, y=lat))+borders(fill="black",colour="black") +
geom_point(col="red",pch=16) +
coord_fixed(xlim = c(100,180),ylim=c(0,40))