通过ggplot2绘图的多维数据重新排序

时间:2012-10-29 18:03:17

标签: r ggplot2

我在制作我认为应该是一个相当简单的ggplot2图表时遇到一些麻烦。

我在数据框中有一些实验数据。每个数据条目都由正在测量的系统识别,并且运行它的实例(问题)。每个条目还具有针对特定系统和实例测量的值。

例如:

mydata <- data.frame(System=c("a","b","a","b","a","b"), Instance=factor(c(1,1,2,2,3,3)), Value=c(10,5,4,2,7,8))

现在,我想在一个箱形图中绘制这些数据,其中x轴包含实例标识符,条形图的颜色表示该值的系统。条形高度应按数据框中的值加权。

这几乎可以满足我的需求:

qplot(data=mydata, weight=Value, Instance, fill=System, position="dodge")

我想做的最后一件事是对条形图进行重新排序,使它们按系统A的值排序。但是,我无法找到一种优雅的方法来做到这一点。

我的第一直觉是使用qplot(data=mydata, weight=Value, reorder(Instance, Value), fill=System, position="dodge"),但这将按每个实例的mean值排序,我只想使用A中的值。我可以使用qplot(data=mydata, weight=Value, reorder(Instance, Value, function(x) { x[1] } ), fill=System, position="dodge")通过“第一个值”对实例进行排序,但这很危险(如果订单发生变化会怎样?)并且读者不清楚。

什么是更优雅的解决方案?

1 个答案:

答案 0 :(得分:3)

我确信有一种比这更好的方法,但让Instanceordered一起工作,即使数据发生变化也会继续有效:

qplot(data=mydata, weight=Value, 
 ordered(Instance,
 levels=mydata[System=='a','Instance'] [order(mydata[System=='a','Value'])])
,fill=System, position="dodge")

也许是一种稍微优雅的写作方式:

qplot(data=mydata, weight=Value, 
ordered(Instance,
levels=Instance [System=='a'] [order(Value [System=='a'])]) # Corrected
,fill=System, position="dodge")