【问题标题】:R ggplot2 plot single data with 2 hlines and correct legendR ggplot2 用 2 条线和正确的图例绘制单个数据
【发布时间】:2018-01-03 02:04:27
【问题描述】:

在 Axeman 的帮助下,我已经能够用均值/中值线绘制一个数据。为了完成注释,我想将平均值/中值放入图例标签中。我的代码:

require(data.table)
require(ggplot2)
wf <- data.table::fread('Date Gals Days  GpD    GpM
                     2016-10-21  6.0    1  6.0  186.0
                     2016-10-22  6.0    1  6.0  186.0
                     2016-10-23 12.4    1 12.4  384.4
                     2016-10-24 26.8    1 26.8  830.8
                     2016-10-25 33.3    1 33.3 1032.3
                     2016-10-26 28.3    1 28.3  877.3')
nmu <- mean(wf$Gals)
textmu <- paste("Mean:", round(nmu, 2))
nmed <- median(wf$Gals)
textmed <- paste("Median:", round(nmed, 2))

p <- ggplot(wf, aes(Date, Gals)) +  
     geom_line(aes(lty = "Gals", color = "Gals", group = 1)) +
     geom_hline(aes(yintercept = nmu,  linetype = textmu, color = textmu), 
                color='red',size=1)+
     geom_hline(aes(yintercept = nmed, linetype = textmed, color = textmed), 
                color='orange',size=1)+
     #scale_linetype('Water Usage') +
     scale_color_manual('Water Usage', 
                        values=c('Gals'='black',textmu='red', textmed='orange')) +
     xlab("") + 
     ylab("Gallons per Day")

print(p)

产生:

我该如何纠正这个问题?

【问题讨论】:

    标签: r plot ggplot2 legend


    【解决方案1】:

    准备一个标签向量,然后使用我在previous answer 中提供的代码:

    labels <- c(Gals = 'Gals',
                Mean = paste("Mean:", round(mean(wf$Gals), 2)),
                Median = paste("Median:", round(median(wf$Gals), 2)))
    
    ggplot(wf, aes(Date, Gals)) +  
      geom_line(aes(lty = "Gals", color = "Gals", group = 1)) +
      geom_hline(aes(yintercept = mean(wf$Gals), linetype = "Mean", color = "Mean"), size=1) +
      geom_hline(aes(yintercept = median(wf$Gals), linetype = "Median", color = "Median"), size = 1) +
      scale_linetype('Water Usage', labels = labels) +
      scale_color_manual(
        'Water Usage', 
        values = c('Gals' = 'black', 'Mean' = 'red', 'Median' = 'orange'),
        labels = labels
      ) +
      xlab("") + ylab("Gallons per Day")
    

    【讨论】:

    • 不错的结果。这正是我想要做的,保持 data.frame 尽可能简单,并获得更多的 ggplot2 知识。感谢 Axeman 和社区!
    【解决方案2】:

    通过融化您的data.table,您可以:

    require(data.table)
    require(ggplot2)
    wf <- data.table::fread('Date Gals Days  GpD    GpM
                        2016-10-21  6.0    1  6.0  186.0
                        2016-10-22  6.0    1  6.0  186.0
                        2016-10-23 12.4    1 12.4  384.4
                        2016-10-24 26.8    1 26.8  830.8
                        2016-10-25 33.3    1 33.3 1032.3
                        2016-10-26 28.3    1 28.3  877.3')
    
    wf[,`:=`(Mean=round(mean(Gals),2),Median=round(median(Gals),2))]
    
    p <- ggplot(melt(wf,id.vars = c(1,3))
    [variable%in%c("Gals","Mean","Median")], aes(Date, 
    value,color=variable,group=variable)) +  
    geom_line() +
    scale_color_manual('Water Usage',values=c('Gals'='black',Mean='red', 
    Median='orange')) +
    xlab("") + 
    ylab("Gallons per Day")
    
    print(p)
    

    【讨论】:

    • 根据问题,这不会将平均值和中值放在图例标签中。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多