如何用ggplot2制作帕累托图(又名排序图)

Zel*_*ong 5 r ggplot2

我发现"使用开源工具进行数据分析"一书中的排序图表(也称为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但秩顺序图表中,所述percentageUS是约45%,这表明在销售US占用总销售额的45%.

因此,我不应该使用stat_ecdf绘制排序图表.

jos*_*ber 3

这里有一些关于为什么使用两个不同 y 轴绘图是一个坏主意的很好的讨论。我将限制分别绘制销售额和累积百分比,并将它们并排显示,以提供帕累托图的完整视觉表示。

# 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述