根据我对绘制一个帕累托图的代码的理解,您正在隔离一年,然后绘制以百分比表示的累积总和。
因此,如果您想为多年和多列执行此操作,您首先需要将数据表转换为更长的格式(这里我使用pivot_longer
fromtidyr
但您可以使用 from 做同样的事情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())
或者,如果您想获得每个“Col”和每个“Year”的帕累托图,您可以执行完全相同的操作,然后使用 offacet_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())
它回答了你的问题吗?