I think that happens because both variable and direction displayed in color, the legend has four different color values. Deleting a path legend simply removes the arrows, and deleting just a point legend deletes the points. But in any case, all four colors are still displayed in the legend as points or arrows, respectively, because the base display still has four values, regardless of whether you want to display these four values as points, arrows, or both in the legend ,
One way is to use the aesthetics of the fill for glasses. Then the legend of the path will have only two meanings. To do this, you need to use a dot style with a filled interior (pch values 21-25). You will also need to change the colors of either the color aesthetics or fill the aesthetics so that they are not the same:
ggplot(df, aes(x=question, y = value, group = question)) + geom_point(size=4, aes(fill=variable), pch=21, color=NA) + geom_path(aes(color = direction), arrow=arrow(), show.legend=FALSE) + scale_fill_manual(values=hcl(c(105,285), 100, 50))

source share