迭代地绘制ggplot中的所有列

Posted

技术标签:

【中文标题】迭代地绘制ggplot中的所有列【英文标题】:Iteratively plotting all columns in ggplot 【发布时间】:2021-08-26 15:21:00 【问题描述】:

我有一个温度数据框,其中每一列代表从 1996 年到 2015 年的一年,行是从 7 月 1 日到 10 月 31 日的数据:

head(df)

[![数据帧头][1]][1]

我正在尝试使用x= DAYSy=temp per year 创建线图。当我在循环中使用DAYS 时,无论是aes() 还是aes_strint() 它都不会产生任何东西:

iterator <- c(colnames(df))[-1]
g <- ggplot(df, aes_string(x = 'DAY'))

for (i in iterator)
  g <- g+ geom_line(aes_string(y=i))
          

print(g)

所以我添加了一个 index 列,它只是从 1 到 123 的整数。现在相同的代码绘制了一堆行但很奇怪:

df$index <- c(1:123)
iterator <- c(colnames(df))[-1]
iterator <- iterator[-21]
g <- ggplot(df, aes_string(x = 'index'))

for (i in iterator)
  g <- g+ geom_line(aes_string(y=i))
          

print(g)

[![最终剧情][2]][2]

如您所见,每个列名都有一行,所有列名都堆叠在一起。这已经将垂直轴压缩得如此之多,以至于温度的变化是不可见的。我希望我的 y 轴从 50 变为 100,并且每个列名将有一行,其比例与其他列相同。我怎么做? [1]:https://i.stack.imgur.com/ruF11.png [2]:https://i.stack.imgur.com/gAvMe.png

【问题讨论】:

【参考方案1】:

如果你在 R 中使用循环,尤其是使用 ggplot2,你可能做错了什么。我不是 100% 确定你为什么要循环播放,当你可能想做更多类似的事情时,

df  %>%
  tidyr::pivot_longer(!DAYS, names_to = "column", values_to = "temp") %>% 
  ggplot(df, aes(x = day, y = temp, group = column)) + 
  geom_line() 

但如果没有代表/数据集,我无法确定这是否是您想要的。

【讨论】:

谢谢安德鲁。非常有帮助的答案。不过,对代码进行了一些快速的非拼写更正:您不需要带有管道和 ggplot 的df。此外,DAY 是一个字符列,因此我需要添加一个数字索引列以在取消透视数据之前保持图中的顺序。这是对我有用的变体:'df$index % tidyr::pivot_longer(!index, names_to = "column", values_to = "temp") %>% ggplot(aes(x = index, y = temp, group = column)) + geom_line()` oof 是的,抱歉,我直接在 SO 中输入了这个,没有尝试过,也没有看到那些冗余。谢谢。【参考方案2】:

我认为您可以重新排列数据框,例如使用 tidyr 包,这样你就有了一个包含“year”、“day”和“temp”列的数据框

library(ggplot2)
library(tidyr)

year1 = c(5,6,4,5)
year2 = c(6,5,5,6)
year3 = c(3,4,3,4)
date = c("a", "b", "c", "d")

data = data.frame(date, year1, year2, year3)

data2 = gather(data , "year", "temp", -date)

然后,您可以轻松绘制每年的温度。


ggplot(data2, aes(x = date, y = temp, group = year, color = year))+ 
  geom_path()

【讨论】:

【参考方案3】:

同意安德鲁的解决方案。只是一个小改动:您必须删除第 3 行的“df”,因为您已经在开头声明了它。

df  %>%
  tidyr::pivot_longer(!DAYS, names_to = "column", values_to = "temp") %>% 
  ggplot(aes(x = DAYS, y = temp, group = column)) + 
  geom_line()

【讨论】:

以上是关于迭代地绘制ggplot中的所有列的主要内容,如果未能解决你的问题,请参考以下文章

使用新列名迭代合并 pandas 列

使用 Pandas 迭代地将列添加到数据框中

如何从ggplot2中的两个不同的二进制值列绘制百分比堆积条形图?

我错过了 ggplot 中的第二行,应该有测试和火车线吗?

迭代地添加计算列,然后将新数据添加到 Pandas 数据框(python 3.7.1)

使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列