R - ggplot2:如果将限制定义为 data.frame 的最大值和最小值,geom_area 将失去其填充

R - ggplot2: geom_area loses its fill if limits are defined to max and min values from a data.frame

我正在尝试使用 ggplot2 重现 sparkline,就像这张图片底部的那个:

使用下面的代码,我得到了代码末尾显示的结果。 注意:我的实际data.frame只有2行。因此结果看起来像一条线。

# Create sparkline for MM monthly
# sparkline(dailyMM2.aggregate.monthly$Count, type = 'line')
p <- ggplot(dailyMM2.aggregate.monthly, aes(x=seq(1:nrow(dailyMM2.aggregate.monthly)), y=Count)) + 
  geom_area(fill="#83CAF5") +
  geom_line(color = "#2C85BB", size = 1.5) +
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0))   

p + theme(axis.line=element_blank(),axis.text.x=element_blank(),
          axis.text.y=element_blank(),axis.ticks=element_blank(),
          axis.title.x=element_blank(),
          axis.title.y=element_blank(),legend.position="none",
          panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
          panel.grid.minor=element_blank(),plot.background=element_blank())

但是,由于我只尝试 show trends 使用迷你图,因此绝对值与我无关,我必须调整 ggplot 的配置以限制最小值之间的可见区域和我的最大值 axis.y。我使用 limits 选项:

# Create sparkline for MM monthly
# sparkline(dailyMM2.aggregate.monthly$Count, type = 'line')
p <- ggplot(dailyMM2.aggregate.monthly, aes(x=seq(1:nrow(dailyMM2.aggregate.monthly)), y=Count)) + 
  geom_area(fill="#83CAF5") +
  geom_line(color = "#2C85BB", size = 1.5) +
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0), limits = c(min(dailyMM2.aggregate.monthly$Count)-100, max(dailyMM2.aggregate.monthly$Count)+100))   

p + theme(axis.line=element_blank(),axis.text.x=element_blank(),
          axis.text.y=element_blank(),axis.ticks=element_blank(),
          axis.title.x=element_blank(),
          axis.title.y=element_blank(),legend.position="none",
          panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
          panel.grid.minor=element_blank(),plot.background=element_blank())

然而,结果并不像预期的那样,整个geom_area的填充消失了,如下图所示:

任何人都可以阐明为什么会发生这种行为,并可能帮助我找到解决此问题的正确方法吗?

如果您选中 ?geom_area,您会注意到最小值固定为 0。使用 geom_ribbon 可能更容易。它具有 ymin 美感。使用 limitscoord_cartesian 设置最大 y 值。

library(reshape2)
library(ggplot2)

# Some data
df=data.frame(year = rep(2010:2014, each = 4),
          quarter=rep(c("Q1","Q2","Q3","Q4"),5),
          da=c(46,47,51,50,56.3,53.6,55.8,58.9,61.0,63,58.8,62.5,59.5,61.7,60.6,63.9,68.4,62.2,62,70.4))

df.m <- melt(data = df, id.vars = c("year", "quarter"))

ymin <- min(df.m$value)
ymax <- max(df.m$value)

ggplot(data = df.m, aes(x = interaction(quarter,year), ymax = value, group = variable)) +
      geom_ribbon(aes(ymin = ymin), fill = "#83CAF5") +
      geom_line(aes(y = value), size = 1.5, colour = "#2C85BB") +
      coord_cartesian(ylim = c(ymin, ymax)) +
      scale_y_continuous(expand = c(0,0)) +
      scale_x_discrete(expand = c(0,0)) +
      theme_void()