我发现“使用开源工具进行数据分析”一书中的排序图表(也称为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)
然后我使用ggplot2中的stat_ecdf
来绘制CDF:
ggplot(data=df) + stat_ecdf(aes(x=sales))
但这个数字看起来像是:
X轴显示销售额但不显示国家/地区。
我找到了另一个实现here。但它是由折线图和显式累积和实现的,这与本书中的例子看起来完全不同。
是否有方法将帕累托图绘制为第一个数字?
我对虚线的内涵犯了一个错误。它不是CDF,而是累积比例。
在将值映射到其百分等级的CDF中,US
的百分等级为100.但在排名顺序图中,percentage
的{{1}}是关于45%,表明美国的销售额占总销售额的45%。
因此,我不应该使用US
绘制排名顺序图。
答案 0 :(得分:2)
关于为什么用两个不同的y轴进行绘图是一个坏主意,有一些很好的讨论here。我将限制分别绘制销售额和累积百分比,并将它们彼此相邻显示,以提供帕累托图表的完整视觉表示。
# Sales
df <- data.frame(country, sales)
df <- df[order(df$sales, decreasing=TRUE),]
df$country <- factor(df$country, levels=as.character(df$country)) # Order countries by sales, not alphabetically
library(ggplot2)
ggplot(df, aes(x=country, y=sales, group=1)) + geom_path()
# Cumulative percentage
df.pct <- df
df.pct$pct <- 100*cumsum(df$sales)/sum(df$sales)
ggplot(df.pct, aes(x=country, y=pct, group=1)) + geom_path() + ylim(0, 100)