"blocks" 数据的热图
Heatmap over "blocks" of data
我正在尝试在 R 中绘制热图,以可视化跨不同数据 块 的数据点的值。更具体地说,我有许多国家的公司级数据。我的热图应该显示的是
- 只有国家的标签,没有公司的标签,而颜色是公司级别的
- 在热图中分隔国家/地区块的黑色边框
所需的输出与此类似
然而,到目前为止,我一直未能满足我的需求。这是一个可重现的示例,使用 ggplot
和 scale_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
。
- 将公司映射到
x
和 y
- 使用
facet_grid
并切换分面标签, 按国家对图进行分面
- 删除坐标轴标题、文本和刻度
- 将小平面标签放在外面,移除小平面之间的间距和小平面标签周围的边框
- 在面板周围添加黑色边框并将填充颜色设置为
NA
- 将面板置于顶部
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)
我正在尝试在 R 中绘制热图,以可视化跨不同数据 块 的数据点的值。更具体地说,我有许多国家的公司级数据。我的热图应该显示的是
- 只有国家的标签,没有公司的标签,而颜色是公司级别的
- 在热图中分隔国家/地区块的黑色边框
所需的输出与此类似
然而,到目前为止,我一直未能满足我的需求。这是一个可重现的示例,使用 ggplot
和 scale_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
。
- 将公司映射到
x
和y
- 使用
facet_grid
并切换分面标签, 按国家对图进行分面
- 删除坐标轴标题、文本和刻度
- 将小平面标签放在外面,移除小平面之间的间距和小平面标签周围的边框
- 在面板周围添加黑色边框并将填充颜色设置为
NA
- 将面板置于顶部
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)