How do I set the color of a single line using ggplot

前端 未结 2 459
太阳男子
太阳男子 2021-01-22 08:17
df<-data.frame(adjuster=c(\"Mary\",\"Mary\",\"Bob\",\"Bob\",\"Mary\"), 
           date=as.Date(c(\"2012-1-1\",\"2012-2-1\",\"2012-3-1\",\"2012-4-1\",\"2012-5-1\")),          


        
相关标签:
2条回答
  • 2021-01-22 09:05

    Here is a possible solution that results in cleaner plotting code, more in the spirit of how ggplot2 is designed. The price is that your data needs to be rearranged a bit. I've also used some additional code to dynamically generate a named character vector of color values. Thanks to @John Colby for gg_color_hue().

    The data are now in 'long-form', with all x-values and y-values in two columns. Additionally, there are two grouping factors, to separate the semantics of drawing the lines versus coloring the lines and points:

    col_group line_group       date total
         Mary   Adjuster 2012-01-01    10
         Mary   Adjuster 2012-02-01    15
          Bob   Adjuster 2012-03-01    25
          Bob   Adjuster 2012-04-01    15
         Mary   Adjuster 2012-05-01    20
         Paid       Paid 2012-01-01     5
         Paid       Paid 2012-02-01     5
         Paid       Paid 2012-03-01    10
         Paid       Paid 2012-04-01    10
         Paid       Paid 2012-05-01    15
    

    dat <- data.frame(col_group=c("Mary","Mary","Bob", "Bob", "Mary",
                                  "Paid","Paid","Paid","Paid","Paid"),
                      line_group=c("Adjuster","Adjuster","Adjuster","Adjuster","Adjuster",
                                   "Paid","Paid","Paid","Paid","Paid"), 
                      date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1","2012-5-1",
                                     "2012-1-1","2012-2-1","2012-3-1","2012-4-1","2012-5-1")), 
                      total=c(10,15,25,15,20,
                              5, 5, 10,10,15))
    
    # Color generating function found here:
    # http://stackoverflow.com/questions/8197559/emulate-ggplot2-default-color-palette
    gg_color_hue <- function(n) {
      hues = seq(15, 375, length=n+1)
      hcl(h=hues, l=65, c=100)[1:n]
    }
    
    # Dynamically generate default color values, but have Paid="black".
    adj_names = sort(setdiff(unique(dat$col_group), "Paid"))
    values = gg_color_hue(length(adj_names))
    names(values) = adj_names
    values = c(values, c(Paid="black"))
    
    library(ggplot2)
    plot1 <- ggplot(dat, aes(x=date, y=total, colour=col_group)) +
             geom_line(aes(group=line_group), size=1.2) +
             geom_point(size=2.8) +
             scale_colour_manual(values=values)
    
    ggsave("plot1.png", plot=plot1, width=6, height=4.5, dpi=120)
    

    enter image description here

    0 讨论(0)
  • 2021-01-22 09:09

    This way Paid column is added as a separate layer, but that means it's not in the legend. I don't get why the column Paid would go in a legend with different levels of adjuster anyway. Why is that?

    library(ggplot2)
    df <- data.frame(adjuster=c("Mary","Mary","Bob","Bob","Mary"), 
               date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1","2012-5-1")), 
               total=c(10,15,25,15,20), paid=c(5,5,10,10,15))
    
    ggplot(df, aes(x=date,y=total,color=adjuster,group=1)) + 
      geom_point() +
      geom_line(aes(x=date, y=total, color=adjuster, group=1)) +
      geom_line(aes(x=date, y=paid, group=2), data=df, colour="black") +
      scale_color_discrete(name="Legend")
    

    enter image description here

    0 讨论(0)
提交回复
热议问题