【问题标题】:R stacked area chart - ignore NA and retain full x-axisR 堆积面积图 - 忽略 NA 并保留完整的 x 轴
【发布时间】:2015-06-12 08:47:49
【问题描述】:

我有从 1700 到 1900(21 个时间片)的十年时间序列,对于每个十年,我有 7 个类别代表一个数量; see here

如您所见,实际上只有 5 个十年有数据。

借助this very nice example,我可以在 R 中绘制一个漂亮的小堆积面积图,它只保留有数据的 5 个时间片。

我的问题是我想要一个保留所有 21 个时间片的 x 轴,但仍然只使用 5 个时间片绘制堆积面积图。这个想法是堆叠区域仍将仅针对正确的年份绘制,而只是连接到下一个点,即 x 轴下 10 个刻度,忽略其间的无数据。我可以在 excel 中取得一些成就,但我不喜欢它。

我的理由是我想在堆叠区域的顶部绘制更完整的线,例如从 1700 到 1850,或从 1800 到 1900,以进行视觉比较。

This post 建议当您想忽略 NA 时如何在折线图中连接点,但在这种情况下它对我不起作用。

a <- 1700:1900
b <- a[seq(1, length(a), 10)]
df <- data.frame("Year"=b,replicate(7,sample(1:21)))
rows <- c(2:10,11:15,17,19,21)
df[rows,2:8] <- NA
df

非常感谢

【问题讨论】:

标签: r plot charts


【解决方案1】:

如果您希望将您的年份转换为因子,请在下面的代码行中:

# Transform the data to long
library(reshape2)
df <- melt(data = df, na.rm = FALSE, id.vars = "Year")
df$Year <- as.factor(df$Year)

# Chart
require(ggplot2)
ggplot(df, aes(Year, value)) + 
  geom_area(aes(colour = variable, fill= variable), position = 'stack')

它将生成以下图表:

我不确定您是否有兴趣映射所有 X 变量。我在想就是这种情况,所以我重新塑造了你的数据。据推测,最好将年份更改为因素。下面的代码:

a <- 1700:1900
b <- a[seq(1, length(a), 10)]
df <- data.frame("Year"=b,replicate(7,sample(1:21)))
rows <- c(2:10,11:15,17,19,21)
df[rows,2:8] <- NA

# Transform the data to long
library(reshape2)
df <- melt(data = df, na.rm = FALSE, id.vars = "Year")
# Leave it as int.
# df$Year <- as.factor(df$Year)

# Chart
require(ggplot2)
ggplot(df, aes(Year, value)) + 
  geom_area(aes(colour = variable, fill= variable), position = 'stack') 

会生成更有意义的图表:

如果您决定使用年份作为因子,您可以将它们分组,并为多个缺失年份设置一个类别,这样 x 轴的可读性更高。我会说这在很大程度上是一个演示问题。

【讨论】:

  • 谢谢 Konrad,我会看看你的代码。我希望 x 轴只显示有数据的年份。最终,我将在此之上绘制另一个折线图,使用相同的轴,但使用更完整的数据集(例如 21 个时间片中的 17 个)
  • 我明白了,可能实现这一目标的最简单方法之一是使用complete.cases 并将您的df 过滤为仅具有非缺失值的df。我最初的理解是你想显示差距(第一个图表,但调整因素的显示方式是明智的)或映射缺失值(第二个图表)。第三种选择只是意味着通过complete.cases 布尔条件清理您的df,这样您就只能获得要绘制图表的行。
  • 第二张图表非常适合堆叠区域,21 个中只有 6 个特定时间片的数据,但我希望 x 轴反映整个时间跨度,以便绘制更完整的线图表。
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多