【问题标题】:How to make a Pareto chart (aka rank-order chart) with ggplot2如何使用 ggplot2 制作帕累托图(又名排序图)
【发布时间】:2015-06-12 23:56:36
【问题描述】:

我发现“使用开源工具进行数据分析”一书中的排名顺序图(也称为帕累托图)非常有用。所以我尝试用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。但在等级顺序图中,USpercentage 约为 45%,表明销售额在美国的销售额占总销售额的 45%。

因此,我不应该使用stat_ecdf 来绘制排名图。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    有一些很好的讨论 here 关于为什么用两个不同的 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()
    

    # 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多