【问题标题】:ggplot2: fit geom_smooth() like categorical variable were continuousggplot2: fit geom_smooth() 像分类变量是连续的
【发布时间】:2023-03-04 00:07:01
【问题描述】:

我在 y 上有一个连续变量,在 x 轴上有一个分类变量。在分类变量中,顺序是有意义的,通过其索引拟合回归是有意义的,我的意思是使用索引(order(c('a', 'b', 'c')),即c(1, 2, 3))代替c('a', 'b', 'c'),并根据此拟合模型.但是,如果一个变量不是数字,则 ggplot 拒绝拟合 geom_smooth(method = lm)。好的,那我可以告诉它使用顺序:

geom_smooth(aes(x = order(hgcc), y = rtmean), method = lm)

但随后它会从数据框中获取整列的索引,这对于使用scales = 'free' 进行分面并不好,因为只有x 变量的水平子集出现在一个图上。整个数据帧中的索引平均要高得多,因此回归将绘制在最右侧:

这是一个最小的工作示例:

require(ggplot2)
load(url('http://www.ebi.ac.uk/~denes/54b510889336eb2591d8beff/sample_data.RData'))

ggplot(adata12cc, aes(x = hgcc, y = rtmean, color = cls, size = log10(intensity))) +
geom_point(stat = 'sum', alpha = 0.33) +
geom_smooth(
    aes(x = order(hgcc), y = rtmean),
    method = 'glm') +
facet_wrap( ~ uhgroup, scales = 'free') +
scale_radius(guide = guide_legend(title = 'Intensity (log)')) +
scale_color_discrete(guide = guide_legend(title = 'Class')) +
xlab('Carbon count unsaturation') +
ylab('Mean RT [min]') +
ggtitle('RT vs. carbon count & unsaturation by headgroup') +
theme(axis.title = element_text(size = 24),
    axis.text.x = element_text(angle = 90, vjust = 0.5, size = 9, hjust = 1),
    axis.text.y = element_text(size = 11),
    plot.title = element_text(size = 21),
    strip.text = element_text(size = 18),
    panel.grid.minor.x = element_blank())

我知道这不是很好的做事方式,但是如果我可以引用这些变量并使用它们做一些事情,那么 ggplot 可以让生活变得更轻松。

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    我想我有一个解决方案,但我不确定你想要什么......

    主要问题是您的 x 值标签已被 uhgroup 分割 如果您查看因素,它们是PC-O(38.7) PC(38.7 等...

    所以第一件事也是为 x 轴创建一个新的 hgcc 值。

    adata12cc$hgcc_value <-as.factor(substr(adata12cc$hgcc, (nchar(levels(adata12cc$hgcc)[adata12cc$hgcc])-5), nchar(levels(adata12cc$hgcc)[adata12cc$hgcc])))
    

    然后另一个问题是geom_pointgeom_smooth 的 x 轴不同。一个是hgcc,另一个是order(hgcc_value)

    解决方案是使用相同的值,这里我使用as.numeric(hgcc_value)(而不是order())并精确到scale_x_continuous 的标签。

    ggplot(adata12cc, aes(x = as.numeric(hgcc_value), y = rtmean, color = cls, size = log10(intensity))) +
      geom_point(stat = 'sum', alpha = 0.33) +
      geom_smooth(
        aes(x = as.numeric(hgcc_value), y = rtmean),
        method = 'glm') +
      facet_wrap( ~ uhgroup, scales = 'free') +
      scale_radius(guide = guide_legend(title = 'Intensity (log)')) +
      scale_color_discrete(guide = guide_legend(title = 'Class')) +
      scale_x_continuous(name = "Carbon count unsaturation",
                         breaks=as.numeric(adata12cc$hgcc_value),
                         labels = adata12cc$hgcc_value,
                         minor_breaks = NULL)+
      ylab('Mean RT [min]') +
      ggtitle('RT vs. carbon count & unsaturation by headgroup') +
      theme(axis.title = element_text(size = 24),
            axis.text.x = element_text(angle = 90, vjust = 0.5, size = 9, hjust = 1),
            axis.text.y = element_text(size = 11),
            plot.title = element_text(size = 21),
            strip.text = element_text(size = 18),
            panel.grid.minor.x = element_blank())
    

    这是你要找的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多