2013-11-04 73 views
1

我有一個ggplot2情節,通過兩個變量對數據進行分組,我想對標籤文本的格式進行一些控制。下面使用nlme軟件包中的Oxboys數據集來說明這個問題。我在數據中添加了一個名爲'label'的列,以便'Subject'和'label'的組合可以唯一標識'Subject'。在我實際使用的數據中,感興趣的兩個變量是唯一識別網格上的點的x,y座標,因此下面是對輸出格式的奇怪建議。如何格式化ggplot2圖例中的標籤?

以上面的圖例項目爲例,我們如何重新格式化它以顯示: 「10 10」或「10,10」或「10ºN,10ºW」*?有什麼方法可以利用sprintf(),或者你能完全想到另一種方式嗎?

一種解決方法是在數據框中創建一個新列以定義組並提供標籤。這會比直接在gglpot中進行格式化的工作少嗎?

library(nlme) 
library(ggplot2) 
df <- transform(Oxboys, label = Subject) 
p <- ggplot(df, aes(x = Occasion, y = height, 
        group = interaction(Subject, label), 
        color = interaction(Subject, label))) 
p + geom_line() 

enter image description here

*關於改變圖例標題的答案獎勵積分。

回答

0

一種解決方法是在數據框中創建一個新列以定義組並提供標籤。

這沒什麼錯,而且它隱含地使用了interaction。如果你執着於interaction出於某種原因,你可以指定一個分隔符:

interaction(Subject, label, sep=" ") # 10 10 

但是,正如你建議它會更好,只是做在您的數據創建一個明確列:

df$Group <- paste(df$Subject, "N ", df$label, "W") # 10N 10W 

然後,你只需在你的審美映射中使用它。這當然給了傳奇的「組」冠軍,但你可以通過只命名的適度規模更改圖例標題:

p + scale_color_discrete("Your Title") 
0

你也可以在哈德利的plyr包中使用revalue,我相信寫正是爲了這個目的。

library(plyr) 

# Rename Subject column 
replace.Subject <- sapply(levels(df$Subject), function(x) paste0(x, " N")) 
df$Subject <- revalue(df$Subject, replace.Subject) 

# Rename label column 
replace.label <- sapply(levels(df$label), function(x) paste0(x, " W")) 
df$label <- revalue(df$label, replace.label)