在多列上计算多个 Pareto 图
Compute multiple Pareto charts on multiple columns
我想出了如何创建 Pareto 图,但问题是如果我有一个 table 需要在其中计算和显示 Pareto 聊天,我就卡住了。
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
根据我对您绘制帕累托图的代码的理解,您分离了一年,然后绘制了以百分比表示的累计总和。
所以,如果你想在多年和多列中这样做,你首先需要将你的数据表转换成更长的格式(这里我使用 tidyr
中的 pivot_longer
但你可以使用 data.table
中的 melt
做同样的事情)。
然后,我将按年份和分类变量 "Var"(包含 Col1、Col2、...)对您的数据进行分组,并将值表示为占总数的百分比和累计总和百分比。我还创建了一个基本上是行号的计数,以便将其用作 x 轴。
最后,我使用这些新变量制作了条形图和线条。我使用 facet_wrap
分隔 "Years"。总之,你可以这样写:
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())
或者,如果您想根据 "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())
它是否回答了您的问题?
我想出了如何创建 Pareto 图,但问题是如果我有一个 table 需要在其中计算和显示 Pareto 聊天,我就卡住了。
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
根据我对您绘制帕累托图的代码的理解,您分离了一年,然后绘制了以百分比表示的累计总和。
所以,如果你想在多年和多列中这样做,你首先需要将你的数据表转换成更长的格式(这里我使用 tidyr
中的 pivot_longer
但你可以使用 data.table
中的 melt
做同样的事情)。
然后,我将按年份和分类变量 "Var"(包含 Col1、Col2、...)对您的数据进行分组,并将值表示为占总数的百分比和累计总和百分比。我还创建了一个基本上是行号的计数,以便将其用作 x 轴。
最后,我使用这些新变量制作了条形图和线条。我使用 facet_wrap
分隔 "Years"。总之,你可以这样写:
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())
或者,如果您想根据 "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())
它是否回答了您的问题?