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

ggplotly with tooltip在使用gemo rect()时出现问题

  •  2
  • Stan  · 技术社区  · 7 年前

    我正试图用ggplotly绘制一些数据。 X轴包含日期。ggplotly不能很好地处理日期,因为当我悬停在一个点上时,日期显示为一个数字。 我通过如下设置工具提示来解决这个问题。

    一些示例数据:

    x <- data.frame(Date = as.Date(seq(Sys.Date(), Sys.Date() + 29, by = "days")), Amount = seq(-10000, 19000, by = 1000),
                stringsAsFactors = FALSE)
    

    情节:

    ggplotly(ggplot(x, aes(x = Date, y = Amount, group = 1, text = paste("Date: ", Date, "<br>Amount: ", Amount))) + geom_line() + geom_point() 
         , tooltip = "text")
    

    现在,我想使用geom rect()根据y轴的值获取一些背景色。这给了我一些问题,因为矩形似乎被放置在geom线的顶部()。另外,矩形也用ggplotly标记,我也不想要。 下面是我尝试的代码(当我不使用自定义工具提示时,背景颜色可以正常工作,但是标签中的日期出现问题):

    ggplotly(ggplot(x, aes(x = Date, y = Amount, group = 1, text = paste("Date: ", Date, "<br>Amount: ", Amount))) + geom_line() + geom_point() 
         +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = 10000, ymax = max(max(x$Amount) + 1000, 11000), fill = "1")) +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = 0, ymax = 10000, fill = "2")) +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = min(min(x$Amount) - 1000, 0), ymax = 0, fill = "3"))
         +
           scale_fill_manual(values = alpha(c("green", "orange", "red"), 0.2))
         , tooltip = "text")
    

    Result

    任何帮助都将不胜感激,谢谢!

    编辑:

    以下代码导致geom rect()工作:

    ggplotly(ggplot(x, aes(x = Date, y = Amount)) + geom_line() + geom_point() 
         +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = 10000, ymax = max(max(x$Amount) + 1000, 11000), fill = "1")) +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = 0, ymax = 10000, fill = "2")) +
           geom_rect(aes(xmin = as.Date(Sys.Date()),
                         xmax = as.Date(Sys.Date() + 30),
                         ymin = min(min(x$Amount) - 1000, 0), ymax = 0, fill = "3"))
         +
           scale_fill_manual(values = alpha(c("green", "orange", "red"), 0.2)))
    

    Result

    1 回复  |  直到 7 年前
        1
  •  3
  •   MLavoie    7 年前

    你可以试试这个:

    ggplotly(ggplot() +
               geom_rect(data = x, aes(xmin = as.Date(Sys.Date()),
                             xmax = as.Date(Sys.Date() + 30),
                             ymin = 10000, ymax = max(max(x$Amount) + 1000, 11000), fill = "1")) +
               geom_rect(data = x, aes(xmin = as.Date(Sys.Date()),
                             xmax = as.Date(Sys.Date() + 30),
                             ymin = 0, ymax = 10000, fill = "2")) +
               geom_rect(data = x, aes(xmin = as.Date(Sys.Date()),
                             xmax = as.Date(Sys.Date() + 30),
                             ymin = min(min(x$Amount) - 1000, 0), ymax = 0, fill = "3")) + 
               geom_line(data = x, aes(x = Date, y = Amount, group = 1, text = paste("Date: ", Date, "<br>Amount: ", Amount))) + 
               geom_point(data = x, aes(x = Date, y = Amount, text = paste("Date: ", Date, "<br>Amount: ", Amount))) +
                     scale_fill_manual(values = alpha(c("green", "orange", "red"), 0.2))
                   , tooltip = "text")
    
    推荐文章