R интерактивная диаграмма с областями сложения с использованием длинных data.frame или ggplotly - PullRequest
0 голосов
/ 14 января 2020

Я воссоздаю интерактивный сюжет из приведенного ниже примера кода plotly (найдено здесь ), но мне интересно, можно ли использовать длинный формат data.frame, чтобы избежать добавления отдельного add_trace функция для каждой переменной в легенде. Подобно слоям ggplot2 aestheti c.

Будет работать любое решение для интерактивного построения графиков (highcharter, plotly, et c.).

Я также создал интерактивную диаграмму с областями с накоплением из ggplotly ниже, однако интерактивные функции не совпадают. В частности, когда слои включаются / выключаются в легенде, они не масштабируются сами, поэтому они плоские вдоль оси x. Они появляются как есть. Например, если colB изолирован, он плавает в середине графика.

Приведенный выше пример plotly сбрасывает слой, и пользователь может визуально просматривать профили отдельных слоев с помощью плоской привязки оси x.

Спасибо за любую помощь.

library(plotly)

data <- t(USPersonalExpenditure)
data <- data.frame("year"=rownames(data), data)

p <- plot_ly(data, x = ~year, y = ~Food.and.Tobacco, name = 'Food and Tobacco', type = 'scatter', mode = 'none', stackgroup = 'one', fillcolor = '#F5FF8D') %>%
  add_trace(y = ~Household.Operation, name = 'Household Operation', fillcolor = '#50CB86') %>%
  add_trace(y = ~Medical.and.Health, name = 'Medical and Health', fillcolor = '#4C74C9') %>%
  add_trace(y = ~Personal.Care, name = 'Personal Care', fillcolor = '#700961') %>%
  add_trace(y = ~Private.Education, name = 'Private Education', fillcolor = '#312F44') %>%
  layout(title = 'United States Personal Expenditures by Categories',
         xaxis = list(title = "",
                      showgrid = FALSE),
         yaxis = list(title = "Expenditures (in billions of dollars)",
                      showgrid = FALSE))

p

#

library(data.table)
library(magrittr)
library(ggplot2)
library(plotly)
library(lubridate)

dt <- data.table(colA = seq(from = ymd_hms("2020-01-01 00:00:00"),
                            to = ymd_hms("2020-01-01 00:00:00") + days(99),
                            by = "1 day"),
                 colB = runif(100,0,100),
                 colC = runif(100,0,100),
                 colD = runif(100,0,100)) %>% 
  melt(id.vars = "colA")

ggplot <- ggplot(data = dt) +
  geom_area(aes(x = colA,
                y = value,
                fill = variable),
            stat = "identity",
            position = "stack",
            alpha = 0.5) +
  theme(legend.title = element_blank())
ggplot

ggplotly(ggplot)

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Ответ от @s_t определенно работает. Но просто для полноты я добавлю еще один способ сделать sh этот, который может быть чище.

Вы также можете создать длинный фрейм данных и использовать аргумент split в plot_ly

* 1006. * Из документации plot_ly :

split : (дискретные) значения, используемые для создания нескольких трасс (одна трасса на значение).

Это, вероятно, будет делать то же самое, что и опция @s_t. Но это немного чище.

# create data frame in long format
data.long <- data %>% tidyr::pivot_longer(-year, names_to = "type", values_to = "value")

# create plot_ly using split argument to separate traces according to type
p <- plot_ly(data.long, x = ~year, y = ~value, type = 'scatter', 
             mode = 'none', stackgroup = 'one', split = ~type)

p

enter image description here

1 голос
/ 14 января 2020

Вы можете попробовать что-то вроде этого:

library(plotly)

# define your plot
p <- plot_ly(data, x = ~year, y = ~Food.and.Tobacco, name = 'Food and Tobacco', 
             type = 'scatter', mode = 'none', stackgroup = 'one')

# select the columns you need to plot on the y axis: you remove the year (x axis) 
# and the first one
colstoplot <- setdiff(colnames(data),c("year","Food.and.Tobacco" ))

# now you can loop through the columns in the vector colstoplot
for(i in colstoplot){
  p <- p %>% add_trace(x = data[["year"]], y = data[[i]], name = i)
                       }
# here the plot  
p

enter image description here

...