【问题标题】:Adding arrows (or image of arrow) onto bar chart in plotly or ggplot in R?在 R 中的 plotly 或 ggplot 中将箭头(或箭头图像)添加到条形图上?
【发布时间】:2020-05-06 16:42:59
【问题描述】:

有没有办法根据一些基础信息在条形图的一侧添加箭头图像?

我有以下脚本:

library(tidyverse)
library(plotly)

data <- tibble(url = c("google.com","yahoo.com","yandex.com"), values = c(500,400,300), change = c(0.5,-0.9,0.1))

data

data %>%
  plot_ly(x = data$values,
          y = data$url,
          type = "bar")

这会生成一个简单的条形图,我想在每个条形图旁边添加一些箭头,以显示基于data$change 列的值已经减少或增加。因此,如果数字为正,则箭头朝上并呈绿色,如果为负,则箭头朝下并呈红色

这可能吗?

如果这都不可能 - 有没有办法只覆盖百分比变化的文本而不是条形图旁边?

希望这会出现在一个闪亮的应用程序上,所以即使有一种嵌入或覆盖 html 元素的方法也会很有用!

如果 ggplot 有替代方案,我也会感兴趣。

希望是这样的:

仅更新以下代码:

`library(tidyverse)
library(plotly)

data <- tibble(url = c("google.com","yahoo.com","yandex.com"), values = c(500,400,300), change = c(0.5,-0.9,0.1))

data

data %>%
  plot_ly(x = data$values,
          y = data$url,
          type = "bar")


library(dplyr)
data <- data %>% 
  mutate(x.start = values + 50,
         y.end = seq(0,2,1),
         y.start = y.end + 0.5) %>% 
  mutate(y.start.new = case_when(sign(change) == -1 ~ y.end,
                                 TRUE ~ y.start),
         y.end.new = case_when(sign(change) == -1 ~ y.start,
                               TRUE ~ y.end)
  )


data %>%
  plot_ly(x = data$values,
          y = data$url,
          type = "bar") %>% 
  add_markers(~values, ~url) %>%
  add_annotations(x = ~x.start[change == "up"],
                  y = ~y.start.new[change == "up"],
                  xref = "x", yref = "y",
                  axref = "x", ayref = "y",
                  text = "",
                  showarrow = T,
                  ax = ~x.start[change == "up"],
                  ay = ~y.end.new[change == "up"],
                  arrowcolor = "green") %>% 
  add_annotations(x = ~x.start[change == "down"],
                  y = ~y.start.new[change == "down"],
                  xref = "x", yref = "y",
                  axref = "x", ayref = "y",
                  text = "",
                  showarrow = T,
                  ax = ~x.start[change == "down"],
                  ay = ~y.end.new[change == "down"],
                  arrowcolor = "red")
`

但是您没有产生相同的输出 - 只出现一个箭头?

【问题讨论】:

    标签: r ggplot2 plotly


    【解决方案1】:

    您可以添加注释。首先指定箭头的开始和结束位置:请注意,在您提供的数据中,您有 yahoo 减少,而不是 yandex 像在您的情节中。

    library(dplyr)
    data <- data %>% 
      mutate(x.start = values + 50,
             y.end = seq(0,2,1),
             y.start = y.end + 0.5) %>% 
      mutate(y.start.new = case_when(sign(change) == -1 ~ y.end,
                                     TRUE ~ y.start),
             y.end.new = case_when(sign(change) == -1 ~ y.start,
                                   TRUE ~ y.end)
             ) %>% 
       mutate(change_dir = case_when(sign(change) == -1 ~ "down",
                                    sign(change) == 1 ~ "up"))
    

    然后使用add_annotations进行绘图

    data %>%
      plot_ly(x = data$values,
              y = data$url,
              type = "bar") %>% 
      add_markers(~values, ~url) %>%
      add_annotations(x = ~x.start[change_dir == "up"],
                       y = ~y.start.new[change_dir == "up"],
                       xref = "x", yref = "y",
                       axref = "x", ayref = "y",
                       text = "",
                       showarrow = T,
                       ax = ~x.start[change_dir == "up"],
                       ay = ~y.end.new[change_dir == "up"],
                      arrowcolor = "green") %>% 
      add_annotations(x = ~x.start[change_dir == "down"],
                      y = ~y.start.new[change_dir == "down"],
                      xref = "x", yref = "y",
                      axref = "x", ayref = "y",
                      text = "",
                      showarrow = T,
                      ax = ~x.start[change_dir == "down"],
                      ay = ~y.end.new[change_dir == "down"],
                      arrowcolor = "red")
    

    【讨论】:

    • 我对 yahoo.com 的误解!但是感谢您的帮助注释是我以前没有研究过的东西!
    • 你确定是change_dir吗?在变量列中而不是“更改”?我似乎没有得到相同的答案 - 我只得到一个箭头而不是 3
    • @BeansOnToast 糟糕的是,我确实有一个名为 change_dir 的变量用于索引。我已经把它加回去了。你也可以用sign(change) == 1 之类的东西来索引
    • 不错的一个 - 似乎工作得很好 - 我现在需要做的就是调整箭头之间的距离!