r - 计算多列上的多个 Pareto 图

标签 r ggplot2 data.table pareto-chart

我想出了如何创建帕累托图,但问题是,如果我有一个需要计算和显示帕累托聊天的表格,我就会陷入困境。

dt <- data.table( YEAR = c("2001", "2000", "2001", "2001","1999", "2000", "2000", "1999", "1999"),
                Col1=sample(0:30, 8, rep=TRUE),
                Col2 =sample(0:45, 8, rep=TRUE),
                col33 =sample(0:60, 8, rep=TRUE)
)

例如,我希望每个 Col 变量都有一个图表,并且最好一起显示。

我计算单个图表的代码是:

Col1_gain <- dt[YEAR=="1999"][order (-Col1)]
Col1_gain<-Col1_gain[, !c("Col2","Col33")]
Col1_gain <- Col1_gain[, `:=` (paret=(cumsum(Col1_gain$Col1))*100/sum(Col1_gain$Col1), cum=(cumsum(Col1_gain$Col1)))]
Col1_gain$ID <- seq.int(nrow(Col1_gain))
Col1_pareto <- ggplot(Col1_gain, aes (x=ID/nrow(Col1_gain)))+ geom_line(aes(y=paret), size=1, color="firebrick")
Col1_pareto

最佳答案

根据我对绘制帕累托图的代码的理解,您将隔离一年,然后绘制以百分比表示的累积总和。

因此,如果您想在多年和多列中执行此操作,您需要首先将数据表转换为更长的格式(这里我使用 pivot_longer 中的 tidyr 但您可以使用melt 来自 data.table )。

然后,我将按年份和分类变量“Var”(包含 Col1、Col2...)对您的数据进行分组,并将该值表示为总数的百分比,并将累计总和表示为百分比。我还创建了一个计数,它基本上是行号,以便将其用作 x 轴。

最后,我使用这些新变量来制作条形图和线条。我使用 facet_wrap 分隔“年” 。总而言之,你可以写这样的东西:

dt %>% pivot_longer(., -YEAR, names_to = "Var", values_to = "Val") %>%
  group_by(YEAR, Var) %>%
  arrange(desc(Val), .by_group = TRUE) %>%
  mutate(CumS = cumsum(Val), Count = row_number()) %>%
  mutate(CumS2 = CumS*100 / sum(Val)) %>%
  mutate(Val_Percent = Val*100/sum(Val)) %>%
  ggplot(aes(x = as.factor(Count), y = Val_Percent, fill = Var))+
  geom_col(position = position_dodge())+
  facet_wrap(.~YEAR)+
  geom_line(aes(y = CumS2, group = Var, color = Var), position = position_dodge(.9))+
  theme(axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank())

enter image description here

或者,如果您想获得每个“Col”和每个“Year”的帕累托图,您可以执行完全相同的操作,然后使用 facet_grid而不是facet_wrap :

dt %>% pivot_longer(., -YEAR, names_to = "Var", values_to = "Val") %>%
  group_by(YEAR, Var) %>%
  arrange(desc(Val), .by_group = TRUE) %>%
  mutate(CumS = cumsum(Val), Count = row_number()) %>%
  mutate(CumS2 = CumS*100 / sum(Val)) %>%
  mutate(Val_Percent = Val*100/sum(Val)) %>%
  ggplot(aes(x = as.factor(Count), y = Val_Percent, fill = Var))+
  geom_col(position = position_dodge())+
  facet_grid(Var~YEAR)+
  geom_line(aes(y = CumS2, group = Var, color = Var), position = position_dodge(.9))+
  theme(axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank())

enter image description here

它能回答你的问题吗?

关于r - 计算多列上的多个 Pareto 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59981262/

相关文章:

r - 当接收到 left_join 和 merge 的错误时,如何将数据帧与空间数据帧组合?

r - 如何从变量传递 ggplot2 美学?

r - 更改 ggplot2 中单个方面的文本颜色

r - 在 df2 的日期时间中使用 df1 的 "hour"和 "min"上的条件合并 2 个数据帧

r - 在函数内部使用 `setkey()`

r - 构建 data.table 列表列的滚动聚合

mysql - RMySQL - 从列表中存在值的数据库中选择数据

r - 面标签字体大小

r - 调整图例的宽度以进行连续变量

r - 如何制作只对特定区域着色的等高线图?