我试图为使用ggplot创建的折线图生成图例。从我所阅读的内容中,如果我改变了图形的美感并在es函数中包含了线型,但是它不可见,应该自动创建图例。我一直在网上搜索这个确切问题的答案,并尝试了许多方法,但似乎没有任何效果。我想我缺少一些细微的东西。我尝试使用scale_linetype_manual,但这没有产生图例。任何帮助将不胜感激。
jpeg(filename = "careercurve.jpeg", width = 12, height = 10, units = "cm", res = 1200)
ggplot() +
scale_y_continuous(limits = c(0.5,0.8))+
geom_line(aes(x = Age, y = fwd.preds), data = fwd.predictions, linetype = 1) +
geom_line(aes(x = Age, y = def.preds), data = def.predictions, linetype = 2) +
geom_line(aes(x = Age, y = mid.preds), data = mid.predictions, linetype = 3) +
geom_line(aes(x = Age, y = ruck.preds), data = ruck.predictions, linetype = 4) +
theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), axis.text = element_text(colour = "black", size = 8), axis.title = element_text(size = 8), legend.position = "bottom")+
labs(x = "Age (years)", y = "AFL Player Rank/min (au)") +
geom_text(aes(x = 35.4, y = 0.535, label = "Fwd"), size = 3) +
geom_text(aes(x = 35.4, y = 0.50, label = "Def"), size = 3) +
geom_text(aes(x = 35.4, y = 0.575, label = "Mid"), size = 3) +
geom_text(aes(x = 35.4, y = 0.67, label = "Ruck"), size = 3)
dev.off()
答案 0 :(得分:1)
使用ggplot2
的最简单方法是,如果您可以在单个数据框中获取所有数据,并用列标识任何重要组。因此,在您的情况下,需要为单独的数据框中的所有fwd.preds
列赋予一个通用名称,并添加一个新列以标识该组。然后,您可以将它们组合并绘制,例如:
library(dplyr)
# Separate dfs
fwd_df = data.frame(
Age = rpois(10, 20),
fwd.preds = rnorm(10)
)
def_df = data.frame(
Age = rpois(10, 20),
def.preds = rnorm(10)
)
# Make all the column names the same, add
# a position column
fwd_df = fwd_df %>%
mutate(Position = "fwd") %>%
rename(Pred = fwd.preds)
def_df = def_df %>%
mutate(Position = "def") %>%
rename(Pred = def.preds)
# Combine into single df
combined_df = bind_rows(fwd_df, def_df)
ggplot(combined_df, aes(x = Age, y = Pred, linetype = Position)) +
geom_line()
请注意,我们现在只需在Position
中包含aes()
列,并且ggplot会自动处理图例和其他线型。
答案 1 :(得分:0)
这是因为您的线型不在'aes'括号内,而是一系列常量。我不知道您的数据集是什么样子,但是最简单的解决方案可能是在每个数据框中创建一个列作为数据集的名称。
那你将拥有
geom_line(aes(x = Age, y = ..., linetype = df), data = ...)
但是,我怀疑,更好的解决方案是将数据合并到一个数据帧中,即使它只是在一个临时数据帧中也是如此。