首页 文章

将图例添加到ggplot2折线图中

提问于
浏览
115

我对ggplot2中的传说有疑问 . 我设法在同一图表中绘制三条线,并想要添加使用三种颜色的图例 . 这是使用的代码

library(ggplot2)    
require(RCurl)

link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt")
datos<- read.csv(textConnection(link),header=TRUE,sep=";")
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")    

temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) + 
           geom_line(colour="red") + opts(title="TITULO") +
           ylab("Temperatura (C)") + xlab(" ") + 
           scale_y_continuous(limits = c(-10,40)) + 
           geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") + 
           geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") +
           scale_colour_manual(values=c("red","green","blue"))

temp

和输出

ggplot three lines

我想添加一个带有三种颜色的图例和变量的名称(TempMax,TempMedia和TempMin) . 我试过了

scale_colour_manual

但找不到确切的方法 .

遗憾的是,原始数据已从链接网站中删除,无法恢复 . 但它们来自具有此格式的meteo数据文件

"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed"
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49

3 回答

  • 164

    我倾向于发现如果我在多个geom中指定单独的颜色,我做错了 . 这是我绘制数据的方式:

    ##Subset the necessary columns
    dd_sub = datos[,c(20, 2,3,5)]
    ##Then rearrange your data frame
    library(reshape2)
    dd = melt(dd_sub, id=c("fecha"))
    

    剩下的就是一个简单的ggplot命令:

    ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) +
      scale_colour_manual(values=c("red","green","blue"))
    

    Example plot

    enter image description here

  • 3

    由于@Etienne询问如何在不熔化数据的情况下这样做(这通常是首选方法,但我认识到可能存在一些不可能的情况),我提出以下备选方案 .

    从原始数据的子集开始:

    datos <-
    structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
    1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
    1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
    1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
    "POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
    30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
    26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
    22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
    23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
    19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
    16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
    16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
    "TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame")
    

    您可以通过以下方式获得所需的效果(这也会清除原始绘图代码):

    ggplot(data = datos, aes(x = fecha)) +
      geom_line(aes(y = TempMax, colour = "TempMax")) +
      geom_line(aes(y = TempMedia, colour = "TempMedia")) +
      geom_line(aes(y = TempMin, colour = "TempMin")) +
      scale_colour_manual("", 
                          breaks = c("TempMax", "TempMedia", "TempMin"),
                          values = c("red", "green", "blue")) +
      xlab(" ") +
      scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
      labs(title="TITULO")
    

    我们的想法是通过将 colour 美学映射到一个常量字符串来为每一行赋予颜色 . 选择要在图例中显示的字符串是最简单的 . 在这种情况下它与绘制的 y 变量的名称相同的事实并不重要;它可以是任何字符串集 . 这是非常重要的,这是在 aes 电话内;您正在创建到此"variable"的映射 .

    scale_colour_manual 现在可以将这些字符串映射到适当的颜色 . 结果是
    enter image description here

    在某些情况下,需要通过在手动缩放中命名值来明确级别和颜色之间的映射(感谢@DaveRGP指出这一点):

    ggplot(data = datos, aes(x = fecha)) +
      geom_line(aes(y = TempMax, colour = "TempMax")) +
      geom_line(aes(y = TempMedia, colour = "TempMedia")) +
      geom_line(aes(y = TempMin, colour = "TempMin")) +
      scale_colour_manual("", 
                          values = c("TempMedia"="green", "TempMax"="red", 
                                     "TempMin"="blue")) +
      xlab(" ") +
      scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
      labs(title="TITULO")
    

    (给出与以前相同的数字) . 使用命名值,可以使用中断设置图例中的顺序,并且可以在值中使用任何顺序 .

    ggplot(data = datos, aes(x = fecha)) +
      geom_line(aes(y = TempMax, colour = "TempMax")) +
      geom_line(aes(y = TempMedia, colour = "TempMedia")) +
      geom_line(aes(y = TempMin, colour = "TempMin")) +
      scale_colour_manual("", 
                          breaks = c("TempMedia", "TempMax", "TempMin"),
                          values = c("TempMedia"="green", "TempMax"="red", 
                                     "TempMin"="blue")) +
      xlab(" ") +
      scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
      labs(title="TITULO")
    

  • 69

    我非常喜欢@Brian Diggs提出的解决方案 . 但是,在我的情况下,我在一个循环中创建线图而不是明确地给它们,因为我不知道apriori我将拥有多少个图 . 当我试图调整@Brian的代码时,我遇到了正确处理颜色的一些问题 . 原来我需要修改美学功能 . 如果有人遇到同样的问题,这里的代码对我有用 .

    我和@Brian使用了相同的数据框:

    data <- structure(list(month = structure(c(1317452400, 1317538800, 1317625200, 1317711600, 
                                           1317798000, 1317884400, 1317970800, 1318057200, 
                                           1318143600, 1318230000, 1318316400, 1318402800, 
                                           1318489200, 1318575600, 1318662000, 1318748400, 
                                           1318834800, 1318921200, 1319007600, 1319094000), 
                                         class = c("POSIXct", "POSIXt"), tzone = ""),
                       TempMax = c(26.58, 27.78, 27.9, 27.44, 30.9, 30.44, 27.57, 25.71, 
                                   25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 26.58, 26.18, 
                                   25.19, 24.19, 27.65, 23.92), 
                       TempMed = c(22.88, 22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52,
                                     19.71, 20.73, 23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 
                                     20.45, 19.42, 19.97, 19.61), 
                       TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 16.88, 16.82, 
                                   14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 16.95, 
                                   17.55, 15.21, 14.22, 16.42)), 
                  .Names = c("month", "TempMax", "TempMed", "TempMin"), 
                  row.names = c(NA, 20L), class = "data.frame")
    

    在我的情况下,我动态生成 my.colsmy.names ,但我不想让事情变得不必要地复杂,所以我在这里明确地给出它们 . 这三行使图例的排序和颜色分配更容易 .

    my.cols <- heat.colors(3, alpha=1)
    my.names <- c("TempMin", "TempMed", "TempMax")
    names(my.cols) <- my.names
    

    这是情节:

    p <-  ggplot(data, aes(x = month))
    
    for (i in 1:3){
      p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
    colnames(data[i+1])))#as.character(my.names[i])))
    }
    p + scale_colour_manual("", 
                            breaks = as.character(my.names),
                            values = my.cols)
    p
    

    enter image description here

相关问题