我有一些具有連續 X 和分類 Y 軸的通用圖,例如:
data(iris)
p1 <-
ggplot(iris, aes(y=Species, x=Sepal.Length))
geom_violin()

現在我想用一些應該定位在 Y 軸旁邊的標簽來注釋它,使用這樣的快速和骯臟的解決方案:
df.labels <- data.frame(Species=c('setosa','versicolor','virginica'), Labels=c('labA','labB','labC'))
p2 <- p1 geom_text(data = df.labels, aes(x=4, y=Species, label=Labels))

請注意,我必須x=4明確指出;對于更一般的情況,我做了這個功能:
add_label <- function(inpPlot, inpData, colLabel){
plotX1 <- ggplot_build(inpPlot)$layout$panel_params[[1]]$x.range[1]
plotX2 <- ggplot_build(inpPlot)$layout$panel_params[[1]]$x.range[2]
plotW <- plotX2 - plotX1
posX <- plotX1 - 0.05*plotW
colGrp <- as_label(inpPlot$mapping$y)
inpPlot
coord_cartesian(clip='off')
geom_text(data = inpData, aes_string(x='posX', y=colGrp, label=colLabel))
}
p3 <- add_label(p1, df.labels, 'Labels')

我不喜歡這個解決方案:
- 當我調整繪圖視窗大小時,計算為“繪圖寬度的 5%”的偏移量效果不佳(我希望軸和標簽之間有一個固定的絕對距離)
- 如果我的初始情節已應用,則它不起作用
coord_cartesian(),例如:
p1c <- p1 coord_cartesian(xlim = c(5,NA))
p4 <- add_label(p1c, df.labels, 'Labels')

標簽顯示在繪圖區域本身,我希望它們位于繪圖區域之外(但在 Y 軸的“內部”,即軸標簽的右側)。
理想情況下,我想要的是這樣的:
p5 <- add_label_good(p1c, df.labels, 'Labels')
即它應該在軸和繪圖區域之間繪制標簽,并且這個空間應該是固定寬度的。
有沒有辦法實作這一目標?
uj5u.com熱心網友回復:
您可能會考慮patchwork使用兩個對齊的圖:
library(patchwork)
plot_labels <- ggplot(df.labels, aes(x = 0, y = Species, label = Labels))
geom_text(hjust = 0)
theme_void()
theme(axis.text.y = element_text(),
axis.title.y = element_text(angle = 90, margin = margin(0,12,0,0, unit = "pt")))
plot_labels
(p1 theme(axis.title.y = element_blank(),
axis.text.y = element_blank()))
plot_layout(widths = c(1,8))

uj5u.com熱心網友回復:
一種選擇是使用刻面條:
p1 facet_grid(Species~., scales = 'free_y', switch = "y",
labeller = labeller(Species = function(x) {
df.labels$Labels[match(x, df.labels$Species)]}))
theme(text = element_text(size = 16),
strip.text.y.left = element_text(angle = 0, face = "bold",
margin = margin(10, 10, 10, 10)),
strip.background = element_blank(),
panel.spacing = unit(0, "mm"))

另一種選擇是使用ggtext::element_markdown()軸文本本身作為標簽:
p1
scale_y_discrete(labels = function(x) {
paste(x, df.labels$Labels[match(x, df.labels$Species)],
sep = paste0(rep(" ", 5), "<b>", collapse = ""))
})
theme(text = element_text(size = 16),
axis.text.y = ggtext::element_markdown())

對于繪圖最左側的真正固定寬度的文本區域,您可以使用annotation_custom
p1
annotation_custom(grid::rectGrob(x = unit(10, "mm"), y = 0.5,
width = unit(20, "mm"), height = 1,
gp = grid::gpar(col = NA)))
annotation_custom(grid::textGrob(df.labels$Labels,
x = unit(10, "mm"),
y = c(0.81, 0.5, 0.19)))

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471607.html
下一篇:按R中的特定組重新排序熱圖
