2012-05-08 102 views
14

我想繪製一個曲線與它的幾條曲線。 x軸不是數值,而是字符串。ggplot與X軸上的字符串

這工作正常(如在how to plot all the columns of a data frame in R):

require(ggplot2) 
df_ok <- rbind(data.frame(x=4:1,y=rnorm(4),d="d1"),data.frame(x=3:1,y=rnorm(3),d="d2")) 
ggplot(df_ok, aes(x,y)) + geom_line(aes(colour=d)) 

但是我的數據是這樣的:

require(ggplot2) 
df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d)) 

我得到的錯誤geom_path:每組僅由一種觀察。你需要調整團體審美嗎?。 儘管未出現圖線,但繪製了座標軸,並且x軸包含正確的標籤 - 但也以的錯誤順序

任何想法如何繪製這個儘可能容易? (還要注意某些系列的缺失x值)。

回答

18

你的問題是x變量是一個因素。因此,改變你的數據幀,使x雙:

df = rbind(data.frame(x=4:1,y=rnorm(4),d="d1"), 
      data.frame(x=3:1,y=rnorm(3),d="d2")) 

情節一樣正常

g = ggplot(df, aes(x,y)) + geom_line(aes(colour=d)) 

但改變x軸的明確比例:

g + scale_x_continuous(breaks=1:4, labels=c("one", "two", "three", "four")) 

要重命名你的變量,請嘗試類似於:

x1 = factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
df$x1 = as.numeric(x1) 
+0

我很想不必重塑我的數據。但如果沒有其他人有想法,我會接受這個答案。 – fabb

+1

當我有'df_nok'和想要的'x'命令時,你有沒有想過如何輕鬆地將我的數據重塑爲這種形式? – fabb

+0

如果可以的話,我會讓你滿意。幾乎所有的時候都必須記住'as.is = TRUE'!如果在設置'as.is = TRUE'後日期是字符引起了第二個問題,但可以通過'as.Date()'輕鬆解決。 – ricardo

5

你能說服ggplot加上空組畫線,

ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d, group=d)) 

另見http://kohske.wordpress.com/2010/12/27/faq-geom_line-doesnt-draw-lines/

+1

這不能正常工作。它用彩色段劃分一條線,但不是2條單獨線。 – fabb

+0

它應該是'group = d',而不是'group = 1'。 –

+0

好東西!現在只有訂單錯了(「四」,「一」,「三」,「兩」)。任何快速幫助? – fabb

3

添加group美學(我知道有點多餘,但比重新調整軸標籤要簡單得多)。

df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 

ggplot(df_nok, aes(x,y, group=d)) + geom_line(aes(colour=d)) 

這是真的,你的X軸仍然可能不是你想要的順序。如@csgillespie所述,您可以通過將其設置爲一個因子來修復此問題

df_nok$x <- factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
+0

遲到比一年好一點,對不對?無論如何,這將是像我這樣的人在未來絆倒了這一點。 – Tom

+0

對,謝謝你的補充答案。 – fabb