【问题标题】:How to automatically re-calculate the y axis scale after limiting the x axis in R ggplot2限制R ggplot2中的x轴后如何自动重新计算y轴刻度
【发布时间】:2017-07-13 22:46:58
【问题描述】:

我正在使用 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]]

这给了我: Plot without axis adjustment

如果我像这样将 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 轴的比例现在对于显示的数据来说太大了: Plot with correct x-axis, but wrong y-axis

如何将 y 轴自动调整到适当的最小值/最大值,但只能在 x 轴的 400-900 nm 范围内?

【问题讨论】:

  • 编辑:我尝试更改添加比例、几何等的顺序,但这没有区别。

标签: r ggplot2


【解决方案1】:

这是一个可能的解决方案。但是,由于我无权访问您的数据,因此无法测试它是否真的有效。

您可以在构建绘图之前定义波长范围的最大平均值,然后在 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 扩展。我从未使用过它,所以我无法谈论我将如何帮助解决这个问题,但它可能值得研究。 bitbucket.org/aphalo/ggspectra
  • 非常感谢 tbradley,这是一个很好的解决方案,但我收到“摘要错误 [[i]]$average[summary[[i]]] : invalid subscript type 'list'”。我试图做类似的事情,但我不知道如何将平均 y 值子集化为 400 - 900 x 范围内的值。
  • 我会检查那个光谱包,谢谢你的链接!
  • 我再次查看我的答案,发现我的括号不合适,我想这可能是导致错误的原因。我已经修复了它,所以你可能想再试一次。澄清一下,下标类型无效的原因是第二个摘要之后的第三个括号关闭了下标。
  • 成功了!谢谢!我还发现了另一个同样有效的变体,使用 filter: max(filter(summary[[i]], Wavelength >= 400 & Wavelength
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2012-03-14
相关资源
最近更新 更多