2014-03-18 64 views
0

我有一些R代碼繪製一個圖。它看起來像下面的圖片:R,改變顏色/線條樣式時的ggplot:Grid.Call.graphics中的錯誤

enter image description here

現在我希望能夠設置線條顏色和樣式(需要它的灰度值),添加兩條直線傳說和刪除的標題傳奇。

此代碼的工作(我把假數據):

library(ggplot2) 

load ("vns.data") 
load ("rw.data") 
load("gibbs.data") 

,如果你不加載數據,這樣做:

vtm1<- c(1,3,4) 
vmean<-c(3.9,3.8,3) 
vmax<-c(4.1,4.2,4) 
vmin<-c(3,2.5,2) 
rtm1<- c(1,2,4,5) 
rmean<-c(3.9,3.85,3.7,3.1) 
rmax<-c(4.1,4.2,4,3.9) 
rmin<-c(3,2.5,2,1.9) 
gtm1<- c(2,4,5) 
gmean<-c(4.1,3.9,3) 
gmax<-c(4.1,4,3.9) 
gmin<-c(3,2.5,1.5) 
vns <- data.frame(vtm1, vmean, vmax, vmin) 
gibbs <- data.frame(gtm1, gmean, gmax, gmin) 
rw <- data.frame(rtm1, rmean, rmax, rmin) 

然後繼續

names(vns) <- c("tm1", "mean", "max", "min") 
names(gibbs) <- c("tm1", "mean", "max", "min") 
names(rw) <- c("tm1", "mean", "max", "min") 
vns$what <- "VNS" 
gibbs$what <- "GS" 
rw$what <- "RW" 


DF <- do.call(rbind, list(vns, gibbs, rw)) 




plt <- ggplot(DF, aes(x= tm1, ymin= min, ymax= max, y=mean)) + 
xlab("Number of TM lookups") + 
ylab("Cross-entropy")+ 
geom_hline(yintercept=3.2240952381, linetype = "dotted", color="#A8A8A8")+ 
geom_hline(yintercept=3.44366666666667, linetype = "dotted") + 
geom_ribbon(aes(fill=what), alpha=0.3) + 
geom_line(aes(linetype = what))+ 
theme_bw()+ 


scale_colour_manual(name="what", values=c("vns"="#A8A8A8", "gibbs"="#E8E8E8", "rw"="#C8C8C8")) + 
    scale_fill_manual(name="what", values=c("vns"="#A8A8A8", "gibbs"="#E8E8E8", "rw"="#C8C8C8"))+ 
    scale_linetype_manual(name="what", values=c("vns"="solid", "gibbs"="dotdash", "rw"="dashed")) 
    print(plt) 

此代碼作品,當這些行被刪除時:

scale_colour_manual(name="what", values=c("vns"="#A8A8A8", "gibbs"="#E8E8E8", "rw"="#C8C8C8")) + 
scale_fill_manual(name="what", values=c("vns"="#A8A8A8", "gibbs"="#E8E8E8", "rw"="#C8C8C8"))+ 
scale_linetype_manual(name="what", values=c("vns"="solid", "gibbs"="dotdash", "rw"="dashed")) 

我得到以下錯誤與我的真實數據。用玩具數據,它工作正常。

Error in grid.Call.graphics(L_lines, x$x, x$y, index, x$arrow) : 
    invalid line type 

隨着玩具數據,它工作正常。然而,需要將水平線添加到圖例中,並刪除了圖例名稱。因此,我在這裏做了我提供真實的數據:https://dl.dropboxusercontent.com/u/13564139/vns.savedhttps://dl.dropboxusercontent.com/u/13564139/rw.savedhttps://dl.dropboxusercontent.com/u/13564139/gibbs.saved

任何想法,只能用真實的數據,而不是玩具數據導致此錯誤,爲什麼?我已經按照其他一些帖子中的建議重新啓動了。

enter image description here

+0

你能否包含完整的'ggplot'代碼? – Jaap

+0

這是完整的代碼。我可能會重新排列它,以便三條線與其他線保持一致。我希望你現在很清楚。 – dorien

+0

我還沒有看到完整的'ggplot'代碼。這通常開始於'ggplot(data = vns,aes(x = x,y = y))+ geom_line()+ scale_fill_manual()'。在這一刻,我只是一些「規模」代碼。 – Jaap

回答

5

在你的玩具的數據,該what列有值"vns""gibbs""rw"。在您的實際數據中,它是"VNS","GS""RW"。您在scale_*調用中的映射適用於玩具數據,但由於名稱不同,所以實際數據會失敗。您需要

scale_linetype_manual(name="what", values=c("VNS"="solid", "GS"="dotdash", "RW"="dashed")) 

線型是一個錯誤,因爲顏色和填充既可以處理值爲缺失(這是因爲它沒有被映射到的東西)的人,但一丟失的線型是一個錯誤。

+0

OMG!你解決了它。我一直在看這個已經四個小時了......總體感覺。關於如何從圖例中刪除標題的任何想法? – dorien

+0

另外,您不需要將名稱放在引號中。 'values = c(VNS =「solid」,GS =「dotdash」,RW =「dashed」)'工作正常。 – jlhoward

+0

啊,超級,你讓我的晚上! ps,主題(legend.title = element_blank())適用於圖例標題。 – dorien