将方括号添加到 ggplot2 中的组轴标签

Adding square brackets to group axis labels in ggplot2

测试图 <- read.table("R/test",header=TRUE,sep="\t")

testmap

     Models         Group Brands  Presence Country
1    Xperia Z5      A     Sony    1        Japan
2    Galaxy S20     A     Samsung 1        Korea
3    Xperia XZ      B     Sony    1        Japan
4    Galaxy Note FE B     Samsung 0        Korea
5    Nord           A     OnePlus 1        China

我使用以下代码获得了根据国家/地区绘制的模型的presence/absence。

ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models")+
  scale_fill_gradient(low="white",high="black")+
  theme_bw() + theme(legend.position="none")

testmap.jpg

我想根据相应的品牌对模型进行分组。 (从技术上讲,画一个方括号来显示每个品牌组。)

我尝试按照之前 post 中的建议使用 facet_grid,但它也在绘图区域中对模型进行了分组。我想将整个地块区域保持为一个。是否可以生成与上面完全相同的图表,只是使用方括号根据品牌对它们进行分组?

尝试 facet_grid:

ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models")+
  scale_fill_gradient(low="white",high="black")+
  facet_grid(Brands ~., scales="free", space="free_y",switch="y")+
  theme_bw() + theme(strip.placement="outside", strip.background=element_rect(fill="white"), axis.title=element_blank(),legend.position="none",strip.text.y.left = element_text(angle = 0))

试一试。仍在弄清楚如何正确地将文本添加到 y 轴。尽管这是非常手动且难以扩展的。

library(tidyverse)
library(grid)
library(pBrackets)

testmap <- tribble(
  ~Models, ~Group, ~Brands, ~Presence, ~Country,
  "Xperia Z5", "A", "Sony", 1, "Japan",
  "Galaxy S20", "A", "Samsung", 1, "Korea",
  "Xperia XZ", "B", "Sony", 1, "Japan",
  "Galaxy Note FE", "B", "Samsung", 0, "Korea",
  "Nord", "A", "OnePlus", 1, "China")
)
ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models\n\n")+
  scale_fill_gradient(name="Presence of Models", low="white",high="black")+
  theme_bw() + theme(legend.position="none")

# using grid.locator to identify the coordinate for brackets
grid.locator(unit = "native")

# add bracket to plot area
grid.brackets(60, 134, 60, 32, type = 1)
grid.brackets(60, 233, 60, 157, type = 1)
grid.brackets(60, 353, 60, 247, type = 1)

输出:

感谢 Henrik 和 Sinh Nguyen 的帮助,我设法获得了我想要的东西——特别是:用于对 y 轴标签进行分组的方括号。

library(ggplot2)
library(grid)
library(pBrackets)
ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models\n\n\n\n\n\n\n\n")+
  scale_fill_gradient(low="white",high="black")+
  theme_bw() + theme(legend.position="none")

grid.locator(unit="native")

grid.brackets(140, 198, 140, 78, lwd=1, ticks=NA, type = 4)
grid.brackets(140, 321, 140, 320, lwd=0.5, ticks=NA, type = 4)
grid.brackets(140, 556, 140, 436, lwd=1, ticks=NA, type = 4)

grid.text(x=unit(35,'native'), y=unit(140,'native'),
  label=expression(paste('Sony'),'type=4'), hjust = 0, vjust=0)
grid.text(x=unit(35,'native'), y=unit(325,'native'),
  label=expression(paste('OnePlus'),'type=4'), hjust = 0, vjust=0)
grid.text(x=unit(35,'native'), y=unit(496,'native'),
  label=expression(paste('Samsung'),'type=4'), hjust = 0, vjust=0)

我用grid.locator(unit="native")估计位置。这是“估计的”,因为括号似乎稍微偏离了预期的位置。

另外,grid.brackets中的h可以用来调整括号的水平长度。

括号和字体的类型和调整更加灵活,在手册中有:https://cran.r-project.org/web/packages/pBrackets/pBrackets.pdf

它并不完美,但我想至少它解决了问题。 但仍然欢迎任何改进可视化的建议。

希望这个回答对遇到同样问题的人有所帮助!

谢谢!