2015-10-20 221 views
5

我有一個多個geom_point和一個stat_functionggplot2的情節。有沒有辦法展示一個傳奇?ggplot2合併圖例

df <- data.frame("x"=c(1:5), "a"=c(1,2,3,3,3), "b"=c(1,1.1,1.3,1.5,1.5)) 
df <- melt(df, "x") 
p <- ggplot(df, aes(x=x, y=value)) + 
    geom_point(aes(colour=variable, shape=variable)) + 
    stat_function(aes(colour="log2(x)"), fun=log2) 

enter image description here

我想與藍線和兩個彩色形狀的單一傳奇。我試過

scale_colour_discrete(name="legend", breaks=c("a", "b", "log2(x)")) + 
scale_shape_discrete(name="legend", breaks=c("a", "b")) 

但這不起作用。有沒有辦法自動或手動執行此操作?

在此先感謝。

回答

5

也許更容易的選擇是使用override.aes如下:

ggplot(df, aes(x = x, y = value)) + 
    geom_point(aes(colour = variable, shape = variable), size = 3) + 
    stat_function(aes(colour = "log2(x)"), fun = log2, size = 1.5) + 
    guides(shape = FALSE, 
     colour = guide_legend(override.aes = list(shape = c(16, 17, NA), 
                linetype = c("blank", "blank", "solid")))) 

其中產生以下結果:

enter image description here

3

指定.爲你的曲線形狀象徵和爲貴點的空行:

p <- ggplot(df, aes(x=x, y=value)) + 
    geom_point(aes(colour=variable, shape=variable, linetype = variable), size = 3) + 
    stat_function(aes(colour="log2(x)", shape = "log2(x)", linetype = "log2(x)"), fun=log2) + 
    scale_shape_manual(values = setNames(c(16, 17, 46), c("a", "b", "log2(x)"))) + 
    scale_linetype_manual(values = setNames(c(0, 0, 1), c("a", "b", "log2(x)"))) 
print(p) 

resulting plot

+0

謝謝,這個工程。但我認爲@Jaap的答案是更「官方」的方式。 – dbrettschneider

+0

當然,如果你能記住它,我不能。 – Roland

+0

我推薦這個選項超過當前接受的答案。覆蓋指南存在人爲錯誤的風險,導致錯誤地標記值的不準確的指南。然而,通過這個答案,即使在規模規格中出現錯誤,指南也會始終準確無誤。 –