代码之家  ›  专栏  ›  技术社区  ›  Dan

如何手动向ggplot对象添加图例

  •  10
  • Dan  · 技术社区  · 14 年前

    我有这个数据框架:

    structure(list(month_num = 1:24, founded_month = c(4L, 5L, 6L, 
    7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
    10L, 11L, 12L, 1L, 2L, 3L), founded_year = c(2008L, 2008L, 2008L, 
    2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, 2009L, 2009L, 
    2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 
    2010L, 2010L, 2010L), count = c(270L, 222L, 256L, 250L, 277L, 
    268L, 246L, 214L, 167L, 408L, 201L, 225L, 203L, 220L, 230L, 225L, 
    177L, 207L, 166L, 135L, 116L, 122L, 69L, 42L), month_abb = c("Apr", 
    "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", 
    "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", 
    "Nov", "Dec", "Jan", "Feb", "Mar"), short_year = c("08", "08", 
    "08", "08", "08", "08", "08", "08", "08", "09", "09", "09", "09", 
    "09", "09", "09", "09", "09", "09", "09", "09", "10", "10", "10"
    ), proj = c(282, 246, 292, 298, 337, 340, 330, 310, 275, 528, 
    333, 369, 359, 388, 410, 417, 381, 423, 394, 375, 368, 386, 345, 
    330), label = c("Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", 
    "Nov", "Dec", "Jan\n09", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 
    "Aug", "Sep", "Oct", "Nov", "Dec", "Jan\n10", "Feb", "Mar")), .Names = c("month_num", 
    "founded_month", "founded_year", "count", "month_abb", "short_year", 
    "proj", "label"), row.names = c(NA, -24L), class = "data.frame")
    

    我已经完成了所有这些工作(我知道代码看起来有点难看,感谢指针):

    p <- ggplot(m_summary2, aes(x = month_num, y = count))
    p + 
    geom_line(colour = rgb(0/255, 172/255, 0/255)) + geom_point(colour = rgb(0/255, 172/255,          
        0/255)) + 
    geom_line(aes(x = m_summary2$month_num, y = m_summary2$proj), 
        colour = rgb(18/255, 111/255, 150/255)) + 
    geom_point(aes(x = m_summary2$month_num, y = m_summary2$proj), colour = rgb(18/255,   
        111/255, 150/255)) +     
    scale_x_continuous("Month", breaks = m_summary2$month_num, labels = m_summary2$label) + 
    scale_y_continuous("# Startups Founded") + 
    opts(title = paste("# Startups Founded:", m_summary2$month_abb[1], 
        m_summary2$short_year[1], "-", m_summary2$month_abb[nrow(m_summary2)],  
        m_summary2$short_year[nrow(m_summary2)]))
    

    现在我想添加一个图例来说明蓝线是投影,绿线是当前数据。如果可能,我希望在不更改数据帧的情况下进行更改。

    事先谢谢!

    3 回复  |  直到 7 年前
        1
  •  5
  •   Ramnath    14 年前

    您可以通过使用熔化(在整形包中)轻松实现这一点。下面是定义数据帧后添加的代码。

    id1 = c("month_num","founded_month", "founded_year","month_abb","short_year","label");   
    m_summary3 = melt(m_summary2, id = id1);
    p = ggplot(m_summary3, aes(x = month_num, y = value, group = variable, colour = variable));
    c1 = rgb(0/255, 172/255, 0/255);
    c2 = rgb(18/255, 111/255, 150/255);
    x_scale = scale_x_continuous("Month", breaks = m_summary2$month_num, labels = m_summary2$label);
    y_scale = scale_y_continuous("# Startups Founded")
    
    p + geom_line() + scale_colour_manual(values = c(c1,c2)) + x_scale + y_scale;
    

    拉姆纳特

        2
  •  5
  •   Ramnath    14 年前

    这里有一种手动注释绘图的方法。我假设您保存了打印为p2的绘图。因此,您需要将此代码添加到您已有的代码中。

     x1 = max(m_summary2$month_num)-3;
     y1 = m_summary2$count[x1];
     y2 = m_summary2$proj[x1];
     a1 = annotate("text", x = x1, y = y1, label = "Current", vjust = -2, hjust = 0.2, colour = c1);
     a2 = annotate("text", x = x1, y = y2, label = "Projection", vjust = -2, hjust = 0.2, colour = c2);       
     p2 + a1 + a2;
    

    让我知道这是否有效!

        3
  •  0
  •   mjr2000    7 年前

    这是手动添加图例的另一种方法。这允许您选择属于每个图例名称的颜色,并可用作模板。这是一个明确的传说。

    x <- 1:10
    y <- x^2
    z <- x^3
    values = data.frame(x, y, z)
    # Color has to be inside the aesthetic. 
    ggplot(values, aes(x=x)) + 
    geom_line(aes(y=y, 
                  color="x^2")) + 
    geom_line(aes(y=z, 
                  color="x^3")) + 
    scale_color_manual(name="", 
                       values=c("x^2"="cornflowerblue", "x^3"="lightgreen"))
    

    这是定义颜色变量的更好方法。在可视化之前整理数据。这是一个含蓄的传说。

    library(tidyverse)
    
    sp500 = rnorm(10, 2400, 50)
    nasdaq = rnorm(10, 6250, 100)
    date = seq(Sys.Date(), Sys.Date()+9, 1)
    
    dataMatrix = tibble(sp500, nasdaq, date)
    
    dataMatrix %>% 
      # This creates a varaible for the indexes, which is used for coloring the lines. 
      gather(sp500, nasdaq, key="index", value="price") %>% 
        ggplot(aes(x=date, 
                   y=price, 
                   color=index)) +  
        geom_line() + 
      # This is used for customizing the legend. 
        scale_color_manual(
             name="Index",                   
             values=c("blue", "red"), 
             labels=c("Nasdaq", "S&P 500")) + 
      # This is used for customizing the plot descriptions. 
        labs(title="FINANCIAL MARKETS", 
             subtitle="USA INDEXES", 
             caption="MJR", 
             x="Date", 
             y="Price")