我正在尝试制作一张伦敦的插图,以及一张更大的英国地图。我正在使用包“tmap”,我发现它是一个很好的包,特别容易转移到使用 ggplot2 一段时间。但是,关于如何使用 tmap 生成插图的文档有点不清楚。的参考手册描述应该如何能够制造使用插页地图:
save_tm(...insets_tm = NULL, insets_vp = NULL)
Run Code Online (Sandbox Code Playgroud)
但不清楚应该如何使用第二个命令 insets_vp。我只找到了一个示例,它实际上提供了使用 tmap 生成 insetmap 的建议语法:
alaska <- tm_shape(shp_alaska) + … print(alaska, vp=viewport(x=.1,
y=.15, width=.2, height=.3))
Run Code Online (Sandbox Code Playgroud)
上面代码的来源请看这里。这实际上并没有显示美国和阿拉斯加/夏威夷的地图是如何组合的。至于我自己的编码尝试,我尝试了以下(dplyr、magrittr、rgdal、GISTools、RColorBrewer、tmap 都已加载,R vn 3.3.2、RStudio 1.0.136):
我首先为所有英国 (UK_Im_Sec) 和伦敦 (London_Im_Sec) 创建两个 tmap 对象多边形和点:
UK_Im_Sec<-tm_shape(UKNI_LA_ll, is.master = TRUE)+
tm_borders(lwd=0.25)+
tm_shape(Immobile_residuals)+
tm_dots(col="Sec_Name", style="cat", palette="Set1", title="Socio-economic background (NS-SEC)")+
tm_layout(title="Mapping outlier residuals - non-predicted 'immobility' (Social class)", title.size = 3.0,
title.position=c("center","TOP"),legend.outside = TRUE,
legend.outside.position = "right",frame = FALSE)
LDN_Im_Sec<-tm_shape(Immobile_resids_LDN)+
tm_dots(col="Sec_Name", style="cat", palette="Set1", size …Run Code Online (Sandbox Code Playgroud)第一次在 stackoverflow 上发帖。我一直在学习使用 tmap,并且已经获得了我需要的分区统计图的几乎所有内容。然而,我似乎找不到答案的最后一步是使图例标题比其下面的文本更大。也想把它加粗。这是我的代码的示例:
tm_shape(Shakira) +
tm_polygons("mydata3$nkill", textNA="Missing Data",
title="Deaths From Terrorism",
contrast = 1, style = "kmeans",
palette = "Greens") +
tm_text("NAME_1", size = "AREA") +
tm_style_natural() +
tm_legend(position = c("right", "top"),
bg.color = "white",
bg.alpha=.2,
width = .25, title.size = 5) +
tm_layout(legend.title.size = .5, legend.text.size = .65,
legend.frame = TRUE)
Run Code Online (Sandbox Code Playgroud)
我以为它会是 legend.title.size,但是它所做的只是增加或减少标题与其下方文本之间的空间,而不是使字体有任何不同。我很感激任何帮助!
我不确定如何或是否可以以休闲方式调整关键图例。考虑这个例子:
library(tmap)
data(Europe)
my_map <-
tm_shape(Europe) +
tm_polygons("well_being", textNA="Non-European countries", title="Well-Being Index") +
tm_text("iso_a3", size="AREA", root=5) +
tm_layout(legend.position = c("RIGHT","TOP"),
legend.frame = TRUE)
Run Code Online (Sandbox Code Playgroud)
我尝试legend.format = list(scientific = TRUE)过类似的东西:
my_map2 <- my_map +
tm_layout(legend.format = list(scientific = TRUE))
Run Code Online (Sandbox Code Playgroud)
这给了一个传说:
但是,我希望的是:
在我的数据中,4 是一个零,我被要求让它单独作为零。
我正在使用 R 包 Tmap 创建变量的等值线,该变量有时为正,有时为负。默认发散调色板以绿色显示正值,以红色显示负值。我想扭转这一点,用红色显示正值,用绿色显示负值,以符合我使用顺序调色板的其他 choropleths。我翻阅了手册并尝试了各种方法,但似乎无法使其正常工作。这是一个可重现的示例。
library(tmap)
data(Europe)
Europe$outcome = c(scale(1:nrow(Europe)))
tm_shape(Europe) +
tm_polygons(col="outcome",
style="cont")
Run Code Online (Sandbox Code Playgroud)
我试过“auto.palette.mapping=F”、“fill.palette="-div"”、“fill.palette="YlGnBu"”等,但我似乎无法改变任何东西。
我想向 R 中的 tmap 中的地图添加一条附加注释,该注释不是标题(我希望它是左下角的附加注释,用于指定数据源,例如)。有一个函数可以做到这一点吗?谢谢!
我正在尝试创建一个地图,根据一些定义的类别显示井的位置。我已经将每口井的水位相对于他们的完整记录进行了分类,将水位分为“有史以来最高”、“高于正常”、“正常”、“低于正常”、“有史以来最低”等术语。使用 tmap,我想使用以下颜色“最高”= 深蓝色、“高于正常”= 浅蓝色、“正常”=绿色、“低于正常”=黄色、“最低”来显示这些条件中的每一个-ever" = 红色
到目前为止,我已经创建了一个用于映射的 sf 文件
Library(tidyverse)
library(sf)
library(spData)
Library(tmap)
Library(tmaptools)
Run Code Online (Sandbox Code Playgroud)
我的资料
test <- structure(list(well = c(3698L, 3697L, 4702L, 15001L, 1501L, 3737L,
1674L, 5988L, 1475L, 15017L), con = c("N", "B", "H", "B", "L",
"B", "N", "A", "N", "B"), x = c(2834091L, 2838342L, 2802911L,
2845228L, 2834408L, 2834452L, 2838641L, 2834103L, 2803192L, 2929417L
), y = c(6166870L, 6165512L, 6125649L, 6174527L, 6161309L, 6168216L,
6170055L, 6164397L, 6140763L, 6227467L)), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)
创建用于映射的 sf 文件
test_sf …Run Code Online (Sandbox Code Playgroud) 我正在使用带有行和列的“tmap”包绘制多面地图。我无法调整行的分面标签的高度,这会导致分面标签在大于特定尺寸或旋转时被裁剪。
我尝试调整tm_layout()面板的所有参数,包括panel.label.height、panel.label.size和panel.label.rot.(使用 R 3.5.3、tmap_2.3 和 tmaptools_2.0-2)。Panel.label.height似乎只影响柱子的面板高度。我觉得我需要panel.label.width对标签行做同样的事情。
library(tmap);library(dplyr)
data(metro)
metro_edited <- metro %>%
mutate(pop1950cat = cut(pop1950, breaks=c(5, 10, 40)*1e6),
pop2020cat = cut(pop2020, breaks=c(5, 10, 40)*1e6))
tm_shape(metro_edited) +
tm_dots("red", size = .5) +
tm_facets(c("pop1950cat", "pop2020cat"),
free.coords = FALSE)+
tm_layout(panel.label.height=5, panel.label.size = 1, panel.label.rot = c(0,0))
Run Code Online (Sandbox Code Playgroud)
我预计行面的面板标签高度也会增加到 5,以便我可以读取面板中的标签,但它们似乎是固定的,并且如图输出所示被裁剪。
我想使用ggplot2::geom_sf. 这里的挑战是如何做到这一点,使所有地图都在图像中居中并处于相同的空间尺度。这是问题(以下可重现示例的数据):
使用facet_wrap将所有多边形置于相同空间比例的简单地图,但它们不居中。
ggplot(states6) +
geom_sf() +
facet_wrap(~name_state)
Run Code Online (Sandbox Code Playgroud)
这是这个SO 问题的解决方案,
它使用cowplot. 在这种情况下,多边形居中,但它们处于不同的空间尺度
g <- purrr::map(unique(states6$name_state),
function(x) {
# subset data
temp_sf <- subset(states6, name_state == x)
ggplot() +
geom_sf(data = temp_sf, fill='black') +
guides(fill = FALSE) +
ggtitle(x) +
ggsn::scalebar(temp_sf, dist = 100, st.size=2,
height=0.01, model = 'WGS84',
transform = T, dist_unit='km')
})
g2 <- cowplot::plot_grid(plotlist = g)
g2
Run Code Online (Sandbox Code Playgroud)
我在使用tmap库时发现了同样的问题。
tm_shape(states6) +
tm_borders(col='black') +
tm_fill(col='black') +
tm_facets(by = "name_state ", …Run Code Online (Sandbox Code Playgroud) 下面是使用 R 中的包查找从“纽约世贸中心一号”到“纽约麦迪逊广场公园”的路线、旅行时间和旅行距离的示例osrm。(我是从R 中的 Road Routing中学到的 )。这里的行车时间是 10.37 分钟。
我想创建一个用于可视化的视频。
问:如何创建车辆(由标记表示)沿路线从“纽约世贸中心一号”移动到“纽约麦迪逊广场公园”的动画?
理想情况下,我们应该知道每个路段的速度。但是让我们假设车辆在两个位置之间以恒定速度(= 距离/时间)不停地移动。
我们也可以简单地使用tmap代替传单来创建动画。
library(sf)
library(dplyr)
library(tidygeocoder)
library(osrm)
# 1. One World Trade Center, NYC
# 2. Madison Square Park, NYC
adresses <- c("285 Fulton St, New York, NY 10007",
"11 Madison Ave, New York, NY 10010")
# geocode the two addresses & transform to {sf} data structure
data <- tidygeocoder::geo(adresses, method = "osm") %>%
st_as_sf(coords = c("long", "lat"), crs = 4326)
osroute <- …Run Code Online (Sandbox Code Playgroud) 这是关于如何创建沿路线从 A 到 B 的车辆移动动画的后续问题?. 我可以学习如何为沿路线从 A 到 B 移动的车辆设置动画。谢谢您的帮助!
但是是否可以通过添加时间线(带有显示瞬时时间和相应事件的移动标记)来制作一个自我解释的视频(对于假设的客户)。 时间线示例
例如 - 这是一个示例事件序列 -
library(sf)
library(dplyr)
library(tidygeocoder)
library(osrm)
library(lubridate)
# adresses
adresses <- c("285 Fulton St, New York, NY 10007", # One World Trade Center
"11 Madison Ave, New York, NY 10010",
"Rockefeller Center, 45 Rockefeller Plaza, New York, NY 10111")
# geocoded addresses
geocoded_addresses <- tidygeocoder::geo(adresses, method = "osm") %>%
st_as_sf(coords = c("long", "lat"), crs = 4326)
# reference time
t <- as_datetime("2021-08-23 …Run Code Online (Sandbox Code Playgroud)