1

我设法创建了一个帕累托图,但是,我想改进某些事情,但我缺乏这样做的技能。也许有人可以快速查看图表并让我知道,如果

  1. 我可以在右侧 y 轴上,累积频率(%)在哪里,我可以在数字后面加上百分比符号?这样我可以删除轴标题,这会很棒

  2. 如果不可能 1 号,我怎样才能使正确的 y 轴标题更大?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")

输出

帕累托图

4

1 回答 1

1

我喜欢你的问题,你已经付出了很大的努力来用可重现的示例和工作代码提出一个好问题(除了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(and df) 包含值的整个范围;即如果您有 8 个或 10 个或更多故障,但只想显示 6 个主要故障,则累积和百分比的计算将是错误的。

于 2021-02-09T09:29:37.917 回答