如何在R ggplot2中限制x轴后自动重新计算y轴刻度

5
我正在使用ggplot2绘制大量数据帧的光谱数据。我想将图形限制在400到900 nm之间的波长范围内。我知道如何使用scale_x_continuous()或xlim()设置x轴限制。问题是,我完成后,y轴不会自动调整以读取显示的最小/最大值。我不想手动设置它,因为我的循环处理的每个数据帧都具有不同的范围。
如果我的数据帧列表为summary,则以下代码将给我一个未调整坐标轴的图形列表:
plotlist <- list()
for(i in 1:length(summary)){
  plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) +
    geom_line(aes(color=Sample)) +
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5) +
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) +
    theme_classic()
}
plotlist[[33]]

这给我带来了:未进行轴调整的图表 如果我像这样调整x轴为400-900:
plotlist <- list()
for(i in 1:length(summary)){
  plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) +
    scale_x_continuous(name="Wavelength (nm)", limits=c(400, 900), expand=c(0,0)) +
    geom_line(aes(color=Sample), na.rm=TRUE) +
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5, na.rm=TRUE) +
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) +
    theme_classic()
}
plotlist[[33]]

然后我得到了这个图,x轴正确,但是y轴的比例对于显示的数据来说太大了: x轴正确但y轴错误的图

如何自动调整y轴到适当的最小/最大值,但仅在400-900纳米范围内的x轴上?


1
我已经尝试更改添加比例尺、几何对象等的顺序,但这没有任何影响。 - beanstalker
1个回答

2
这里有一个可能的解决方案。然而,由于我无法访问您的数据,我无法测试它是否有效。
在绘制图表之前,您可以定义波长范围的最大平均值,然后在 ylim 函数中调用该值。
我添加的两行是:
 y_scale <- max(summary[[i]]$average[summary[[i]]$Wavelength >= 400 & summary[[i]]$Wavelength <= 900])

并且,

ylim(0, (y_scale + 0.5))+

最终的代码如下所示:
plotlist <- list()
for(i in 1:length(summary)){
  y_scale <- max(summary[[i]]$average[summary[[i]]$Wavelength >= 400 &   summary[[i]]$Wavelength <= 900])
  plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) +
    scale_x_continuous(name="Wavelength (nm)", limits=c(400, 900), expand=c(0,0)) +
    ylim(0, (y_scale + 0.5))+
    geom_line(aes(color=Sample), na.rm=TRUE) +
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5, na.rm=TRUE) +
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) +
    theme_classic()
}
plotlist[[33]]

希望这能帮到您!

除此之外,还有一个ggplot扩展程序可以处理光谱绘图。我从未使用过它,所以无法说明它如何帮助解决这个问题,但值得一试。https://bitbucket.org/aphalo/ggspectra - tbradley
非常感谢tbradley,这是一个不错的解决方案,但我遇到了一个“summary [[i]] $ average [summary [[i]]]:无效的下标类型'list'”的错误。我也试图做类似的事情,但我无法弄清如何将平均y值子集化为仅在400-900 x范围内的值。 - beanstalker
我会检查那个spectra包,谢谢提供链接! - beanstalker
我再次查看了我的答案,发现我放错了一个括号,我想那可能是导致错误的原因。我已经修复了它,所以你可能想再试一次。为了澄清,你之所以有一个无效的下标类型,是因为第二个摘要后面的第三个括号关闭了下标。 - tbradley
成功了!谢谢!我还发现另一种变体也可以使用,使用过滤器:max(filter(summary[[i]], Wavelength >= 400 & Wavelength <= 900)$average) - beanstalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接