plotly:可能只使某些图形对象具有交互性?

时间:2018-02-23 12:10:56

标签: r ggplot2 ggplotly

我有一个ggplot我想转向互动。但是,我不希望所有的对象都是交互式的,因为有些对象实际上是用作一种背景图(在这种情况下,是温室植物的行)。 顶部正方形中的数据应该是交互式的,而不是绿色植物点或灰色行。

这甚至可以用剧情吗?如果是这样的话:怎么样?

我的代码和结果(我添加了theme_update(),因此复制看起来与我的完全一样,尽管它不那么重要):

代码

    # counts in greenhouse 
Wtot <- c(10,65,139,87) 
plant <- c(15,15,30,30) 
row <- c(10,20,10,20) 
df <- data.frame(Wtot,plant,row)

    # df for greenhouse background 
nrows = 40 
nplants = 50 
greenh <- data.frame(   
  Row <- rep(1:nrows, each=nplants),   
  Plant <- rep(1:nplants, times=nrows),   
  Plantnr <- paste("plant",1:(nrows*nplants)) 
)

    # plottheme
theme_set(theme_bw()) 
theme_update(axis.title.x = element_text(size = 16, colour = 'black'),
             axis.title.y = element_text(size = 16, colour = 'black', angle = 90),
             axis.text.x = element_text(size = 12, colour = 'black'),
             axis.text.y = element_text(size = 12, colour = 'black'),
             legend.text = element_text(size = 14, colour = 'black'),
             legend.title = element_blank(),
             legend.position = "right",
             legend.box = "vertical",
             strip.text.x = element_text(size = 14, colour = 'black'),
             strip.text.y = element_text(size = 14, colour = 'black', angle = -90),
             panel.background = element_rect(fill = "gray94"),
             panel.grid.minor = element_blank(),
             panel.grid.major = element_blank())

    # plot 
p <- ggplot(data=df, aes(row, plant, colour=Wtot)) +   
   xlim(0,nrows) +   
   ylim(0,nplants) +   
   coord_equal() +   
   geom_vline(xintercept=1:nrows, colour="darkgrey", alpha=0.5, size=0.7) +    
   geom_point(data=greenh, aes(x=Row, y=Plant), colour="darkgreen", alpha=0.3) +  
   geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +  
   scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey", 
                           limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +   
   scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +    
   guides(fill=guide_legend(), size = guide_legend())

图形 enter image description here

2 个答案:

答案 0 :(得分:2)

您有几个选择:

选项1:使用ggplotly您将失去您的传奇。但您必须手动添加积分。

 # p <- ggplot(data=df, aes(row, plant, colour=Wtot)) +   
   p <- ggplot(data=greenh, aes(x=Row, y=Plant)) + 
   xlim(0,nrows) +   
   ylim(0,nplants) +   
   coord_equal() +   
   geom_vline(xintercept=1:nrows, colour="darkgrey", alpha=0.5, size=0.7) +    
   geom_point(colour="darkgreen", alpha=0.3) +  
  #geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +  
   scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey", 
                         limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +   
   scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +    
   guides(fill=guide_legend(), size = guide_legend())

  pp <- ggplotly(p, tooltip = "none")
  pp %>% add_markers(x = c(10, 20, 10, 20), y = c(15, 15, 30, 30), color = I("green"), text = c(10, 65, 139, 87), symbol = I('square'), marker = list(size = c(14, 13, 15, 12)))

选项2:使用plot_ly可以获得类似于图例的内容。您只需根据需要设置颜色和尺寸。

plot_ly(data=greenh, x=~Row, y= ~Plant) %>% 
add_markers(showlegend = FALSE, color = I("green"), hoverinfo = "none") %>% 
add_markers(data=df, x=~row, y= ~plant, showlegend = TRUE, color = ~ Wtot, size = ~ Wtot)

答案 1 :(得分:0)

所以我找到了解决方案,并且还发现我遗漏了非常重要的信息:我在flexdashboard中使用这个交互式绘图。我省略了那部分以保持示例简单,但显然它掌握了密钥!

这个问题的答案让我走上正轨:How do I show the y value on tooltip while hover in ggplot2

使用闪亮功能plotOutput()renderPlot()时,您可以通过hover =中的参数plotOutput添加悬停功能。 Flexdashboards没有单独的ui和服务器部分,因此不使用plotOutput()。这意味着您需要单独指定悬停选项,然后通过参数renderPlot() 将其添加到outputArgs =(更多信息:https://shiny.rstudio.com/articles/output-args.html

 # specify hover details
 HO <- hoverOpts(id = "plot_hover", delay = 300, delayType = c("debounce", "throttle"), 
                 clip = TRUE, nullOutside = TRUE)

 # reactive plot function
 renderPlot({
 ggplot(data=df, aes(row, plant, colour=Wtot)) +   
   xlim(0,40) +   
   ylim(0,50) +   
   coord_equal() +   
   geom_vline(xintercept=1:nrows, colour="darkgrey", alpha=0.5, size=0.7) +    
   geom_point(data=greenh, aes(x=Row, y=Plant), colour="darkgreen", alpha=0.3) +  
   geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +  
   scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey", 
                           limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +   
   scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +    
   guides(fill=guide_legend(), size = guide_legend())
}, outputArgs = list(hover = HO)) # include hover options

现在情节已准备好显示悬停信息,但它还没有显示任何内容。您必须指定您希望查看的信息。在这里我可以告诉它只显示正方形而不是温室元素的信息:

# shown hover results
renderPrint({ 
  hover <- input$plot_hover
  y <- nearPoints(df, input$plot_hover)
  req(nrow(y) != 0)
  y
})

您可以进一步调整代码以将信息显示为工具提示(请参阅上面提到的主题)。

我希望这对其他人有帮助!