tmap:如何将格式应用于小倍数choropleth上的数字标签

tmap:如何将格式应用于小倍数choropleth上的数字标签,r,tmap,R,Tmap,我正在用tmap绘制小倍数,每个竞争对手一个。我得到了波兰的多张choropleth地图,这些地图被划分为几个县,按销售价值上色,如GGU(wrap) 首先,我将数据附加到shp文件中,并将每个竞争对手的值(针对一个国家的每个小地图)作为单独的列。每行是一个省 county_marketshare<-df_monthly_val %>% filter(win_name %in% best6) %>% select(win_name,value,inv_provi

我正在用tmap绘制小倍数,每个竞争对手一个。我得到了波兰的多张choropleth地图,这些地图被划分为几个县,按销售价值上色,如GGU(wrap)

首先,我将数据附加到shp文件中,并将每个竞争对手的值(针对一个国家的每个小地图)作为单独的列。每行是一个省

county_marketshare<-df_monthly_val %>% 
   filter(win_name %in% best6) %>% 
   select(win_name,value,inv_province) %>% 
   group_by(win_name,inv_province)%>% 
   summarise(value=round(sum(value)),0)%>%
   spread(key="win_name", value=value)
绘图是确定的,但我不满意的数字标签,并希望他们的格式更可读的方式

tm_文本在每个省的形状上打印值。请注意,作为参数文本,它采用列的向量名称,每个竞争对手的每个省的值

如何在tmap中为数字标签添加格式?例如,如何将以下行添加到我的tm_text命令

格式(x,scientific=FALSE,big.mark=“”,big.interval=3)})

编辑: 我尝试了Jindra Lacko的解决方案,图例标签按照指定的格式进行格式化,但仍然不是地图中的标签

tm_shape(pl_geo) +
  tm_polygons(best6,
              id = "province",
              palette = colfunc(20),
              style="quantile",     #("pretty", "fixed" (describe breaks))
              legend.show = TRUE,
              free.scales.fill=FALSE)+
  tm_text(c(best6) , legend.size.show = FALSE,ymod = -0.7, size = 1, 
          legend.format = list(fun = function(x) formatC(x, digits = 0, big.mark = " ", format = "f"))) 
编辑2:我想进一步澄清这个问题,因为它不是很清楚

对于绘制小倍数的choropleth,如ggplot2中的facet_wrap,在tmap中,需要将“宽格式”的数据列附加到shp数据中。(至少我从各种教程中了解到了这一点)

每个小图从列中获取一个数据

这意味着与一个绘图不同,tm_文本获取列的名称,以便tmap可以打印小倍数。这意味着我不能简单地重新格式化,将值更改为文本,因为我在shp数据中没有值,只有列的名称

最终编辑:根据Jindra Lacko的回答,我创建了6列,与源数据一样多,并对其进行了格式化,以便我可以将它们分别传递给tm_文本:

county_marketshare<-df_monthly_val %>% 
   filter(win_name %in% best6) %>% 
   select(win_name,value,inv_province) %>% 
   group_by(win_name,inv_province)%>% 
   summarise(value=round(sum(value),0))%>% 
   spread(key="win_name", value=value, fill=0) %>%  # teraz muszę stworzyc kolumny sformatowane "finansowo"
   mutate(!!as.symbol(paste0(best6[1],"_lbl")):= formatC(!!as.symbol(best6[1]),digits = 0, big.mark = " ", format = "f",zero.print = ""),
          !!as.symbol(paste0(best6[2],"_lbl")):= formatC(!!as.symbol(best6[2]),digits = 0, big.mark = " ", format = "f",zero.print = ""),
          !!as.symbol(paste0(best6[3],"_lbl")):= formatC(!!as.symbol(best6[3]),digits = 0, big.mark = " ", format = "f",zero.print = ""),
          !!as.symbol(paste0(best6[4],"_lbl")):= formatC(!!as.symbol(best6[4]),digits = 0, big.mark = " ", format = "f",zero.print = ""),
          !!as.symbol(paste0(best6[5],"_lbl")):= formatC(!!as.symbol(best6[5]),digits = 0, big.mark = " ", format = "f",zero.print = ""),
          !!as.symbol(paste0(best6[6],"_lbl")):= formatC(!!as.symbol(best6[6]),digits = 0, big.mark = " ", format = "f",zero.print = "")
          )

county_marketshare$inv_province <- iconv(county_marketshare$inv_province,from = "utf-8", to = "ascii//TRANSLIT")
pl_geo <-
  append_data(
    shp = pl_geo,
    data = county_marketshare,
    key.shp = "jpt_nazwa_",
    key.data = "inv_province",
    ignore.na = T
  )
country\u市场份额%
过滤器(最佳6中的win_名称%)%%>%
选择(赢的名称、价值、投资省)%>%
组员(胜利名称,投资省)%>%
汇总(值=四舍五入(和(值),0))%>%
价差(key=“win_name”,value=value,fill=0)%>%\teraz muszęstworzyc kolumny sformatowane“finansowo”
变异(!!as.symbol(paste0(best6[1],“_lbl”):=formatC(!!as.symbol(best6[1]),数字=0,big.mark=“”,format=“f”,zero.print=“”),
!!as.symbol(paste0(best6[2],“_lbl”):=格式(!!as.symbol(best6[2]),数字=0,big.mark=“”,format=“f”,zero.print=“”),
!!as.symbol(paste0(best6[3],“_lbl”):=格式(!!as.symbol(best6[3]),数字=0,big.mark=“”,format=“f”,zero.print=“”),
!!as.symbol(paste0(best6[4],“_lbl”):=格式(!!as.symbol(best6[4]),数字=0,big.mark=“”,format=“f”,zero.print=“”),
!!as.symbol(paste0(best6[5],“_lbl”):=格式(!!as.symbol(best6[5]),数字=0,big.mark=“”,format=“f”,zero.print=“”),
!!as.symbol(paste0(best6[6],“_lbl”):=格式(!!as.symbol(best6[6]),数字=0,big.mark=“”,format=“f”,zero.print=“”)
)

county_marketshare$inv_province要更改格式,您需要将定义格式的函数传递到
图例。format
部分
tm.*
调用

我相信
legend.format=list(fun=function(x)formatC(x,digits=0,big.mark=“”,format=“f”))
应该可以做到这一点。默认情况下,Big interval=3,忽略它应该可以

不久前,我写了一篇关于tmap图例格式的博文,其中包括使用C样式格式以及在数字中添加货币/百分比符号。
请随便检查

编辑:现在我明白了!不是图例,而是地图上的标签!我的坏

在打印标签之前,需要将其转换为文本。我无法复制您的代码,因此我在tmap附带的欧洲数据集上包含了一个示例

library(tmap)
library(tidyverse)

data(Europe)

Europe$pop_est_adj <- as.character(formatC(Europe$pop_est, 
                                           big.mark = " ", 
                                           format = "f", 
                                           digits = 0))

tm_shape(Europe) + tm_borders() +
  tm_shape(Europe) + tm_text(text = "pop_est_adj", size = .7)
库(tmap)
图书馆(tidyverse)
数据(欧洲)

Europe$pop_est_adj要更改格式,需要将定义格式的函数传递给
图例。format
部分
tm.*
调用

我相信
legend.format=list(fun=function(x)formatC(x,digits=0,big.mark=“”,format=“f”))
应该可以做到这一点。默认情况下,Big interval=3,忽略它应该可以

不久前,我写了一篇关于tmap图例格式的博文,其中包括使用C样式格式以及在数字中添加货币/百分比符号。
请随便检查

编辑:现在我明白了!不是图例,而是地图上的标签!我的坏

在打印标签之前,需要将其转换为文本。我无法复制您的代码,因此我在tmap附带的欧洲数据集上包含了一个示例

library(tmap)
library(tidyverse)

data(Europe)

Europe$pop_est_adj <- as.character(formatC(Europe$pop_est, 
                                           big.mark = " ", 
                                           format = "f", 
                                           digits = 0))

tm_shape(Europe) + tm_borders() +
  tm_shape(Europe) + tm_text(text = "pop_est_adj", size = .7)
库(tmap)
图书馆(tidyverse)
数据(欧洲)

欧洲$pop_est_adj
m1
m1亲爱的金德拉谢谢您的帮助。我应用了这条线,图例标签也相应地格式化了。但是绘图中的标签格式不好,它们保持原样。@JacekKotowski现在我明白你的意思了!是的,我看错了你的问题,并且描述了图例格式。我的错。我已经编辑了我的答案以设置标签的格式。这张地图很难看,数字和边界重叠,但格式是存在的…感谢Jindra,它很好,它适用于一个情节。。。然而,我发现在小倍数的情况下,我没有数据了,所以我可以随意将其转换为文本和格式。tmap需要的是每个系列的shp数据中的列名称,它将根据这些列构建小图。此外,在打印之前,我无法将值转换为文本,因为我将无法为形状(choropleth)着色。但您肯定可以使用文本创建一个新列作为标签,并使用原始列进行着色?是的,您给了我一个很好的建议来尝试。。。我可以尝试使用格式化的txt向shp文件中添加4个额外的列,然后为tm_文本提供这些新列的名称。我想它们的顺序一定和带数字的精确的顺序相同。理论的
library(tmap)
library(tidyverse)

data(Europe)

Europe$pop_est_adj <- as.character(formatC(Europe$pop_est, 
                                           big.mark = " ", 
                                           format = "f", 
                                           digits = 0))

tm_shape(Europe) + tm_borders() +
  tm_shape(Europe) + tm_text(text = "pop_est_adj", size = .7)
m1 <- tm_shape(World) +
      tm_polygons("pop_est", palette="RdYlGn", n=8,
          title="Población estimada", id="name",
          legend.show = FALSE) 
m2 <- tm_shape(World) +
      tm_polygons("pop_est", palette="RdYlGn", n=8,
          title="Población estimada", id="name") + 
      tm_layout(legend.only = TRUE,
                legend.format = list(text.separator = 'a',
                                     fun = function(x) formatC(x, digits = 0, big.mark = ".", format = "f")))
tmap_arrange(m1, m2)