旋转geom_abline的图例键

Qui*_*ten 4 r ggplot2

我想将图例键旋转为geom_abline水平图例键,或者如果可能的话根据其斜率旋转。这是一些可重现的代码(dput下面的 df ):

library(ggplot2)
p = ggplot(df, mapping = aes(x = x, y = y)) +
  geom_point() +
  geom_abline(df, mapping = aes(slope = slope, intercept = 0, color = factor(group))) +
  coord_cartesian(xlim = c(0, 3), ylim = c(0, 3)) 
p
Run Code Online (Sandbox Code Playgroud)

创建于 2023-04-19,使用reprex v2.0.2

我尝试使用 @Sandy Muspratt 他的答案在这里grid功能,但这也旋转了 ablines 和图例键。所以我想知道是否有人知道如何旋转 的图例键geom_abline


dputdf:

df<-structure(list(x = c(0, 0, 0), y = c(0, 0, 0), slope = c(0.5, 
1, 0.75), group = c("A", "B", "C")), class = "data.frame", row.names = c(NA, 
-3L))
Run Code Online (Sandbox Code Playgroud)

All*_*ron 5

这里的解决方案在于定义一个新的绘图键。然而,正如 Tjebo 在评论中指出的那样,很难以这种方式自定义斜率,因为数据传递到draw_key_*不包含所有美学数据 - 仅包含制作标准绘制键(线宽、颜色、填充、 ETC)。

解决这个问题的一种方法是利用 ggplots 是使用该ggproto系统构建的这一事实,该系统本身基于嵌套环境。可以编写一个自定义draw_key_*函数来查找适当的祖先框架以找到整个美学数据集:

draw_key_custom <- function (data, params, size) {
  colour <- data$colour 
  datalist <- get("data", parent.frame((10)))
  i <- which(sapply(datalist, function(x) "slope" %in% names(x)))[1]
  data <- datalist[[i]]
  data <- data[data$colour == colour,]
  slope <- data$slope
  intercept <- (1 - slope)/2
  y1 <- ifelse(abs(slope) > 1, (sign(slope) + 1)/2, intercept)
  y2 <- ifelse(abs(slope) > 1, 1 - (sign(slope) + 1)/2, intercept + slope)
  x1 <- ifelse(abs(slope) > 1, (y1 - intercept)/slope, 0)
  x2 <- ifelse(abs(slope) > 1, (y2 - intercept)/slope, 1)
  grid::segmentsGrob(x1, y1, x2, y2,
               gp = grid::gpar(col = data$colour, 
                               lwd = data$linewidth * 2))
}
Run Code Online (Sandbox Code Playgroud)

这允许:

ggplot(df, mapping = aes(x = x, y = y)) +
  geom_point() +
  geom_abline(aes(slope = slope, intercept = 0, color = factor(group)),
              key_glyph = draw_key_custom) +
  coord_cartesian(xlim = c(0, 3), ylim = c(0, 3))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我要指出的几点是:

  1. 在图例中改变坡度是不寻常的并且没有必要
  2. 生成的斜率不一定与绘图中的斜率匹配,除非图例键的纵横比适合绘图面板的纵横比。除非在中指定了纵横比,否则该比率在绘图调整大小时不稳定theme
  3. 上述实现对于 内的更改很脆弱ggplot,并且如果多条线具有相同的颜色,则可能无法工作。

不过,很高兴知道我想这是可以做到的......