点击堆叠条形图打开选项卡。

6
我正在使用R、ggplot和plotly构建一个包含转发的堆叠条形图。如果单击条形图的某一部分,我希望打开一个新的浏览器标签,并显示特定日期的推文及其指定的转发量。但是,当我在下面的示例中单击其中一个条形图时,会打开不同的链接,这表明url与条形图没有正确连接。我该如何解决这个问题?
我以前从未接触过JavaScript,因此答案很可能就在那里。最终,该图形将显示在Shiny应用程序中。
library(rtweet)
library(ggplot2)
library(plotly)

# Get tweets
tweets <- get_timeline("BBC", n = 10)

# Create dataframe
data <- data.frame("retweet_count" = tweets$retweet_count,
                   "week" =  c(1,1,1,2,2,3,4,5,5,6),
                   "url"  =  tweets$status_url)

# Create ggplot
ggplot(data = data,
           aes(x = week,
           y = retweet_count,
           label = url)) + 
  geom_bar(stat = 'sum', 
           fill = "darkblue")

# Convert to plotly
p <- ggplotly(
  p,
  tooltip = c("y", 'label'))

# Add URL data to plot
p$x$data[[1]]$customdata <- data$url

# JS function to make a tab open when clicking on a specific bar
onRender(
  p,
  "
    function(el,x){
    el.on('plotly_click', function(d) {
    var websitelink = d.points[0].customdata;
    window.open(websitelink);
    });
    }
    ")
1个回答

0

我没有Twitter账号,所以我将你的数据集改为使用一些维基百科的文章。

你的问题可以通过按照URL重新排列你的data.frame来解决。如果你在1:9的文章上运行以下代码,一切都会按预期工作。一旦你切换到带有链接9:1的数据集,你将得到错误的链接。Plotly似乎在内部重新排序 - 和这里的逻辑相同。

在你的情况下,data <- data[order(data$url),]应该修复顺序。

以下工作正常:

# library(rtweet)
library(ggplot2)
library(plotly)
library(htmlwidgets)

# Get tweets
# tweets <- get_timeline("BBC", n = 10)

# Create dataframe
# data <- data.frame("retweet_count" = tweets$retweet_count,
#                    "week" =  c(1,1,1,2,2,3,4,5,5,6),
#                    "url"  =  tweets$status_url)

# Create dataframe
# Works!
data <- data.frame("retweet_count" = 1:9,
                   "week" =  1:9,
                   "url"  =  paste0(c("https://en.wikipedia.org/wiki/166"), 1:9))
# Doesn't work!
# data <- data.frame("retweet_count" = 9:1,
#                    "week" =  9:1,
#                    "url"  =  paste0(c("https://en.wikipedia.org/wiki/166"), 9:1))

# Create ggplot
p <- ggplot(data = data,
       aes(x = week,
           y = retweet_count,
           label = url)) + 
  geom_bar(stat = 'sum', 
           fill = "darkblue")

# Convert to plotly
p <- ggplotly(
  p,
  tooltip = c("y", 'label'))

# Add URL data to plot
p$x$data[[1]]$customdata <- data$url

# JS function to make a tab open when clicking on a specific bar
onRender(
  p,
  "
    function(el,x){
    el.on('plotly_click', function(d) {
    var websitelink = d.points[0].customdata;
    window.open(websitelink);
    });
    }
    ")

谢谢您的努力!应用你的例子确实给了我正确的解决方案。然而,对于我来说,当在同一天发送不同的推文时会出现问题,将柱状图堆叠在彼此上面。由于每天的排序方式不同,所以排序函数就无法正常工作了。 - jjh
1
请问您能否提供dput(tweets)的输出结果? - ismirsehregal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接