如何调整分面 tmap 图中的分面行标签高度?

2024-01-07

我正在使用带有行和列的“tmap”包绘制多面地图。我无法调整行的分面标签的高度,这会导致分面标签在大于特定大小或旋转时被裁剪。

我已经尝试调整所有tm_layout()小组的论据包括panel.label.height, panel.label.size and 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))

我预计行面的面板标签高度也会增加到 5,以便我可以读取面板中的标签,但它们似乎是固定的,并且如图输出所示被裁剪。


有一个错误process_facet_layout的函数tmap.
我修改了它,现在行面的宽度可以像列面一样正确计算。

library(tmap)
library(dplyr)
library(grid)

process_facet_layout <- function(gm) {
    panel.mode <- outer.margins <- attr.outside.position <- legend.outside.position <- NULL     
    fpi <- gm$shape.fpi

    if (gm$panel.mode=="none") {
        dh2 <- gm$shape.dh - fpi$legH - fpi$attrH - fpi$mainH - (gm$nrow - 1) * fpi$between.margin.in - fpi$xlabHin - gm$nrow * fpi$xgridHin
        dw2 <- gm$shape.dw - fpi$legW - (gm$ncol - 1) * fpi$between.margin.in - fpi$ylabWin - gm$ncol * fpi$ygridWin
    } else if (gm$panel.mode=="one") {
        dh2 <- gm$shape.dh - fpi$legH - fpi$attrH - fpi$mainH - gm$nrow * fpi$pSH - (gm$nrow - 1) * fpi$between.margin.in - fpi$xlabHin - gm$nrow * fpi$xgridHin
        dw2 <- gm$shape.dw - fpi$legW - (gm$ncol - 1) * fpi$between.margin.in - fpi$ylabWin - gm$ncol * fpi$ygridWin
    } else {
        dh2 <- gm$shape.dh - fpi$legH - fpi$attrH - fpi$mainH - fpi$pSH - fpi$between.margin.in * gm$nrow - fpi$xlabHin - gm$nrow * fpi$xgridHin
        dw2 <- gm$shape.dw - fpi$legW - fpi$pSW - fpi$between.margin.in * gm$ncol - fpi$ylabWin - gm$ncol * fpi$ygridWin+1
    }

    dasp2 <- dw2/dh2
    hasp <- gm$shape.sasp * gm$ncol / gm$nrow

    if (hasp>dasp2) {
        fW <- dw2
        fH <- dw2 / hasp
    } else {
        fH <- dh2
        fW <- dh2 * hasp
    }

    gasp <- fW/fH    
    if (gasp>dasp2) {
        xs <- 0
        ys <- convertHeight(unit(dh2-(dw2 / gasp), "inch"), "npc", valueOnly=TRUE)
    } else {
        xs <- convertWidth(unit(dw2-(gasp * dh2), "inch"), "npc", valueOnly=TRUE)
        ys <- 0
    }

    outerx <- sum(gm$outer.margins[c(2,4)])
    outery <- sum(gm$outer.margins[c(1,3)])     
    spc <- 1e-5 

    gm <- within(gm, {
        between.margin.y <- convertHeight(unit(fpi$between.margin.in, "inch"), "npc", valueOnly=TRUE)
        between.margin.x <- convertWidth(unit(fpi$between.margin.in, "inch"), "npc", valueOnly=TRUE)
        panelh <- convertHeight(unit(fpi$pSH, "inch"), "npc", valueOnly=TRUE)
        panelw <- convertWidth(unit(fpi$pSW, "inch"), "npc", valueOnly=TRUE)

        ylabWnpc <- convertWidth(unit(fpi$ylabWin, "inch"), "npc", valueOnly=TRUE)
        xlabHnpc <- convertHeight(unit(fpi$xlabHin, "inch"), "npc", valueOnly=TRUE)

        ygridWnpc <- convertWidth(unit(fpi$ygridWin, "inch"), "npc", valueOnly=TRUE)
        xgridHnpc <- convertHeight(unit(fpi$xgridHin, "inch"), "npc", valueOnly=TRUE)

        attr.between.legend.and.map <- attr.outside.position %in% c("top", "bottom")

        if (panel.mode=="none") {
            colrange <- (1:ncol)*3 + 3
            rowrange <- (1:nrow)*3 + 3
            facetw <- ((1-spc-outerx)-xs-fpi$legmarx-ylabWnpc-between.margin.x*(ncol-1))/ncol-ygridWnpc
            faceth <- ((1-spc-outery)-ys-fpi$legmary-fpi$attrmary-fpi$mainmary-xlabHnpc-between.margin.y*(nrow-1))/nrow-xgridHnpc
            colws <- c(outer.margins[2], xs/2, fpi$legmar[2], ylabWnpc, rep(c(ygridWnpc, facetw, between.margin.x), ncol-1), ygridWnpc, facetw, fpi$legmar[4], xs/2, outer.margins[4])

            if (attr.between.legend.and.map) {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$legmar[3], fpi$attrmar[3], rep(c(faceth, xgridHnpc, between.margin.y), nrow-1), faceth, xgridHnpc, xlabHnpc, fpi$attrmar[1], fpi$legmar[1], ys/2, outer.margins[1])
            } else {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$attrmar[3], fpi$legmar[3], rep(c(faceth, xgridHnpc, between.margin.y), nrow-1), faceth, xgridHnpc, xlabHnpc, fpi$legmar[1], fpi$attrmar[1], ys/2, outer.margins[1])
            }

        } else if (panel.mode=="one") {
            colrange <- (1:ncol)*3 + 3
            rowrange <- (1:nrow)*4 + 3

            facetw <- ((1-spc-outerx)-xs-fpi$legmarx-ylabWnpc-between.margin.x*(ncol-1))/ncol-ygridWnpc
            faceth <- ((1-spc-outery)-ys-fpi$legmary-fpi$attrmary-fpi$mainmary-xlabHnpc-between.margin.y*(nrow-1))/nrow - panelh-xgridHnpc

            colws <- c(outer.margins[2], xs/2, fpi$legmar[2], ylabWnpc, ygridWnpc, rep(c(facetw, between.margin.x, ygridWnpc), ncol-1), facetw, fpi$legmar[4], xs/2, outer.margins[4])
            if (attr.between.legend.and.map) {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$legmar[3], fpi$attrmar[3], rep(c(panelh, faceth, xgridHnpc, between.margin.y), nrow-1), panelh, faceth, xgridHnpc, xlabHnpc, fpi$attrmar[1], fpi$legmar[1], ys/2, outer.margins[1])
            } else {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$attrmar[3], fpi$legmar[3], rep(c(panelh, faceth, xgridHnpc, between.margin.y), nrow-1), panelh, faceth, xgridHnpc, xlabHnpc, fpi$legmar[1], fpi$attrmar[1], ys/2, outer.margins[1])
            }

        } else {
            colrange <- (1:ncol)*3 + 5
            rowrange <- (1:nrow)*3 + 5

            colpanelrow <- 6
            rowpanelcol <- 6 #5

            facetw <- ((1-spc-outerx)-xs-fpi$legmarx-ylabWnpc-between.margin.x*ncol-panelw)/ncol-ygridWnpc
            faceth <- ((1-spc-outery)-ys-fpi$legmary-fpi$attrmary-fpi$mainmary-xlabHnpc-between.margin.y*nrow-panelh)/nrow-xgridHnpc

            # Here is the modified code
            colws <- c(outer.margins[2], xs/2, fpi$legmar[2], ylabWnpc, panelw, c(panelw, ygridWnpc, facetw), rep(c(between.margin.x, ygridWnpc, facetw), ncol-1), fpi$legmar[4], xs/2, outer.margins[4])

            if (attr.between.legend.and.map) {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$legmar[3], fpi$attrmar[3], panelh, rep(c(between.margin.y, faceth, xgridHnpc), nrow), xlabHnpc, fpi$attrmar[1],fpi$legmar[1], ys/2, outer.margins[1])
            } else {
                rowhs <- c(outer.margins[3], ys/2, fpi$mainmary, fpi$attrmar[3], fpi$legmar[3], panelh, rep(c(between.margin.y, faceth, xgridHnpc), nrow), xgridHnpc, xlabHnpc, fpi$legmar[1], fpi$attrmar[1], ys/2, outer.margins[1])
            }

        }
        if (legend.outside.position[1] == "left") {
            legx <- 3
            legy <- 5:(length(rowhs)-5)
        } else if (legend.outside.position[1] == "right") {
            legx <- length(colws)-2
            legy <- 5:(length(rowhs)-5)
        } else if (legend.outside.position[1] == "top") {
            legy <- 4- attr.between.legend.and.map
            legx <- 5:(length(colws)-3)
        } else if (legend.outside.position[1] == "bottom") {
            legy <- length(rowhs)-3 + attr.between.legend.and.map
            legx <- 5:(length(colws)-3)
        }

        if (tolower(attr.outside.position[1]) == "top") {
            attry <- 3 + attr.between.legend.and.map
            attrx <- 5:(length(colws)-3)
        } else {
            attry <- length(rowhs)-2 - attr.between.legend.and.map
            attrx <- 5:(length(colws)-3)
        }

        xlaby <- length(rowhs)-4
        xlabx <- 5:(length(colws)-3)

        ylaby <- 5:(length(rowhs)-5)
        ylabx <- 4

    })
    gm$gasp <- unname(gasp)
    gm
}
assignInNamespace(x="process_facet_layout", value=process_facet_layout, ns="tmap")

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=1, panel.label.size=3, panel.label.rot = c(90,0))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调整分面 tmap 图中的分面行标签高度? 的相关文章

  • 按名称包含在单个对象中的多个列对 data.frame 进行排序?

    我想排序一个data frame由多列组成 理想情况下使用基础 R 无需任何外部包 尽管如果有必要 就这样吧 读过如何按列对数据框进行排序 https stackoverflow com questions 1296646 how to s
  • ggplot 按因子和梯度颜色

    我正在尝试绘制一个对两个变量 一个因子和一个强度 进行着色的图 我希望每个因素都是不同的颜色 并且我希望强度是白色和该颜色之间的渐变 到目前为止 我已经使用了诸如对因子进行分面等技术 将颜色设置为两个变量之间的相互作用 并将颜色设置为因子并
  • 在 R 中读入原始二进制数据并将其转换为整数

    我有一个二进制文件 其中包含编码为不同长度 主要是 2 4 字节 的有符号或无符号整数的数值 为了处理这些数据 我将文件的所需部分读取为raw向量与readBin 然后尝试将其转换为十进制 问题是 R的内置函数有限制 我不太明白 比如没有l
  • 如何编写固定宽度的文件?

    我应该编写一个基于固定宽度列的特定格式的 txt 文件 例如 第 1 8 列中的第一个变量 第 9 15 列中的第二个变量 原始数据有不同的长度 它们必须放在指定列的右侧 例如 值 15 96 和 12 489 必须写入第一行和第二行的第1
  • data.table 查找值并翻译

    像许多人一样 我是 R 新手 我有一个大数据集 500M 行 我已将其读取到 data table 中logStats其中有如下数据 head logStats 15 time pid mean 1 2014 03 10 00 00 00
  • xtable 中的 Cox 回归输出 - 选择行/列并添加置信区间

    我不想将 cox 回归的输出导出到一个表中 然后将其放入我的文章中 我想最好的方法是使用 xtable library survival data pbc fit pbc lt coxph Surv time status 2 age ed
  • k折交叉验证 - 如何自动获得预测?

    这可能是一个愚蠢的问题 但我只是找不到一个包来做到这一点 我知道我可以编写一些代码来获得我想要的东西 但如果有一个函数可以自动完成它那就太好了 所以基本上我想对 glm 模型进行 k 倍交叉验证 我想自动获取每个验证集的预测和实际值 因此
  • 如何比较数据框1的每一行与数据框2的每一行?

    我有两个数据框 如下所示 x data frame Name c 200003 200260 400826 400863 500710 Chr c chr1 chr1 chr2 chr3 chr3 Position c 11880 1441
  • R 中的 aov() 错误术语:bw Error(id) 和 Error(id/timevar) 规范有什么区别?

    两者有什么区别aov depvar timevar Error id 和aov depvar timevar Error id timevar 配方规格 这两种变体产生略有不同的结果 同样的问题曾经在这里被问过 https stats st
  • 更快地评估从右到左的矩阵乘法

    我注意到以二次形式评估矩阵运算右到左明显快于左到右在 R 中 取决于括号的放置方式 显然它们都执行相同的计算量 我想知道为什么会这样 这与内存分配有什么关系吗 A 5000 5000 B 5000 2 A matrix runif 5000
  • R - 加速近似日期匹配。 idata.frame?

    我正在努力有效地执行两个数据帧之间的 关闭 日期匹配 这个问题探索了一个解决方案 使用idata frame来自plyr包 但我也对其他建议的解决方案感到非常满意 这是两个数据框的非常简单的版本 sampleticker lt data f
  • 在并行包中的 R 的 par*apply 函数内部使用 Rcpp 函数

    我试图了解背后发生的事情Rcpp sourceCpp 调用并行环境 最近 问题中部分解决了这个问题 在 Windows 上使用 parLapply 中的 Rcpp 函数 https stackoverflow com questions 2
  • 为什么我的 3D 绘图没有显示在 R Studio 绘图查看器中?

    我通常在 RStudio 版本 1 0 44 中查看绘图时没有问题 但是当我尝试查看使用 rgl 包创建的 3D 绘图时 我的 RStudio 绘图查看器中什么也没有出现 我能够毫无问题地绘制图 汽车 散点图 这是我正在使用的代码 inst
  • 如何在 R 中的多图形环境中画一条线?

    举一个非常简单的例子 mfrow c 1 3 每个图都是不同的直方图 我将如何画一条水平线 类似于abline h 10 所经过的all3位数 也就是说 甚至是它们之间的边距 显然 我可以为每个图形添加一条 abline 但这不是我想要的
  • ggplot:如何检索轴标签的值?

    如何提取下面的 ggplot 中用于标记 y 轴和 x 轴的数字 分别为20 30 40 and 10 15 20 25 30 35 Plot From r 统计公司 http r statistics co Top50 Ggplot2 V
  • data.table:j中的匿名函数

    我试图让匿名函数返回多列j的论证data table 这是一个例子 sample data tmpdt lt data table a c rep a 5 rep b 5 b c rep f 3 rep r 7 c 1 10 d 21 30
  • R 中计算滚动实现波动率的更快方法

    我想计算一组指数的滚动 20 天已实现波动率 这是我用来下载指数价格 计算每日收益和 20 天已实现波动率的代码 library quantmod library PerformanceAnalytics tickers c RUT STO
  • 如何在时间序列的中途更改ggplot2中的线属性?

    取以下两个时间序列的简单图 economics ggplot2 dataset require dplyr require ggplot2 require lubridate require tidyr economics gt gathe
  • R 中的约束优化

    我正在尝试使用http rss acs unt edu Rdoc library stats html constrOptim html http rss acs unt edu Rdoc library stats html constr
  • 如何使用 gvisMotionChart 处理 POSIXlt 格式时间?

    The googleVisR软件包出奇的好 然而 我对一个问题感到困惑gvisMotionChart关于 timevar 因为我的数据集中的时间是POSIXlt格式 例如 2009 07 02 19 00 00 2009 07 02 20

随机推荐

  • Inno Setup - 如何创建自定义表单以允许我找到要解压缩的文件?

    我正在尝试使用此代码创建一个自定义表单 该表单允许我找到要解压缩的文件 var TNewDiskForm TSetupForm DiskBitmapImage TBitmapImage SelectDiskLabel PathLabel T
  • 带有选项和可访问方法的 jQuery 插件模板?

    我想构建一个具有可访问方法和选项的插件 这是一个复杂的插件 我需要可以在插件外部访问这些方法 因为如果有人向 DOM 添加某些内容 则需要更新它 因此我们不需要再次运行完整的插件 我过去见过有这样做的插件 但我找不到它们 所以我无法查看它们
  • 如何获取自定义网格子项点击事件?

    我正在挣扎自定义网格视图 不完全是自定义网格视图 但它是子视图的点击事件 主要两个查询 first 问题是 如果我在网格中添加简单的图像视图和文本视图 然后单击其工作的任何项目并显示该项目的位置 但是当我在网格中添加两个按钮替换文本视图时
  • 使用 CSS 强制 高度

    我需要控制表格行的高度 我已经尝试设置单元格的高度 但我遇到了砖墙 See demo http jsfiddle net EUFxM 4 tr fixedRow tr fixedRow td fixedCell height 50px ov
  • 使用多个线程处理单个连接

    我有 3 个异步服务器和客户端 它们像一条链一样相互连接 一个请求会经过 3 个系统 例如 gt System 1 gt System 2 gt System 3 gt 和回应 gt System 3 gt System 2 gt Syst
  • 在flutter中如何清除栏中的通知?

    我正在学习 Google 云消息传递和火力基地消息传递 https pub dev packages firebase messaging工作正常 但是当用户不单击通知来打开应用程序 而是通过手动打开应用程序并将其带到前台直接进入应用程序时
  • R中的分组计算[重复]

    这个问题在这里已经有答案了 我在 R 中对数据框进行了分组和总结 现在我有一个如下表 Group Value Count A 1 4 A 2 2 A 10 4 B 3 2 B 4 4 B 2 3 C 5 3 C 2 6 我有兴趣找出每组中值
  • Powershell 选择 HTML 文本

    我有以下 powershell 脚本来打开多台计算机上的多个 HTML 文件以提取许可信息 寻找一些帮助提取内部文本元素 td where id 2 寻找提取 产品 序列号 产品密钥 请求代码 ForEach system in Get C
  • 创建一个事件接收器来记录列表中用户所做的更改

    我正在开发一个 SharePoint 发布网站 我想在 SharePoint 列表中 记录 用户所做的所有更改 网上的一些搜索引导我找到了 EventReceiver 但我的 EventReceiver 必须是通用的并附加到网站集中的所有列
  • 模块构建失败:错误:TypeScript 编译中缺少 index.ts

    项目描述 我的项目是通过package json下载到node module 包 json dependencies myllc application core git ssh email protected cdn cgi l emai
  • 通过文本别名引用 Javascript 变量

    是否可以通过文本别名引用 JavaScript 变量 例如 var x 2 var y convertToVariableRef x 调用上述函数后 y将是相同的参考x而不仅仅是简单地复制值x into y 如果你声明一个没有任何函数作用域
  • Hakyll 网站的根源是什么?

    我看到创建函数需要一个标识符列表 ghci gt t create create Identifier gt Rules gt Rules 我应该使用什么标识符列表来匹配网站的根目录 例如 我只想制作一个出现在 www example co
  • GPS信号强度计算

    我想使用 NET CF 显示 GPS 设备的信号栏 我能够读取 NMEA 数据并获取 SNR 信号 但它们是许多卫星 有些处于活动状态 有些处于不活动状态 信噪比各不相同 我考虑过获取总 SNR 的平均值 但它不会给出准确的值 因为三颗强信
  • 编辑摊牌:在句子末尾保留换行符

    编辑非所见即所得 LaTeX HTML 等 散文时 您可能希望在句子末尾添加换行符 这有几个优点 更容易重新排列句子 更容易注释句子 更容易发现连续 过长的句子 评论更方便on句子 例如 The following isn t strict
  • 是否可以在 Selenium 中捕获 POST 数据?

    我正在与Selenium http seleniumhq comWebDriver 工具 我想知道该工具是否提供了一种捕获提交表单时生成的 POST 数据的方法 我正在使用 django 测试框架来测试我的数据是否在后端正确处理 我想使用
  • 这是什么 ANT 版本?

    我是 java Eclipse 的新手 我安装了 eclipse 并使用它作为 IDE 来处理 JAVA 1 4 文件 我更改了代码并保存了它并想要运行 cntr F11 或调试 F11 每次我得到 select what to run A
  • WTForms:FormField 的 FieldList 无法加载嵌套数据

    我在 FieldList 内的 FormField 内有一个自定义字段 地点 class LocationForm Form id HiddenField id title StringField l Title Required loca
  • 加载特定 MIME 类型的本机客户端 Chrome 扩展

    我为 Google Chrome Web 浏览器创建了一个本机客户端应用程序 用于播放特殊类型的音频文件 伟大的 此时该部分效果很好 我已准备好进入下一阶段 与世界分享这个应用程序 我需要这部分的帮助 根据我的理解 分发此应用程序的最佳方法
  • 如何预加载 angular2 视图,以便在首次加载时不会闪烁白页?

    我正在用纯 JS 构建一个 Angular 2 应用程序 我的问题是 当我从一个页面更改到另一个页面时 它会闪烁白色页面 直到呈现新视图 仅当我第一次访问所有组件时 才会发生这种情况 如果我第二次转到相同的路线 则页面加载时不会出现白页 我
  • 如何调整分面 tmap 图中的分面行标签高度?

    我正在使用带有行和列的 tmap 包绘制多面地图 我无法调整行的分面标签的高度 这会导致分面标签在大于特定大小或旋转时被裁剪 我已经尝试调整所有tm layout 小组的论据包括panel label height panel label