[英]Create arbitrary legend ordering for multilayer ggplot2 plot
我模拟了以下代码来提供上下文。 功能,序列间隔,名称和颜色都是任意的。
library(ggplot2)
function1 <- function(input) {
input * 3
}
function2 <- function(input) {
2 * input + 1
}
function3 <- function(input) {
input + 4
}
x1 <- seq(1, 10, 0.1)
x2 <- seq(1, 10, 0.2)
x3 <- seq(1, 10, 0.5)
y1 <- sapply(x1, function1)
y2 <- sapply(x2, function2)
y3 <- sapply(x3, function3)
data1 <- data.frame(x1, y1)
data2 <- data.frame(x2, y2)
data3 <- data.frame(x3, y3)
ggplot() +
geom_point(data = data1, aes(x1, y1, color = "B")) +
geom_point(data = data2, aes(x2, y2, color = "C")) +
geom_point(data = data3, aes(x3, y3, color = "A")) +
scale_color_manual(name = "Functions",
values = c("B" = "Green", "C" = "Red",
"A" = "Blue")) +
xlab("X") +
ylab("Y")
这是结果图的屏幕截图:
有一些先前回答的问题可以解决图例排序的类似问题,例如本问题 ,但似乎没有一个可以解决多层图。 这个问题解决了0.9.2版的图例排序,但是ggplot2当前在2.2.1版上 。 此外,它似乎只处理升序或降序。
我想知道是否可以自定义图例中值的顺序 。 例如,在图例中,是否可以将其显示为B,C,A而不是A,B,C?
“ ggplot2方式”是将数据重整为长格式(或首先以长格式创建数据)。 然后,您只需调用geom_point
,就可以创建一个因子列来对函数进行排序:
dat = data.frame(X=c(x1,x2,x3),
Y=c(y1,y2,y3),
Functions=rep(LETTERS[1:3], sapply(list(x1,x2,x3), length)))
dat$Functions = factor(dat$Functions, levels=c("B","C","A"))
ggplot(dat, aes(X, Y, colour=Functions)) +
geom_point() +
scale_color_manual(values=c(B="green", C="red", A="blue"))
更新:为了回应评论,如果您想添加一个缩写,则可以使用下面的代码。 但是,这不仅将为颜色图例添加新的键值,还将为其他三个预先存在的图例键添加一条对角线。
ggplot(dat, aes(X, Y, colour=Functions)) +
geom_point() +
scale_color_manual(values=c(B="green", C="red", A="blue", `My Abline`="black")) +
geom_abline(aes(intercept=0, slope=1, colour="My Abline"))
如果您想要一个单独的图例用于边框,则可以对这些点使用填充美学,仅将颜色图例保留用于该边框。 为此,请使用填充的点标记(点标记形状为21到25)。 在下面的代码中, stroke=0
将删除填充点周围的边框。
ggplot(dat, aes(X, Y, fill=Functions)) +
geom_point(shape=21, size=2, stroke=0) +
geom_abline(aes(intercept=0, slope=1, colour="My Abline")) +
scale_fill_manual(values=c(B="green", C="red", A="blue")) +
scale_colour_manual(values="black") +
labs(colour="")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.