我想将图例键旋转为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)
这里的解决方案在于定义一个新的绘图键。然而,正如 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)
我要指出的几点是:
themeggplot,并且如果多条线具有相同的颜色,则可能无法工作。不过,很高兴知道我想这是可以做到的......
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |