由于您没有提供完整的可重现示例(或您已经尝试过的任何代码),我制作了一些虚拟数据来展示您如何做到这一点。
library(dplyr)
library(ggplot2)
fake.df <-
expand.grid(Country = c("US", "Canada", "Mexico"),
segments = LETTERS[1:5],
variable = c("Kerosene", "Petrol",
"Edible Oil", "LPG")) %>%
mutate(value = runif(length(Country), -20, 50))
fake.df.adj <-
fake.df %>%
mutate(xadj = ifelse(variable %in% c("Kerosene", "Edible Oil"), -0.33/2, 0.33/2),
yadj = ifelse(variable %in% c("Kerosene", "Petrol"), 0.33/2, -0.33/2),
xpos = as.numeric(factor(Country)) + xadj,
ypos = as.numeric(factor(segments)) + yadj)
mutate 代码围绕您要绘制的每个中心点创建一个调整框。对于“煤油”和“食用油”,这些图块向左移动了每个Country 之间空间的 1/3(因此每个图块的中心为 -0.33/2);其他的向右移动。与 y 调整相同,但上下而不是左右。
然后将因子(Country 和 segments)转换为数字位置并将它们相加。
fake.df.adj
Country segments variable value xadj yadj xpos ypos
1 US A Kerosene -11.8318607 -0.165 0.165 0.835 1.165
2 Canada A Kerosene 39.1181835 -0.165 0.165 1.835 1.165
3 Mexico A Kerosene 25.9354644 -0.165 0.165 2.835 1.165
4 US B Kerosene -19.3503525 -0.165 0.165 0.835 2.165
5 Canada B Kerosene -12.4459506 -0.165 0.165 1.835 2.165
6 Mexico B Kerosene 9.9017016 -0.165 0.165 2.835 2.165
7 US C Kerosene 37.9767562 -0.165 0.165 0.835 3.165
8 Canada C Kerosene 3.4687111 -0.165 0.165 1.835 3.165
9 Mexico C Kerosene 0.6280239 -0.165 0.165 2.835 3.165
10 US D Kerosene 43.4739464 -0.165 0.165 0.835 4.165
11 Canada D Kerosene 8.4671510 -0.165 0.165 1.835 4.165
12 Mexico D Kerosene 19.7357609 -0.165 0.165 2.835 4.165
13 US E Kerosene -2.6120700 -0.165 0.165 0.835 5.165
14 Canada E Kerosene -10.6013792 -0.165 0.165 1.835 5.165
15 Mexico E Kerosene -6.2059698 -0.165 0.165 2.835 5.165
16 US A Petrol 17.1079974 0.165 0.165 1.165 1.165
17 Canada A Petrol 46.8944785 0.165 0.165 2.165 1.165
18 Mexico A Petrol 9.3977815 0.165 0.165 3.165 1.165
19 US B Petrol 38.7547489 0.165 0.165 1.165 2.165
20 Canada B Petrol -14.4210703 0.165 0.165 2.165 2.165
21 Mexico B Petrol 32.5160861 0.165 0.165 3.165 2.165
22 US C Petrol -1.3750645 0.165 0.165 1.165 3.165
23 Canada C Petrol 17.0540527 0.165 0.165 2.165 3.165
24 Mexico C Petrol -16.8449931 0.165 0.165 3.165 3.165
25 US D Petrol 33.8465349 0.165 0.165 1.165 4.165
26 Canada D Petrol 43.7369153 0.165 0.165 2.165 4.165
27 Mexico D Petrol 32.2145640 0.165 0.165 3.165 4.165
28 US E Petrol -13.1811532 0.165 0.165 1.165 5.165
29 Canada E Petrol 46.1913082 0.165 0.165 2.165 5.165
30 Mexico E Petrol -7.5030316 0.165 0.165 3.165 5.165
31 US A Edible Oil 36.1643957 -0.165 -0.165 0.835 0.835
32 Canada A Edible Oil 26.9887728 -0.165 -0.165 1.835 0.835
33 Mexico A Edible Oil 9.2825143 -0.165 -0.165 2.835 0.835
34 US B Edible Oil 32.7455557 -0.165 -0.165 0.835 1.835
35 Canada B Edible Oil 9.0447777 -0.165 -0.165 1.835 1.835
36 Mexico B Edible Oil 21.5822081 -0.165 -0.165 2.835 1.835
37 US C Edible Oil 2.3906442 -0.165 -0.165 0.835 2.835
38 Canada C Edible Oil 25.2536855 -0.165 -0.165 1.835 2.835
39 Mexico C Edible Oil 5.0618632 -0.165 -0.165 2.835 2.835
40 US D Edible Oil 41.0292115 -0.165 -0.165 0.835 3.835
41 Canada D Edible Oil 8.4515698 -0.165 -0.165 1.835 3.835
42 Mexico D Edible Oil 11.9080938 -0.165 -0.165 2.835 3.835
43 US E Edible Oil 42.2518838 -0.165 -0.165 0.835 4.835
44 Canada E Edible Oil 25.6458033 -0.165 -0.165 1.835 4.835
45 Mexico E Edible Oil -19.3037443 -0.165 -0.165 2.835 4.835
46 US A LPG 25.8891215 0.165 -0.165 1.165 0.835
47 Canada A LPG -3.1028641 0.165 -0.165 2.165 0.835
48 Mexico A LPG 47.5884154 0.165 -0.165 3.165 0.835
49 US B LPG 11.3000701 0.165 -0.165 1.165 1.835
50 Canada B LPG 26.8041755 0.165 -0.165 2.165 1.835
51 Mexico B LPG -13.0209453 0.165 -0.165 3.165 1.835
52 US C LPG -5.5292231 0.165 -0.165 1.165 2.835
53 Canada C LPG 46.3101034 0.165 -0.165 2.165 2.835
54 Mexico C LPG 19.7622448 0.165 -0.165 3.165 2.835
55 US D LPG 8.5258791 0.165 -0.165 1.165 3.835
56 Canada D LPG 20.5856857 0.165 -0.165 2.165 3.835
57 Mexico D LPG -10.7589733 0.165 -0.165 3.165 3.835
58 US E LPG 14.8577291 0.165 -0.165 1.165 4.835
59 Canada E LPG -6.9590007 0.165 -0.165 2.165 4.835
60 Mexico E LPG -3.1651872 0.165 -0.165 3.165 4.835
fake.df.adj %>%
ggplot(aes(xpos, ypos, fill = value)) +
geom_tile(height = 0.33, width = 0.33) +
geom_text(aes(label = paste0(round(value, 1), "%"),
color = value < 30), show.legend = F) +
geom_text(data = fake.df.adj %>% filter(Country == "Mexico", segments == "E"),
aes(label = variable,
y = ypos + 1.75*yadj),
fontface = "bold") +
scale_fill_gradient2(labels = function(breaks) paste0(breaks, "%")) +
scale_color_manual(values = c("FALSE" = "white", "TRUE" = "black")) +
scale_x_continuous(breaks = 1:3, name = NULL,
labels = levels(fake.df$Country)) +
scale_y_continuous(breaks = 1:5, name = "Segments",
labels = levels(fake.df$segments)) +
theme_classic()
现在您可以使用geom_tile 进行绘图,将图块的高度和宽度设置为 0.33。
我在每个图块的顶部添加了标签,四舍五入到小数点后一位,并带有 % 符号。为了使它们在高值的深色背景填充中很好地显示出来,我将标签的颜色美感作为一种逻辑表达,然后进一步将这些值映射为黑色和白色。
那么没有办法知道variable的四种类型中的哪一种在哪个图块中,所以我通过将数据过滤为仅墨西哥和E,并将y位置稍微移动了一点,将它们标记在右上角使用与以前相同的调整值比图块的中心更远一点。
然后我添加了一个发散的填充调色板并用 % 符号标记颜色条。
然后您必须指定 x 和 y 比例的标签,因为它们现在只是数字位置。