为多层ggplot2图创建任意图例排序

时间:2017-09-01 20:59:45

标签: r plot ggplot2 legend

我模拟了以下代码以提供上下文。函数,序列间隔,名称和颜色都是任意的。

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")

以下是结果图的截图:

enter image description here

以前回答的一些问题解决了传奇排序的类似问题,例如one,但似乎都没有处理多层图。此question解决版本0.9.2的图例排序,但ggplot2 is currently on version 2.2.1。此外,它似乎只解决升序或降序。

我想知道是否有任何方法可以自定义图例中值的顺序。例如,在图例中,是否可以将其显示为B,C,A而不是A,B,C?

1 个答案:

答案 0 :(得分:3)

&#34; ggplot2方式&#34;将数据重新整形为长格式(或者首先以长格式创建)。然后,您只需要调用一次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")) 

enter image description here

更新:在回复评论时,如果您想添加参考,可以使用以下代码。但是,这不仅会为颜色图例添加新的键值,还会为其他三个预先存在的图例键添加对角线。

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"))

enter image description here

如果您想为abline设置单独的图例,则可以对点使用填充美学,并仅为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="")

enter image description here