For my rmarkdown document, I've put together two plots. The second plot is supposed to be a "zoomed in" version of the first plot.
---
title: TwoGraphs
output: pdf_document
---
```{r echo=FALSE,fig.show="hold", out.width="50%",fig.cap="Results"}
library(ggplot2)
data <- data.frame(
a_max = 1:10 * 10,
a_min = 1:10 * 9,
b_max = 1:10 * 5,
b_min = 1:10 * 4,
c_max = 1:10 * 0.002,
c_min = 1:10 * 0.001
)
ggplot(data, aes(x = 1:10))
xlab("Time") ylab("Amount")
# a
geom_ribbon(aes(ymax = a_max, ymin = a_min, fill = "A set"), fill = '#9B7FBF')
geom_line(aes(y = a_max), color = "#1e152a", size=1.5, linetype="dashed")
geom_line(aes(y = a_min), color = "#1e152a", size=1.5)
# b
geom_ribbon(aes(ymax = b_max, ymin = b_min, fill = "B set"), fill = '#ACD8DD')
geom_line(aes(y = b_max), color = "#5ab1bb", size=1.5, linetype="dashed")
geom_line(aes(y = b_min), color = "#5ab1bb", size=1.5)
# c
geom_ribbon(aes(ymax = c_max, ymin = c_min, fill = "C set"), fill = '#deebd1')
geom_line(aes(y = c_max), color = "#a5c882", size=1.5, linetype="dashed")
geom_line(aes(y = c_min), color = "#a5c882", size=1.5)
theme_bw()
# zoom in on c
ggplot(data, aes(x = 1:10))
xlab("Time") ylab("Amount")
geom_ribbon(aes(ymax = c_max, ymin = c_min, fill = "C set"), fill = '#deebd1')
geom_line(aes(y = c_max), color = "#a5c882", size=1.5, linetype="dashed")
geom_line(aes(y = c_min), color = "#a5c882", size=1.5)
theme_bw()
```
Generating the plot works fine, however the legend I want to have is missing. Particularly I want the ribbon colors to be notated. The lines are not so important - I do mention in the caption though that dashed means most unsorted dataset, and a continuous line means that the dataset is sorted.
I have marked the legend I want to have in the screenshot below.
How do I get the three filled areas to show up as a common legend? Is it also possible to add an overarching dashed-line / solid-line legend? (i.e., "dashed = unsorted, solid = sorted")
CodePudding user response:
When you add a fill colour outside aes
, it over-rides the one you put inside. You need to remove these and specify your colours inside scale_fill_manual
. You can follow exactly the same process with the linetype aesthetic.
ggplot(data, aes(x = 1:10))
xlab("Time") ylab("Amount")
# a
geom_ribbon(aes(ymax = a_max, ymin = a_min, fill = "A set"))
geom_line(aes(y = a_max, linetype = "sorted"), color = "#1e152a", size=1.5)
geom_line(aes(y = a_min, linetype = "unsorted"), color = "#1e152a", size=1.5)
# b
geom_ribbon(aes(ymax = b_max, ymin = b_min, fill = "B set"))
geom_line(aes(y = b_max, linetype = "sorted"), color = "#5ab1bb", size=1.5)
geom_line(aes(y = b_min, linetype = "unsorted"), color = "#5ab1bb", size=1.5)
# c
geom_ribbon(aes(ymax = c_max, ymin = c_min, fill = "C set"))
geom_line(aes(y = c_max, linetype = "sorted"), color = "#a5c882", size=1.5)
geom_line(aes(y = c_min, linetype = "unsorted"), color = "#a5c882", size=1.5)
theme_bw()
scale_fill_manual(values = c(`A set` = '#9B7FBF', `B set` = '#ACD8DD',
`C set` = '#deebd1'))
scale_linetype_manual(values = c(sorted = 1, unsorted = 2))
guides(linetype = guide_legend(override.aes = list(color = "black", size = 0.4)))
labs(fill = "", linetype = "")
theme(legend.position = "bottom",
legend.direction = "vertical")