2014-03-05 127 views
1

我試圖在ggplot2中繪製隨機測試分數數據。分數按考試,年級和年級分列。當我運行下面的腳本時,Y軸顯示一個不需要的範圍。也就是說,範圍是無序的,而我希望它以固定的時間間隔從低到高排列。通常情況下,ggplot2在默認情況下會執行此操作,但關於數據框或我不知道的設置導致此情況不會發生。ggplot2:如何幫助ggplot2顯示正確的y軸範圍?

grade <- rep(c(5,6,7,8,9),times=6) 
years <- rep(c(2008,2009,2010), each=10) 
tests <- rep(c("English","Math"),times=3,each=5) 
scores <- c(3.3,7.6,10.8,4.8,3.0,-2.8,14.8,12.4,0.3,6.0,7.0,3.1,3.7,-0.5,0.6,6.2,9.6,5.3,1.9,1.3,1.1,0.0,5.5,6.2,0.3,-0.4,2.2,4.9,4.7,2.6) 

data2 <- data.frame(cbind(years,grade,tests,scores)) 

graph_2 <- ggplot(data=data2, aes(x=years, y=scores)) + 
     geom_point(aes(color=factor(interaction(grade,tests)),size=1)) + 
     geom_line(aes(group=interaction(tests,grade), color=factor(interaction(grade,tests)))) + 
     facet_grid(. ~ grade) 

graph_2 

我想也許這GGPLOT2認爲是數據是離散的,但是當我試圖is.factor(scores),R控制檯返回FALSE

+1

可以將'color'審美移動到頂層'ggplot'對象,(使得代碼短)和我會用'facet_wrap'用'NcoI位= 1':'graph_2 < - ggplot( data = data2,aes(x = years,y = scores,color = factor(interaction(grade,tests)))+ geom_point(size = 1)+ geom_line(aes(group = interaction(tests,grade)))+ facet_wrap(〜grade,nrow = 1)' –

回答

3

問題是您的數據不是ggplot()。當您創建數據框時,您使用data.frame()中的功能cbind()。這使得所有的列成爲因素,因爲函數cbind()在這種情況下產生具有相同類型 - 字符的所有數據的矩陣。函數data.frame()生成數據幀,但所有字符列都轉換爲因子。

data2 <- data.frame(cbind(years,grade,tests,scores)) 
str(data2) 
'data.frame': 30 obs. of 4 variables: 
$ years : Factor w/ 3 levels "2008","2009",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ grade : Factor w/ 5 levels "5","6","7","8",..: 1 2 3 4 5 1 2 3 4 5 ... 
$ tests : Factor w/ 2 levels "English","Math": 1 1 1 1 1 2 2 2 2 2 ... 
$ scores: Factor w/ 28 levels "-0.4","-0.5",..: 17 27 10 20 15 3 12 11 5 24 ... 

如果刪除cbind(),數字列被視爲數字和情節看起來如預期。

data2 <- data.frame(years,grade,tests,scores) 
str(data2) 
'data.frame': 30 obs. of 4 variables: 
$ years : num 2008 2008 2008 2008 2008 ... 
$ grade : num 5 6 7 8 9 5 6 7 8 9 ... 
$ tests : Factor w/ 2 levels "English","Math": 1 1 1 1 1 2 2 2 2 2 ... 
$ scores: num 3.3 7.6 10.8 4.8 3 -2.8 14.8 12.4 0.3 6 ... 
+0

完美!在這裏我想'cbind()'是必要的,這樣好多了。 – Jefftopia

+1

你已經用'data.frame()'把你的變量放在一個數據框中,所以'cbind()'是不必要的。 –