2

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"))
Axeman
  • 32,068
  • 8
  • 81
  • 94
SCW16
  • 403
  • 2
  • 4
  • 10
  • Duplicate? https://stackoverflow.com/questions/43127974/geom-area-different-fill-colour-when-above-critical-level – pogibas Jan 29 '18 at 15:01

3 Answers3

2

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:

Marina
  • 945
  • 1
  • 9
  • 8
1

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

Antonios
  • 1,919
  • 1
  • 11
  • 18
1

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

alko989
  • 7,688
  • 5
  • 39
  • 62