2011-10-22 81 views
0

我正在使用ggplot生成總結由幾圈組成的比賽的圖表。比賽中有24名參賽者,編號爲1-12,14-25;我正在繪製每個參與者使用ggplot的彙總度量,但ggplot假定我想要的數字範圍是1-25,而不是類別1-12,14-25。忽略ggplot2中缺失的x軸值(將範圍轉換爲分類變量)

這是什麼修復?以下是我使用的代碼(數據來源於Google電子表格)。

sskey='0AmbQbL4Lrd61dHlibmxYa2JyT05Na2pGVUxLWVJYRWc' 
library("ggplot2") 
require(RCurl) 

gsqAPI = function(key,query,gid){ return(read.csv(paste(sep="", 'http://spreadsheets.google.com/tq?', 'tqx=out:csv', '&tq=', curlEscape(query), '&key=', key, '&gid=', curlEscape(gid)))) } 


sin2011racestatsX=gsqAPI(sskey,'select A,B,G',gid='13') 
sin2011proximity=gsqAPI(sskey,'select A,B,C',gid='12') 

h=sin2011proximity 
k=sin2011racestatsX 
l=subset(h,lap==1) 

ggplot() + 
geom_step(aes(x=h$car, y=h$pos, group=h$car)) + 
scale_x_discrete(limits =c('VET','WEB','HAM','BUT','ALO','MAS','SCH','ROS','SEN','PET','BAR','MAL','','SUT','RES','KOB','PER','BUE','ALG','KOV','TRU','RIC','LIU','GLO','AMB'))+ 
xlab(NULL) + opts(title="F1 2011 Korea \nRace Summary Chart", axis.text.x=theme_text(angle=-90, hjust=0)) + 
geom_point(aes(x=l$car, y=l$pos, pch=3, size=2)) + 
geom_point(aes(x=k$driverNum, y=k$classification,size=2), label='Final') + 
geom_point(aes(x=k$driverNum, y=k$grid, col='red')) + 
ylab("Position")+ 
scale_y_discrete(breaks=1:24,limits=1:24)+ opts(legend.position = "none") 
+0

將x變量轉換爲因子。 – joran

回答

2

擴大我的神祕評論,試試這個:

#Convert these to factors with the appropriate labels 
# Note that I removed the '' 
h$car <- factor(h$car,labels = c('VET','WEB','HAM','BUT','ALO','MAS','SCH','ROS','SEN','PET','BAR','MAL', 
           'SUT','RES','KOB','PER','BUE','ALG','KOV','TRU','RIC','LIU','GLO','AMB')) 
k$driverNum <- factor(k$driverNum,labels = c('VET','WEB','HAM','BUT','ALO','MAS','SCH','ROS','SEN','PET','BAR','MAL', 
           'SUT','RES','KOB','PER','BUE','ALG','KOV','TRU','RIC','LIU','GLO','AMB')) 
l=subset(h,lap==1) 

ggplot() + 
    geom_step(aes(x=h$car, y=h$pos, group=h$car)) + 
    geom_point(aes(x=l$car, y=l$pos, pch=3, size=2)) + 
    geom_point(aes(x=k$driverNum, y=k$classification,size=2), label='Final') + 
    geom_point(aes(x=k$driverNum, y=k$grid, col='red')) + 
    ylab("Position") + 
    scale_y_discrete(breaks=1:24,limits=1:24) + opts(legend.position = "none") + 
    opts(title="F1 2011 Korea \nRace Summary Chart", axis.text.x=theme_text(angle=-90, hjust=0)) + xlab(NULL) 

調用scale_x_discrete不再是必要的。在風格上,我更喜歡把optsxlab的東西放在最後。

enter image description here

編輯

的幾個注意事項響應您的評論。您可以通過更簡化地使用ggplot來緩解您的許多困難。您的數據格式尷尬:

#Summarise so we can use geom_linerange rather than geom_step 
d1 <- ddply(h,.(car),summarise,ymin = min(pos),ymax = max(pos)) 

#R has a special value for missing data; use it! 
k$classification[k$classification == 'null'] <- NA 
k$classification <- as.integer(k$classification) 

#The other two data sets should be merged and converted to long format  
d2 <- merge(l,k,by.x = "car",by.y = "driverNum") 
colnames(d2)[3:5] <- c('End of Lap 1','Final Position','Grid Position') 
d2 <- melt(d2,id.vars = 1:2) 

#Now the plotting call is much shorter  
ggplot() + 
    geom_linerange(data = d1,aes(x= car, ymin = ymin,ymax = ymax)) + 
    geom_point(data = d2,aes(x= car, y= value,shape = variable),size = 2) + 
    opts(title="F1 2011 Korea \nRace Summary Chart", axis.text.x=theme_text(angle=-90, hjust=0)) + 
    labs(x = NULL, y = "Position", shape = "") 

有一些注意事項。您是美學設定爲固定值(size = 2),應完成之外的aes()aes()用於將變量(即列)映射到美學(顏色,形狀,大小等)。這允許ggplot智能地爲你創建圖例。

合併後面的兩個數據集,然後melt創建一個用於圖例中的ggplot的分組變量。由於幾個值重疊,我使用了形狀審美;使用顏色可能難以辨認。一般來說,ggplot將抵制混合美學成一個傳說。如果你想使用形狀,顏色和大小,你會得到三個傳說。

我更喜歡使用labs設置標籤,因爲您可以在一個位置完成所有標籤。請注意,將美學標籤設置爲""將刪除圖例標題。 enter image description here

+0

太好了 - 謝謝......讓我困惑的另一件事是傳說;有沒有一種方法可以定義單個(或不包含)圖例標題,並將例如「網格位置」指定爲小紅點,「最終位置」指定爲大黑點,可能(但可選)「第1圈結束」到+? – psychemedia

+0

@psychemedia看我的編輯。 – joran

+0

喬蘭 - 精彩 - 謝謝你;我仍然在與我的心智模式一起對抗ggplot是如何工作的(並且我對基本R操作的理解仍然非常勉強),所以解釋/指導(例如,對aes vs labs)非常感激。 爲什麼我混合顏色/形狀有幾個原因;一個是探索分層,另一個是建立一個圈爲「終端」位置和顏色爲GRID與最終位置的公約,我認爲這很容易閱讀;在上面,這三個符號讓我感到更困惑/更多的工作讓讀者去識別和解碼它們? – psychemedia