我一直在努力学习如何使用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")
Run Code Online (Sandbox Code Playgroud)
数据帧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"))
Run Code Online (Sandbox Code Playgroud)
返回:
alt text http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp1.png
但它仍然不是帕累托图.有小费吗?
我发现"使用开源工具进行数据分析"一书中的排序图表(也称为Pareto图表)非常有用.所以我试着用ggplot2绘制书中的例子.
书中给出了下图,注意坐标被翻转,使得国家的名称显示在Y轴上,更具可读性.虚线是数据的CDF(累积分布函数).
(来源:使用开源工具进行数据分析)
要制作部分模拟数据:
country = c('US', 'Brazil', 'Japan', 'India', 'Germany', 'UK', 'Russia', 'France')
sales = c(40, 14, 7, 6, 2.8, 2, 1.8, 1)
# The data is already sorted
df = data.table(country=country, sales=sales)
Run Code Online (Sandbox Code Playgroud)
然后我用stat_ecdfggplot2来绘制CDF:
ggplot(data=df) + stat_ecdf(aes(x=sales))
Run Code Online (Sandbox Code Playgroud)
但这个数字看起来像:

X轴显示销售量但不显示国家/地区.
我发现了另一种实现方式在这里.但它是通过折线图和明确的累积和实现的,这看起来与书中的例子完全不同.
是否有方法将帕累托图绘制为第一个数字?
我对虚线的内涵犯了一个错误.它不是CDF,而是累积比例.
在一个CDF,它的值映射到其百分等级,的百分等级US为100但秩顺序图表中,所述percentage的US是约45%,这表明在销售US占用总销售额的45%.
因此,我不应该使用stat_ecdf绘制排序图表.