【问题标题】:How to add a legend on a multiple line graph in R?如何在 R 中的多线图上添加图例?
【发布时间】:2020-05-07 11:36:01
【问题描述】:

我试图在同一个图上绘制两个不同的数据集。我正在使用此代码添加行并实际绘制所有内容

ggplot()+
geom_point(data=Acc, aes(x=Year, y=Accumulo), color="lightskyblue")+
geom_line(data=Acc, aes(x=Year, y=RM3), color="gold1")+
geom_line(data=Acc, aes(x=Year, y=RM5), color="springgreen3")+
geom_line(data=Acc, aes(x=Year, y=RM50), color="blue")+
geom_line(data=Vulcani, aes(x=Year, y=Accumulo.V), color="red")+
theme_bw()+
scale_x_continuous(expand=expand_scale(0)) + scale_y_continuous(limits=c(50,350),expand=expand_scale(0))

但我找不到任何方法来添加图例并将自定义标签添加到不同的系列。我找到了一种在单个数据集上添加图例的方法,但我找不到一种方法可以在旁边添加一个图例

【问题讨论】:

  • Acc 和 Vulcani 的基本示例将帮助我们重现问题
  • 请随意将带有dput(Acc)dput(Vulcani) 的数据集摘录添加到您的问题中,以获得更准确的答案

标签: r ggplot2 line legend


【解决方案1】:

您最好先创建一个适合您的绘图需求的单个数据集,该数据集将采用长格式,以便您可以给出单个 geom_line() 指令,并在致电geom_line()。这是midwest 数据集的示例(为了示例,将它们视为不同的数据集)

library(ggplot2)
library(dplyr)
library(tidyr)

long_midwest <- midwest %>% 
    select(popwhite, popasian, PID, poptotal) %>% 
    gather(key = "variable", value = "value", -PID, -poptotal) # convert to long format

long_midwest2 <- midwest %>% 
    select(poptotal, perchsd, PID) %>% 
    gather(key = "variable", value = "value", -PID, -poptotal)

plot_data <- bind_rows(long_midwest, long_midwest2) %>% # bind datasets vertically
    mutate(line_type = ifelse(variable == 'perchsd', 'A', 'B')) # creates a line_type variable

ggplot(data = plot_data, aes(x=poptotal, y = value))+
    geom_line(aes(color = variable, linetype = line_type)) +
    scale_color_manual(
        values = c('lightskyblue', 'gold1', 'blue'),
        name = "My color legend"
    ) +
    scale_linetype_manual(
        values = c(3, 1), # play with the numbers to get the correct styling
        name = "My linetype legend"
    )

我添加了一个line_type 变量来显示最通用的情况,您需要在列值和行类型之间进行特定映射。如果它与variable 相同,则只需使用aes(color = variable, linetype = variable)。然后,您可以决定您想要哪种线型 (see here for more details)。

要自定义标签,只需将数据集中variable 的内容更改为所需的值即可。

【讨论】:

  • 我正在尝试使用此示例作为参考,但据我了解,您绑定在一起的数据集长度相同,并且将使用相同的 x 轴(如果我'我错了)...我没有在我的帖子中指定这一点,因为我认为这不是解决方案的关键部分,但是我有两个数据集的 x 轴有两个不同的系列(它们仍然被绘制在相同的变量上,但具有不同的值
  • bind_rows 不需要有共同的 x 值,也不需要相同的行数,它是一个简单的行绑定。不过,它确实需要两个数据集中的列具有相同的名称。只要确保两个数据集中的 x 系列属于同一类型(我猜是双精度或数字)
  • 好的,我试试!是的,我需要在图表中同时包含点和线......当你说向数据集添加 line_type 变量时......你到底是什么意思?对不起,我是 R 的新手
  • 我已经编辑了答案以在 aes() 调用中添加线型规范。在aes() 调用中使用linetype 意味着您将图形线条的样式映射到数据集中变量的值(这就是ggplot2 中的美学)。还要记住,区分线型应该除了视觉冲击和颜色已经赋予的含义之外还有意义,这就是为什么我在示例图中保留了第二个图例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2014-09-19
相关资源
最近更新 更多