2014-07-06 121 views
2

我想在ggplot2中繪製自定義圖例。我試過,正如其他問題在這裏提到的類似主題scale_colour_manual,guide=legend等一樣,但默認的圖例目前是不可移動的。默認圖例忽略兩個圖,並且不必要地繪製第三個圖的大小水平。我希望那樣的圖例:ggplot - 自定義圖例

[淺灰線]圖1
[大小的黑圈= 1]圖2
圖表[大小= 1的灰色矩形] 3

這裏是代碼和示例數據框。像this question這樣的自定義圖例修改似乎什麼也不做。

cloud2 <- data.frame(x = c(0, 1, 2), y = c(0.3, 0.4, 0.5)) 
sandwich3 <- data.frame(x = c(1, 2, 3), y = c(0.4, 0.5, 0.6), p = c(0.1, 0.6, 0.3)) 
sandwich4 <- data.frame(x = c(3, 4, 5), y = c(0.6, 0.3, 0.5), p = c(0.1, 0.7, 0.2)) 
ggplot(cloud2, aes(x=x, y=y)) + geom_line(size=0.1,colour="gray70") + 
    aes(x=x, y=y, size=sqrt(p)) + 
    geom_point(data=sandwich3,colour="gray40",shape=15) + scale_size(range=c(0,2)) + 
    geom_point(data=sandwich4,colour="black",shape=16) + 
    theme(legend.position=c(0.905, 0.14), legend.title=element_blank(), 
    axis.ticks = element_line(colour = "black"), axis.text = element_text(colour = "black")) + 
    scale_x_continuous(limits = c(-5, 5), breaks=c(-2, 0, 2)) + 
    scale_y_continuous(limits = c(-1.1, 1.2)) 

所得的情節,使用原始數據幀: enter image description here

+2

你介意給出一個可重複的例子,而不是/以及? – maj

+2

很多時候,這只是關於如何正確地格式化數據。然後'ggplot'會自動生成圖例。確保你的數據格式良好,不要看它不能更具體... – konvas

+1

除了@konvas,我認爲你需要重塑你的數據到長格式,例如'reshape2'包。正如你現在所說的問題,很難說出你做錯了什麼。提供(部分)數據的「dput」會使我們更容易幫助您。 – Jaap

回答

1

首先,最好把所有的數據在同一個地方。我用rbind來製作一個單獨的數據框和幾個額外的列。通過這種方式,映射到aes也更簡單,因爲它是在所有geoms聲明一次:

df_plot 
    x y p series line 
1 0 0.3 NA  1 1 
2 1 0.4 NA  1 1 
3 2 0.5 NA  1 1 
4 1 0.4 0.1  2 2 
5 2 0.5 0.6  2 2 
6 3 0.6 0.3  2 2 
7 3 0.6 0.1  3 2 
8 4 0.3 0.7  3 2 
9 5 0.5 0.2  3 2 

注意使用的因素:

str(df_plot) 
'data.frame': 9 obs. of 5 variables: 
$ x  : num 0 1 2 1 2 3 3 4 5 
$ y  : num 0.3 0.4 0.5 0.4 0.5 0.6 0.6 0.3 0.5 
$ p  : num NA NA NA 0.1 0.6 0.3 0.1 0.7 0.2 
$ series: Factor w/ 3 levels "1","2","3": 1 1 1 2 2 2 3 3 3 
$ line : Factor w/ 2 levels "1","2": 1 1 1 2 2 2 2 2 2 

現在,只需在地圖準確,覆蓋所有規模:

ggplot(df_plot, aes(x = x, y = y, size = sqrt(p), 
        linetype = series, shape = series, colour = series)) + 
    geom_line(size = 0.1) + 
    geom_point() + 
    scale_x_continuous(limits = c(-5, 5), breaks=c(-2, 0, 2)) + 
    scale_y_continuous(limits = c(-1.1, 1.2)) + 
    scale_shape_manual(values = c(NA, 15, 16)) + 
    scale_linetype_manual(values = c(1, 0, 0)) + 
    scale_colour_manual(values = c("gray70", "gray40", "black")) + 
    scale_size(range = c(0,2)) + 
    theme(legend.position = c(0.905, 0.14), legend.title = element_blank(), 
      axis.ticks = element_line(colour = "black"), 
      axis.text = element_text(colour = "black")) + 
    guides(size = F) 

就這樣,你的初始畫面上是不變的,但傳說是(自動)正確的:

enter image description here enter image description here