ggplot2:像分类变量一样适合 geom_smooth() 是连续的

dee*_*nes 2 plot r ggplot2

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

geom_smooth(aes(x = order(hgcc), y = rtmean), method = lm)
Run Code Online (Sandbox Code Playgroud)

但随后它从数据框中获取整列的索引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())
Run Code Online (Sandbox Code Playgroud)

我知道这不是做事的好方法,但是 ggplot 可以让生活变得更轻松,如果我可以参考这些变量并使用它们做一些事情,无论如何通过分面进行子集化。

tim*_*mat 5

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

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

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

adata12cc$hgcc_value <-as.factor(substr(adata12cc$hgcc, (nchar(levels(adata12cc$hgcc)[adata12cc$hgcc])-5), nchar(levels(adata12cc$hgcc)[adata12cc$hgcc])))
Run Code Online (Sandbox Code Playgroud)

然后另一个问题是你有不同的 x 轴geom_pointgeom_smooth。一个是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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

是你要找的吗?