In the chart below, the triangles mapped using geom_point
are both in the same legend. Essentially, I would like each geom_
to have their own separate legend instead. How would I go about doing so?
Here's my code for reproducibility:
mydf <- data.frame(year = c(rep(2000, 3), rep(2002, 3), rep(2004, 3), rep(2006, 3), rep(2008, 3), rep(2010, 3), rep(2012, 3), rep(2014, 3), rep(2016, 3)),
answer = rep(c("A great deal", "Hardly any", "Only some"), 9),
result = c(0.3015940, 0.1399303, 0.5584757, 0.2269548, 0.1792754, 0.5937698, 0.2955301, 0.1309859, 0.5734840, 0.3008197, 0.1344499,
0.5647303, 0.1919454, 0.2026290, 0.6054256, 0.1059793, 0.4190533, 0.4749674, 0.1190636, 0.3631279, 0.5178085, 0.1518314,
0.3181203, 0.5300483, 0.1424715, 0.3094615, 0.5480669))
mydf$year <- factor(mydf$year)
mydf$answer <- factor(mydf$answer)
triangle_up <- data.frame(year = c(2004, 2008, 2010),
direction = c("A great deal", "Hardly any", "Hardly any"),
result = c(0.2955301, 0.2026290, 0.4190533))
triangle_up$year <- factor(triangle_up$year)
triangle_up$direction <- factor(triangle_up$direction)
triangle_down <- data.frame(year = c(2002, 2008, 2010, 2010, 2012),
direction = c(rep("A great deal", 3), "Only some", "Hardly any"),
result = c(0.2269548, 0.1919454, 0.1059793, 0.4749674, 0.3631279))
triangle_down$year <- factor(triangle_down$year)
triangle_down$direction <- factor(triangle_down$direction)
ggplot(mydf, aes(x = year, y = result)) + geom_line(aes(colour = answer, group = answer)) +
geom_point(data = triangle_up, aes(x = year, y = result, group = direction, fill = direction), shape = 24, size = 3) +
geom_point(data = triangle_down, aes(x = year, y = result, group = direction, fill = direction), shape = 25, size = 3)
The issue here is the use of multiple data frames to store values. It would be better to add a column to the
mydf
data frame to store thedirection
variable. Confusingly, you have usedanswer
as the variable name inmydf
, butdirection
to store the same values in the other data frames.So here is the new
mydf
with values "up", "down" or NA in thedirection
column:Now you can plot with separate legends for
direction
andanswer
. Shapes are specified manually usingscale_shape_manual
, usingbreaks
to omit the NA values. For line colour, we usescale_color_manual
and override the legend mapping so as only lines, not shapes, are shown.This answer has demonstrated how to create the chart if the plot data are supplied in the proper format. However, this is only the second part of the story.
The answer below tries to suggest a way how the OP can create the plot data from his original data.frames
mydf
,triangle_up
, andtriangle_down
. The goal is to have all plot data in one data.frame.Original data
as provided by OP but without factorization (this will be done later when needed):
Apparently,
triangle_up
andtriangle_down
are rows selected by some means from the master data.framemydf
containing data points which should be emphasized in the chart by being plotted using special symbols. Note that the OP has decided to rename theanswer
column todirection
.Preparing and joining the data
data.table
is used for these tasks, here.Finally, all data required for plotting are combined in one data.table
Plotting
To plot the data, the code from this answer can be used with two modifications: