You need to use one of the characters that takes padding (pch = 21:25). Then you need to use override.aes to get the legend. I moved the general data and aes to the ggplot command.
ggplot(data=df, aes(x=x, y=y)) + geom_point(aes(color="Weekly Forecast"), shape=16, size = 5) + geom_line(color="red", size=1) + geom_point(data=df2, aes(color="Main Forecast"), shape=21, fill = "white", size = 5) + scale_color_manual("Legend Title", limits=c("Weekly Forecast", "Main Forecast"), values = c("red","red")) + guides(colour = guide_legend(override.aes = list(pch = c(16, 21), fill = c("red", "white"))))
This can also be done without override.aes :
ggplot(data=df, aes(x=x, y=y)) + geom_line(aes(color="Main Forecast"), size=1) + geom_point(aes(color="Weekly Forecast", fill="Weekly Forecast"), shape=21, size = 5) + geom_point(data=df2, aes(color="Main Forecast", fill="Main Forecast"), shape=21, size = 5) + scale_color_manual(name="", values = c("red","red")) + scale_fill_manual(name="", values=c("white","red"))
source share