Reputation: 423
I have made this graph so far:
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
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")
Upvotes: 1
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
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:
Upvotes: 1