2011-10-22 119 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