SCW16
SCW16

Reputation: 423

ggplot two shaded areas geom_area

I have made this graph so far: enter image description here

What I would like to change is the shadded area for the Variable Count (left y-axis). The area shall be shadded in black when Count equals or is greater than 12.5. Otherwise the area shall be shadded in grey.

The code for this graph right now is:

ggplot(df_shadded_graph, aes(x=Date, y=Count)) +
  geom_area(fill="black", alpha=.99) +
  geom_line(aes(y = Underpricing*100, colour = "Underpricing"), colour = "grey", linetype="longdash") +
  scale_y_continuous(sec.axis = sec_axis(~. / 100, name = "Underpricing")) +
  geom_hline(yintercept = 12.5) +
  theme_minimal()

I tried to work with subsets like the following, which didn't work:

geom_area(data = subset(df_shadded_graph, zero_one == 1, fill="black", alpha=.99))

What would be the best way to implement the two colours shadding? Is this possible with geom_area?

The following code is a reduced dataset:

df_shadded_graph <- structure(list(Date = structure(c(1025481600, 1028160000, 1030838400, 
1033430400, 1036108800, 1038700800, 1041379200, 1044057600, 1046476800, 
1049155200, 1051747200, 1054425600, 1057017600, 1059696000, 1062374400, 
1064966400, 1067644800, 1070236800, 1072915200, 1075593600, 1078099200, 
1080777600, 1083369600, 1086048000, 1088640000, 1091318400), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Count = c(5.33333333333333, 2.33333333333333, 
3.66666666666667, 6.66666666666667, 8.66666666666667, 5.33333333333333, 
3.33333333333333, 1.66666666666667, 1.66666666666667, 1, 1.66666666666667, 
4, 5.66666666666667, 6.66666666666667, 8.33333333333333, 11.3333333333333, 
16.6666666666667, 14.3333333333333, 15.3333333333333, 13.3333333333333, 
15.6666666666667, 14.3333333333333, 18.3333333333333, 23.6666666666667, 
24.3333333333333, 20), Underpricing = c(0.0281112960367963, 0.00954323052149139, 
0.0129313986013986, 0.0296151983272675, 0.0542382142002834, 0.0413068155988848, 
0.0178396825396825, -0.00869082021936099, -0.00869082021936099, 
0.050384179780639, 0.0962599206349206, 0.1782458943856, 0.16362838849032, 
0.155155878713463, 0.110998297207745, 0.106699976872014, 0.113896570632104, 
0.162480658578345, 0.176346448849018, 0.157754181912185, 0.148675489256975, 
0.130041460117814, 0.136243778466198, 0.0743238088052681, 0.0478918997193753, 
0.0596987903377546), zero_one = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("Date", 
"Count", "Underpricing", "zero_one"), row.names = c(NA, -26L), class = c("tbl_df", 
"tbl", "data.frame"))

Upvotes: 2

Views: 1010

Answers (3)

Antonios
Antonios

Reputation: 1939

at least for the area color you could do something like:

df=df_shadded_graph
df$Flag="High"
df$Flag[df$Count<=12.5]="Low"
ggplot() +geom_area(aes(x=df$Date[df$Flag=="High"], y=df$Count[df$Flag=="High"]),fill="black") +
  geom_area(aes(x=df$Date[df$Flag=="Low"], y=df$Count[df$Flag=="Low"]),fill="grey")+xlab("Date")+ylab("Count")

enter image description here

Upvotes: 1

Marina
Marina

Reputation: 995

I'm not sure if this answers you question:

df_shadded_graph$Color=""
for(i in 1:nrow(df_shadded_graph)){
  if (i==1) df_shadded_graph$Color[i]<-"grey"
  else if (df_shadded_graph$zero_one[i-1]+df_shadded_graph$zero_one[i]==0 | df_shadded_graph$zero_one[i-1]+df_shadded_graph$zero_one[i]==1) df_shadded_graph$Color[i]<-"grey"
  else df_shadded_graph$Color[i]<-"black"
}

ggplot(df_shadded_graph, aes(x=Date, y=Count)) +
  geom_area(aes(y = ifelse(Color == "grey", Count, 12.5)), fill = "lightgrey", alpha=.99) +
  geom_area(aes(y = ifelse(zero_one == 1, Count, 0)),fill="black", alpha=.99) +
  geom_line(aes(y = Underpricing*100, colour = "Underpricing"), colour = "darkgrey", linetype="longdash") +
  scale_y_continuous(sec.axis = sec_axis(~. / 100, name = "Underpricing")) +
  geom_hline(yintercept = 12.5) +
  theme_minimal()

The code generates this image:

Upvotes: 2

alko989
alko989

Reputation: 7908

You can use geom_bar instead of geom_area to do what you need and to avoid having gaps in your plot. Note that instead of y you have to use weight

ggplot(df_shadded_graph, aes(x=Date, weight=Count)) +
  geom_bar(mapping = aes(fill = factor(zero_one))) +
  geom_line(aes(x = Date, y = Underpricing*100, colour = "Underpricing"), colour = "grey", linetype="longdash") +
  scale_y_continuous(sec.axis = sec_axis(~. / 100, name = "Underpricing")) +
  scale_fill_grey(start = 0.7, end = 0.2) +
  theme(legend.position = "none")
  geom_hline(yintercept = 12.5) +
  theme_minimal()

This results to a plot like this: enter image description here

Upvotes: 1

Related Questions