agustin
agustin

Reputation: 1351

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

I am trying to reproduce a sparkline with ggplot2 like the one at the bottom of this image:

Example of Sparklines

Using the following code I get the result displayed at the end of the code. Note: My actual data.frame has only 2 rows. Therefore the result looks like a single line.

# 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())

Sparkline1

However, as I try to only show trends with the sparkline and, therefore, absolute values aren't relevant for me, I have to adapt the config of the ggplot to limit the visible area between the min and max of my axis.y. I do it using the limits option:

# 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())

However, the result is not like expected, as the whole geom_area's fill dissapears, as shown in the folllowing image:

Sparkline 2

Can anyone shed light why this behaviour is happening and maybe help me with a proper way to solve this problem?

Upvotes: 2

Views: 1802

Answers (1)

Sandy Muspratt
Sandy Muspratt

Reputation: 32829

If you check ?geom_area you will note that the minimum is fixed to 0. It might be easier to use geom_ribbon. It has a ymin aesthetic. Set the maximum y value using limits or coord_cartesian.

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()

enter image description here

Upvotes: 1

Related Questions