【问题标题】:No legend in ggplot line graphggplot折线图中没有图例
【发布时间】:2018-10-24 03:57:08
【问题描述】:

我正在尝试为使用 ggplot 创建的折线图生成图例。从我一直在阅读的内容来看,应该自动制作图例,因为我已经改变了图形的美学并将线型包含在 aes 函数中,但它是不可见的。我一直在网上搜索这个确切问题的答案,并尝试了很多方法,但似乎没有任何效果。我想我错过了一些非常小的东西。我尝试使用 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()

【问题讨论】:

  • ggplot 如果您提供长(又名“整洁”)数据并将数据的不同方面映射到不同的美学,它将为您完成更多工作(包括图例)。因此,不要像这里那样指定preds 的四个系列,我建议使用tidyr::gather(type, value, fwd.preds:ruck:preds) 之类的东西来使您的数据变长,然后用一个替换四个geom_line 调用,例如geom_line(aes(x = Age, color = type)...

标签: r ggplot2 legend linegraph


【解决方案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()

请注意,我们现在可以只在aes() 中包含Position 列,ggplot 会自动处理图例和不同的线型。

【讨论】:

    【解决方案2】:

    这是因为您的线型不在“aes”括号内,而是一系列常量。我不知道您的数据集是什么样的,但最简单的解决方案可能是在每个数据框中创建一个列,该列是数据集的名称。

    那么你就会有

    geom_line(aes(x = Age, y = ..., linetype = df), data = ...) 
    

    但是,我怀疑,一个更好的解决方案是将数据合并到一个数据帧中,即使它只是在一个临时数据帧中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2016-04-06
      • 2022-01-12
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多