如何创建图表热图(非美国)

How to create a cartogram-heatmap (non-US)

我想创建一个像这样的地图:

编辑:此截图来自 Claus Wilkes 的书 Fundamentals of Data Visualization

但是因为我住在瑞士,所以我还没有找到可以开箱即用的软件包。我还没有找到适合德国或奥地利的东西。

然后我发现了包 geofacet,它涵盖了很多国家(甚至更小的国家,如 CH),并允许创建如下网格:

经过一段时间的周转,我设法做到了这一点:

还有一些细节需要修复,但我面临两个问题,我不知道如何解决:

  1. 如何绘制圆角正方形(如初始图片所示)?
  2. 如何在情节中间使用state/canton名称,如水印?我最后一次尝试删除了构面标签并使用了注释,但无法使用列中的状态值。

如有任何帮助,我将不胜感激。另外,如果有人在过去遇到过同样的问题并且找到了比我更简单的解决方案。

MWE

这是最后一个情节的代码:

library(ggplot2)
library(geofacet)

test = data.frame("state"=c("ZH", "AG", "TI", "BS"), value=c(1,2,3,4))

ggplot(data=test, aes(fill=value)) +
  geom_rect(mapping=aes(xmin=1, xmax=2, ymin=1, ymax=2), color="black", alpha=0.5) +
  annotate("text", x=1.5, y=1.5, label= "state") +
  facet_geo(~state, grid="ch_cantons_grid2") +
  theme_minimal() + 
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        strip.placement = "bottom",
        plot.title = element_text(hjust = 5),
        strip.background = element_blank(),
        strip.text.x = element_blank())

也许是这样的:

圆角正方形见hrbrmstr/statebins

library(ggplot2)
library(geofacet)
library(dplyr)
test = data.frame(state=c("ZH", "AG", "TI", "BS"), value=c(1,2,3,4))

# devtools::install_github("hrbrmstr/statebins")

grid_geo <- geofacet::ch_cantons_grid2$code

test$state <- factor(test$state, levels = grid_geo)

test <- dplyr::right_join(test, dplyr::tibble(grid_geo), by = c('state' = 'grid_geo'))

ggplot(data=test ) +
    statebins:::geom_rrect(data=test, mapping=aes(xmin=1, xmax=2, ymin=1, ymax=2), 
                           fill = 'white', 
                           color="black", alpha=0.5) +
    statebins:::geom_rrect(data=test %>% 
                               dplyr::filter(!is.na(value)),
                                             mapping=aes(xmin=1, xmax=2, ymin=1, ymax=2, fill =  value), 
              color="black", alpha=0.5) +
    geom_text(data=test, aes(x = 1.5, y = 1.5, label = state)) +
    # annotate("text", x=1.5, y=1.5, label= state) +
    facet_geo(~state, grid="ch_cantons_grid2") +
    theme_minimal() + 
    theme(axis.title.x=element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank(),
          axis.title.y=element_blank(),
          axis.text.y=element_blank(),
          axis.ticks.y=element_blank(),
          strip.placement = "bottom",
          plot.title = element_text(hjust = 5),
          strip.background = element_blank(),
          strip.text.x = element_blank(), 
          line = element_blank())


这是另一个模仿您显示的视觉效果的代码。

ggplot(data=test) +
    statebins:::geom_rrect(data=test, mapping=aes(xmin=1, xmax=2, ymin=1, ymax=2), 
                           fill = '#d0e1e1', 
                           color=NA, alpha=0.7) +
    statebins:::geom_rrect(data=test %>% 
                               dplyr::filter(!is.na(value)),
                                             mapping=aes(xmin=1, xmax=2, ymin=1, ymax=2, fill =  value), 
              color=NA, alpha=1) +
    geom_text(data=test, aes(x = 1.5, y = 1.5, label = state)) +
    # annotate("text", x=1.5, y=1.5, label= state) +
    facet_geo(~state, grid="ch_cantons_grid2") +
    scale_fill_gradient(low = "#dccbd7", high = '#564364', name = "Label value") +
    theme_minimal() + 
    guides(fill = guide_legend(title.position = "top")) +
    theme(legend.position = c(0.2, 0.95), 
          legend.direction="horizontal") +
    theme(axis.title.x=element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank(),
          axis.title.y=element_blank(),
          axis.text.y=element_blank(),
          axis.ticks.y=element_blank(),
          strip.placement = "bottom",
          plot.title = element_text(hjust = 5),
          strip.background = element_blank(),
          strip.text.x = element_blank(), 
          line = element_blank())

您可以将 guides(fill = guide_legend(title.position = "top")) 更改为 guides(fill = guide_colorbar(title.position = "top")) 以获得连续的色阶。