"blocks" 数据的热图

Heatmap over "blocks" of data

我正在尝试在 R 中绘制热图,以可视化跨不同数据 的数据点的值。更具体地说,我有许多国家的公司级数据。我的热图应该显示的是

所需的输出与此类似

然而,到目前为止,我一直未能满足我的需求。这是一个可重现的示例,使用 ggplotscale_fill_gradient2,尽管我很乐意使用任何其他包。任何提示将不胜感激。

 #in matrix form
datanames <- c("ITA_firm1","ITA_firm2","ITA_firm3","GER_firm1","GER_firm2","FRA_firm1","FRA_firm2","FRA_firm3","US_firm1","US_firm2")
data <- matrix(rexp(100, rate=.1), ncol=10)
rownames(data) <- colnames(data) <- datanames

#long and rename to country blocks
library(data.table)
data <- as.data.table(data)
data[,i:= substr(colnames(data),1,3)]
data <- melt(data, id.vars = "i", value.name = "value", variable.name = "j")
data[,j := substr(j,1,3)]

#a graph
ggplot(data , aes(x = j, y = i)) +
  geom_raster(aes(fill = value)) +
  scale_fill_gradient2(low="navy", mid="green",  high="red", 
                       midpoint=mean(data$value), limits=range(data$value)) +
  theme_classic()

实现此目的的一种方法是利用 facet_grid

  1. 将公司映射到 xy
  2. 使用 facet_grid 并切换分面标签,
  3. 按国家对图进行分面
  4. 删除坐标轴标题、文本和刻度
  5. 将小平面标签放在外面,移除小平面之间的间距和小平面标签周围的边框
  6. 在面板周围添加黑色边框并将填充颜色设置为 NA
  7. 将面板置于顶部
library(tidyr)
library(ggplot2)
library(dplyr)
library(tibble)

set.seed(42)
#in matrix form
datanames <- c("ITA_firm1","ITA_firm2","ITA_firm3","GER_firm1","GER_firm2","FRA_firm1","FRA_firm2","FRA_firm3","US_firm1","US_firm2")
data <- matrix(rexp(100, rate=.1), ncol=10)
rownames(data) <- colnames(data) <- datanames

data1 <- as.data.frame(data) %>% 
  rownames_to_column() %>% 
  pivot_longer(-rowname) %>% 
  separate(rowname, into = c("country1", "firm1")) %>% 
  separate(name, into = c("country2", "firm2"))

#a graph
ggplot(data1, aes(x = firm2, y = firm1, fill = value)) +
  geom_raster() +
  scale_fill_gradient2(low="navy", mid="green",  high="red", 
                       midpoint=mean(data1$value), limits=range(data1$value)) +
  scale_y_discrete(expand = c(0, 0), limits = rev(levels(data1$firm1))) +
  scale_x_discrete(expand = c(0, 0)) +
  facet_grid(country1 ~ country2, switch = "both") +
  theme_classic() +
  theme(axis.title = element_blank(), 
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        strip.placement = "outside",
        panel.spacing = unit(0, "pt"),
        strip.background = element_rect(color = NA),
        panel.background = element_rect(color = "black", fill = NA),
        panel.ontop = TRUE)