我在制作我认为应该是一个相当简单的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")
通过“第一个值”对实例进行排序,但这很危险(如果订单发生变化会怎样?)并且读者不清楚。
什么是更优雅的解决方案?
答案 0 :(得分:3)
我确信有一种比这更好的方法,但让Instance
和ordered
一起工作,即使数据发生变化也会继续有效:
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")