ggplot2 中的帕累托图

Pareto graph in ggplot2

我设法创建了帕累托图,但是,我想改进某些事情,但我缺乏这样做的技能。如果

,也许有人可以快速查看图表并告诉我
  1. 我可以在右边y-axis,其中累积频率(%)是,我可以在数字后面加上百分比符号吗?这样我就可以删除轴标题,这会很棒

  2. 如果第 1 条不可行,我怎样才能使右边的 y-axis 标题变大? size = 12 无法输入,我不确定结果如何。我也在考虑轮换标题,但我还是不确定这是否可行

  3. 是否可以旋转 A,B,C,D... 标签,使它们不是垂直而是水平?

  4. 我想知道是否可以选择在条形上方添加相对频率,以及在红色曲线上代表累积频率的点上方的百分比?

最小示例

set.seed(42)  ## for sake of reproducibility
c <- data.frame(value=factor(paste("value", 1:n)),counts=sample(18:130, n, replace=TRUE))

排列图的累积频率

# It's maybe not the most elegant way of doing it but it works
# If someone can offer an alternative, that would be nice

df <- data.frame(c,stringsAsFactors = FALSE)

df <- df[order(df$counts,decreasing=TRUE), ]

df$value <- factor(df$value, levels=df$value)

df$cumulative <- cumsum(df$counts)

df$cumulative <- 100 * df$cumulative/tail(df$cumulative, n=1)

scaleRight <- tail(df$cumulative, n=1)/head(df$counts, n=1)

ggplot 中的帕累托图

ggplot(df, aes(x=value)) +  theme_bw()+
  geom_bar(aes(y=counts, fill=value), stat="identity",show.legend = FALSE) +
  geom_path(aes(y=cumulative/scaleRight, group=1),colour="red", size=0.9) +
  geom_point(aes(y=cumulative/scaleRight, group=1),colour="red") +
  scale_y_continuous(sec.axis = sec_axis(~.*scaleRight, name = "Cumulative (%)"), n.breaks = 9) +
  theme(axis.text.x = element_text(angle=90, vjust=0.6)) +
  theme(
        legend.title = element_blank(),
        plot.title = element_text(hjust = 0.5),
        panel.background =element_blank(),panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.title.x=element_blank(),
        axis.text.x = element_text(size=12),
        axis.text.y = element_text(size=12)) +
  scale_color_grey(start=0, end=.6)+scale_fill_grey()+ ylab("Counts")

输出

我喜欢你的问题,你付出了很大的努力通过可重现的示例和工作代码提出了一个很好的问题(除了 n 没有定义,但通常我可以数到 7) .

首先,我冒昧地使用 tidyverse 的 dplyr 重构了您的数据操作代码。它使阅读更加简洁。我还避免将您的累计百分比乘以 100,您会明白为什么。另外,我没有得到和你一样的值。

set.seed(42)  ## for sake of reproducibility
n <- 6
c <- data.frame(value=factor(paste("value", 1:n)),counts=sample(18:130, n, replace=TRUE))
dput(c)
structure(list(value = structure(1:6, .Label = c("value 1", "value 2", 
"value 3", "value 4", "value 5", "value 6"), class = "factor"), 
    counts = c(66L, 118L, 82L, 42L, 91L, 117L)), class = "data.frame", row.names = c(NA, 
-6L))

df <- c %>%
  arrange(desc(counts)) %>%
  mutate(
    value = factor(value, levels=value),
    cumulative = cumsum(counts) / sum(counts)
  ) 

df
    value counts cumulative
1 value 2    118  0.2286822
2 value 6    117  0.4554264
3 value 5     91  0.6317829
4 value 3     82  0.7906977
5 value 1     66  0.9186047
6 value 4     42  1.0000000

你指的A、B、C、D标签,我假设是x轴标签。这些已通过命令(在您的代码中!)旋转了四分之一 - 导致它的是 angle=90

theme(axis.text.x = element_text(angle=90, vjust=0.6))

总而言之,我提出以下解决方案:

f <- max(df$counts) # or df$counts[1], as it is sorted descendingly

ggplot(df, aes(x=value)) +  theme_bw(base_size = 12)+
  geom_bar(aes(y=counts, fill=value), stat="identity",show.legend = FALSE) +
  geom_path(aes(y=cumulative*f, group=1),colour="red", size=0.9) +
  geom_point(aes(y=cumulative*f, group=1),colour="red") +
  scale_y_continuous("Counts", sec.axis = sec_axis(~./f, labels = scales::percent), n.breaks = 9) +
  scale_fill_grey() +
  theme(
    axis.text = element_text(size=12),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.title.x=element_blank()
  )

回答问题:

添加标签可以使用 geom_text:

geom_text(aes(label=sprintf('%.0f%%', cumulative*100), y=cumulative*f), colour='red', nudge_y = 5) +
geom_text(aes(label=sprintf('%.0f%%', counts/sum(counts)*100), y=counts), nudge_y = 5) +

请注意 nudge_y 的使用 - 这个可能很难,因为它适用于主要的 y 轴刻度,所以在这里微调“5”个单位是有道理的,但如果你的计数在千,“5”不够。

请注意 此处给出的解决方案仅在 c(和 df)包含整个值范围时有效;即如果你有8个或10个或更多故障,但只想显示6个主要故障,则累计和和百分比的计算将是错误的。