Добавление стрелок (или изображения стрелки) на гистограмму в plotly или ggplot в R? - PullRequest
0 голосов
/ 06 мая 2020

Есть ли способ добавить изображение стрелки сбоку на гистограмме на основе некоторой базовой информации?

У меня есть следующий скрипт:

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. поэтому, если число положительное, стрелка повернута вверх, а зеленая, если отрицательная, то стрелка красного цвета, направленная вниз

Возможно ли это?

Если это невозможно - есть ли способ наложить просто текст процентного изменения вместо столбчатой ​​диаграммы?

Надеюсь, это go будет на блестящем приложении, поэтому даже если есть способ встраивания или наложения элемента html, было бы полезно!

Если в ggplot есть альтернатива, тоже было бы интересно.

Надеюсь, что-то похожее на это:

Either an arrow or a number?

ТОЛЬКО ДЛЯ ОБНОВЛЕНИЯ В ОТНОШЕНИИ НИЖЕ ОТВЕТА НА КОД БУДЕТ БЫТЬ:

`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")
`

Но у вас не получается такой же результат - появляется только одна стрелка?

1 Ответ

1 голос
/ 06 мая 2020

Вы можете добавлять аннотации. Сначала укажите начальную и конечную позиции стрелки: обратите внимание, что в предоставленных вами данных 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")

enter image description here

...