【问题标题】:What is the best way to store axis names for a list of ggplots?为 ggplots 列表存储轴名称的最佳方法是什么?
【发布时间】:2017-09-28 22:39:59
【问题描述】:

我创建了一个大型数据框(>100 列)

s <- data.frame(x1, x2,....,x100)
var_list <- names(s)

然后我手动为相应的 y 轴创建另一个包含 100 个名称的列表:

y_names <- c("Time", "hr", "W m-2"..... 100 items)

最后,我循环遍历列表以创建一个包含 100 个图的 PDF:

plot_list = list()
for (i in 2:length(var_list)) {
  p = ggplot(s, aes_string(x = x1, y = var_list[i])) +
    geom_line()+
    ylab(y_names[i])+
    ggtitle(paste(var_list[i]))
  plot_list[[i]] = p
}

 # create pdf where each page is a separate plot. ,
pdf("figures.pdf",  width=7, height=1.5)
for (i in 2:length(var_list)) {
  print(plot_list[[i]])
}
dev.off()

显然,这是一个问题,因为除了查看最终图之外,我永远无法确定我是否将正确的 y 轴赋予正确的图。如果我必须更改订单,那就完全不同了。

如何更好地设置名称?也许在我可以确定顺序的数据框本身中?

【问题讨论】:

  • 是否存在始终与特定 y_names 匹配的特定 var_list 值?例如,是否有像 wm 这样的列名,您总是希望在图中将其翻译为 W m-2?如果是这样,您可以创建一个查找表,然后使用连接将适当的y-axis 标签与每个列名匹配,而无需知道顺序。如果您提供一个小数据样本和与列名匹配的 y 轴标签,那么对您的帮助会更容易。
  • Var_list 只是列的名称。并且每一列都与一个唯一的y_names 相关联。有些可能没有任何 y_name,因为它们可能是没有单位的分数。我会尝试提供一些数据,因为它们很大。但是,如果您可以使用任何示例数据进行详细说明,那就太好了!
  • 我添加了一个答案。事实证明,加入是不必要的。我只是使用match 函数来获取与用于每个绘图的y 列对应的y_lab
  • @eipi10 非常感谢!它有很大帮助。但它仍然无法帮助我在代码中将单位设置在变量旁边,这使得代码变得笨拙。

标签: r list ggplot2


【解决方案1】:

您可以将查找表与match 函数一起使用。这可确保所需的 y 轴标签始终用于给定的数据列。这是一个例子:

让我们创建一个查找表,其中包含我们想要用于所有可能的列名的 y 标签。在lookup 中,var_names 是数据框s 的可能列名。 y_lab 是我们要在图中使用的相应 y 轴标签。

lookup = data.frame(var_names=c("wm","hr","time","grp", 'cm'), 
                    y_lab=c("W m-2", "Hour", "Time", "Group","Centimeters"))
  var_names       y_lab
1        wm       W m-2
2        hr        Hour
3      time        Time
4       grp       Group
5        cm Centimeters

现在,当您绘制数据时,使用match 为图中给定的 y 列识别正确的 lookup$y_lab。在下面的示例中,我已将您的代码示例更改为直接使用数据框列名称作为循环变量。请注意使用match 函数来获取yvar 的当前值的正确y_lab

for (yvar in names(s)[-1]) {
  p = ggplot(s, aes_string(x = "x1", y = yvar)) +
    geom_line() +
    ylab(lookup$y_lab[match(yvar, lookup$var_names)]) +
    ggtitle(yvar)
  plot_list[[yvar]] = p
}

另一种选择是创建所有 y 值的单面图。会是这样的:

library(tidyr)

names(s)[-1] = lookup$y_lab[match(names(s)[-1], lookup$var_names)]

ggplot(gather(s, key, value, -x1), aes(x = x1, y = value)) +
  geom_line() +
  facet_wrap(~ key)

【讨论】:

  • 太棒了!谢谢。
  • TBH,它仍然不能完全解决问题,因为我们没有在 lookup 中的 variable 名称旁边分配 units。因此,当我有数百个变量时,如果不在 RStudio 中以表格格式查找表格,就很难进行更改。我把这个问题留下来看看我是否能找到解决方案。不过谢谢!
  • 我想知道是否有办法构造一个数据框row-wise 而不是column-wise?这样就可以解决问题了。
  • 您能用示例数据框和所需输出更新您的问题吗?这会让我更容易理解你想要做什么。
猜你喜欢
  • 2013-02-15
  • 2019-11-21
  • 2013-05-23
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多