【问题标题】:How can I wrap a ggplot column n times after hitting threshold number达到阈值后如何将 ggplot 列包装 n 次
【发布时间】:2019-08-18 05:15:00
【问题描述】:

我有一个条形图,其中一个条目比其他条目大得多,以至于很难对其他较小值的数据点进行有趣的分析。

plt <- ggplot(dffd[dffd$Month==i & dffd$UniqueCarrier!="AA",],aes(x=UniqueCarrier,y=1,fill=DepDelay))+
  geom_col()+
  coord_flip()+
  scale_fill_gradientn(breaks=late_breaks,labels=late_breaks,limits=c(0,150),colours=c('black','yellow','orange','red','darkred'))

当我删除它时,我又回到了一个有趣的解释程度,但现在我丢弃了一半以上的数据,并且可以说是最重要的要探索的数据。

我想知道是否有一种方法可以在我的条形图上设置一个间隔,在这种情况下说 500,之后我可以在它下面为同一条目开始另一列并继续构建我的条形图。在此示例中,这将在此转换为 WN 分成 3 个长度为 500 500 和 ~400 的条,一个在另一个下方堆叠在一个 WN 标签下(理想情况下,它显示所有三个的一个刻度)。由于我还有其他几个大得不成比例的代表,因此在绘图过程中将其作为一个图层进行绘制是我非常感兴趣的。

【问题讨论】:

  • 可以dput(dffd)分享数据吗?
  • @RonakShah 文件本身很大,所以这里有一个包含 1000 个随机样本行的 dput pastebin.com/uQrCCCmA
  • 最初我会遍历每个月以填充此数据 (==i),因此如果您将 i 替换为 1 到 12 之间的特定整数,您可以只打印特定月份。

标签: r ggplot2 plot bar-chart


【解决方案1】:

通常,当您的数据集中有这样不成比例的值时,您应该将您的值放在log 刻度上(或使用其他一些转换)或使用coord_cartesian 放大图。我认为您可能可以随意破解并创建所需的情节,但在可视化和分析方面会产生很大的误导。

编辑:

根据您的 cmets,我有一个相当老套的解决方案。您粘贴的数据不能直接使用(dput 的一部分丢失了 + 没有 DepDelay 列,所以我即兴创作)。

这个想法是根据UniqueCarrier 列和您想要的max 数量创建一个额外的标签列。

df2 <- df %>%
    filter(UniqueCarrier != "AA" & Month == i) %>%
    group_by(UniqueCarrier) %>% 
    mutate(tag = paste(UniqueCarrier, rep(seq(1, n()%/%500+1), each=500), sep="_")[1:n()])

这会添加一个tag 列,基本上说明您将在每个类别中拥有多少列。

plt <- ggplot(df2, aes(x=tag, y=1, fill=DepDelay)) +
    geom_col() +
    coord_flip() +
    scale_fill_gradientn(breaks=late_breaks, labels=late_breaks,
                         limits=c(0,150),
    colours=c('black','yellow','orange','red','darkred')) +
    scale_x_discrete(labels=str_replace(sort(unique(df2$tag)), "_[:digit:]", ""))
plt

在上图中,我使用了 CarrierDelay,中断间隔为 100。您可以看到 WN 标签然后重复 - 有一些方法可以删除多余的标签(scale_x_discrete 中的一些更有创意的替换标签。 如果您希望列的顺序不同,只需将seq(1, n()%/%500+1) 替换为seq(n()%/%500+1, 1)

【讨论】:

  • 我的第一个直觉是也使用对数图,但是对于条形图,我无法获得图中每个项目的分界线,而像这样的柱形图,我已经分配了一个当我尝试应用 scale_y_log10() 时,每个项目的值 1 以模拟计数,它将对数变换应用于每个 y=1 值而不是最终计数(这使得 y 值 0 并且所有条形的长度都变为 0 )
  • 我明白你的意思 - 在这种情况下,coord_cartesian 似乎是一个更好的选择,您可以先显示完整的图表,然后再显示放大的图表。
  • 话虽如此,在某些情况下这种类型的情节很有用,因为它是一种保护区域的方式,所以如果你知道如何去做这可能会有所帮助。一个例子是在这个视频upload.wikimedia.org/wikipedia/commons/transcoded/1/1b/… 4:30 左右
猜你喜欢
  • 2021-04-10
  • 2018-07-12
  • 1970-01-01
  • 2017-11-29
  • 2016-06-18
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多