我一直在努力学习如何使用ggplot2包在R中制作Pareto Chart . 在制作条形图或直方图的许多情况下,我们需要按X轴排序的项目 . 在帕累托图中,我们希望按Y轴中的值降序排序的项目 . 有没有办法让ggplot绘制由Y轴上的值排序的项目?我首先尝试排序数据框,但似乎ggplot重新排序它们 .
例:
val <- read.csv("http://www.cerebralmastication.com/wp-content/uploads/2009/11/val.txt")
val<-with(val, val[order(-Value), ])
p <- ggplot(val)
p + geom_bar(aes(State, Value, fill=variable), stat = "identity", position="dodge") + scale_fill_brewer(palette = "Set1")
数据帧val已排序,但输出如下所示:
alt text http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp.png
哈德利正确地指出,这会产生一个更好的图形来显示实际与预测:
ggplot(val, aes(State, Value)) + geom_bar(stat = "identity", subset = .(variable == "estimate"), fill = "grey70") + geom_crossbar(aes(ymin = Value, ymax = Value), subset = .(variable == "actual"))
返回:
alt text http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp1.png
但它仍然不是帕累托图 . 有小费吗?
7 回答
ggplot2中的条形按因子中的级别顺序排序 .
对数据进行子集和排序;
从那里它只是一个标准
boxplot()
,顶部有一个非常手动的累积功能:它应该是这样的
alt text http://dirk.eddelbuettel.com/misc/jdlong_pareto.png
并且它甚至不需要过度绘制技巧,因为
lines()
愉快地注释了初始情节 .ggplot2中的传统帕累托图.......
阅读Cano,E.L . ,Moguerza,J.M . ,&Redchuk,A . (2012)后开发 . Six Sigma with R.(G . Robert,K . Hornik,&G . Parmigiani,Eds . )Springer .
举个简单的例子:
barplot(data)
做得对ggplot等效"should be":
qplot(x=names(data), y=data, geom='bar')
但是,这会错误地按字母顺序对条形图进行重新排序/排序...因为这就是
levels(factor(names(data)))
的排序方式 .解决方案:
qplot(x=factor(names(data), levels=names(data)), y=data, geom='bar')
唷!
另外,请参阅包含qcc的包__具有函数
pareto.chart()
. 看起来它也使用基本图形,所以开始你的ggplot2解决方案的赏金:-)为简化起见,我们只考虑估算 .
首先,我们重新排序因子水平,以便按
Value
的降序绘制State
.同样,我们重新排序数据集并计算累积值 .
现在我们准备绘制情节了 . 在同一轴上获取直线和条的技巧是将State变量(一个因子)转换为数字 .
正如问题所述,试图绘制两个彼此相邻的变量组的帕累托图非常简单 . 如果你想要多个帕累托图,你最好不要使用刻面 .