【问题标题】:Overlay geom_line within a categorical x axis for each group - ggplot2在每个组的分类 x 轴内覆盖 geom_line - ggplot2
【发布时间】:2021-04-14 14:50:24
【问题描述】:

我想制作这样的情节:

方框表示连续变量在组内的分布;红色圆圈是显示所有实际观察的点。到现在为止还挺好。这将是简单的geom_boxplot + geom_point 与群体审美。

这里有两个转折:

  1. 点的水平位置不是随机抖动。它们是使用连续 X 轴而不是分类轴的 X-Y 坐标
  2. 这条线是适合这些点的趋势线。

一些上下文: 该图显示了产品的使用情况(Y 轴)与允许的使用情况(X)。 X 轴组是互斥的离散层,本质上是一个无限的连续使用变量。 EG, 1-4, 5-9, 10-20 等等。从视觉的角度来看,在这些组中绘制连续图对我来说并不疯狂,这有意义吗?但我不知道如何开始让ggplot2 同意我的观点。

我的偏好是让箱形图沿 X 轴均匀分布,但如果我需要从轴连续开始,并让各组在 X 轴上占据成比例的空间,那么我会解决为此(可能使用记录轴以防止较低、较窄的组被完全弄脏

这应该可以作为示例数据:


df <- structure(list(usage = c(1L, 4L, 2L, 5L, 4L, 1L, 2L, 98L, 9L, 
                               4L, 6L, 6L, 1L, 2L, 2L, 2L, 3L, 2L, 5L, 1L), allowed = c(2, 20, 
                                                                                        3, 3, 5, 5, 1, 1, 1, 5, 10, 5, 7, 12, 2, 5, 23, 10, 5, 2), id = c(1055L, 
                                                                                                                                                          2155L, 6637L, 11068L, 2070L, 8524L, 9157L, 5963L, 7593L, 3470L, 
                                                                                                                                                          3557L, 7469L, 9142L, 408L, 9446L, 1552L, 4788L, 7233L, 8464L, 
                                                                                                                                                          2188L), group = c("A", "B", "A", "A", "A", "A", "A", "A", "A", 
                                                                                                                                                                            "A", "B", "A", "B", "B", "A", "A", "B", "B", "A", "A")), row.names = c(NA, 
                                                                                                                                                                                                                                                   -20L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r ggplot2 data-visualization


    【解决方案1】:

    这是我想给你的:

    # you had some values that were = 98 in usage and throwing everything off..
    df <- df %>% dplyr::filter(usage < 50)
    
    p <- 
    ggplot(df, aes(allowed, usage)) +
      geom_boxplot(aes(group=group)) +
      geom_point() +
      geom_smooth(alpha=0, method='lm') +
      facet_wrap(~group, scales='free_x', strip.position = 'bottom') +
      theme_classic() +
      theme(
        axis.text.x = element_blank(),       # remove x axis text
        axis.ticks.x = element_blank(),      # remove tick marks on x axis
        axis.title.x = element_blank(),      # remove title for axis
        strip.background = element_blank(),  # no box on facet label
        strip.placement = 'outside',         # facet label is outside axis line
        strip.text = element_text(size=12),
        panel.spacing.x = unit(0, 'pt')      # remove space between facets
      )
    p
    

    一般的想法是考虑你在这里有 2 个 x 轴。您想要绘制点的主轴是df$allowed,然后您想要基于df$group 进行分组。我能想到的最简单的解决方案是将df$group 的每个值视为一个单独的构面,然后通过将它们之间的空间设置为零来将这些构面“缝合”在一起。看起来效果不错。

    这里唯一的评论是,这些框可能有点靠得太近,不符合您的喜好 - 区分一组的点以与另一组区分开来。由于每个组都是一个方面,因此是一个完全独立的图,您可以通过添加/扩展每个方面的主要 x 轴来“挤压”这些框,如下所示:

    p + scale_x_continuous(expand=expansion(mult=c(0.8)))
    

    注意:我必须删除一些使用中的超高值才能真正正确地看到你的图。我想这是复制您的数据的产物(例如缺失值)。

    【讨论】:

    • 这看起来很有希望,谢谢。让我实施真实数据将在几个小时内回复
    • 这很好。实际上,我也很喜欢没有刻面的它,对所有几何图形都使用了组美学。它是双向的。对于我的确切数据,分面选项更好,因为它使每个组的水平大小相同。我有 1-4 组和 2000-3000 组,所以尺寸可变的版本使那些较小的版本太窄了。如果不是这样,我会更喜欢非刻面版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2020-07-08
    • 2015-09-22
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多