Интерактивная многогранная гистограмма rCharts, заполненная третьей переменной (репликация ggplot2 aes (x = var1, fill = var2) + geom_bar + facet_wrap)

Я хочу создать интерактивную гистограмму одной переменной, в которой столбцы заполнены второй переменной и разделены третьей переменной. Я хотел бы встроить его в колоду Slidify. Я предполагаю, что rCharts - правильный инструмент для этого (или лучше другой пакет?).

Вот мои данные:

df <- data.frame(numbers = rep(1:3, 30),
                 letter = sample(c("A", "B", "C", "D"), 90, replace = TRUE),
                 status = sample(c("good", "bad", "ugly"), 90, replace = TRUE))

Я могу сделать это в ggplot2, но не могу сделать это интерактивным. Я могу сделать этот график (извините, не могу встроить):

ggplot(df, aes(letter, fill = status)) + geom_bar() + facet_wrap(.~numbers)

Связанная диаграмма

В идеале я мог бы выбрать и отменить выбор «статуса» и увидеть изменение полос. Я поиграл с кодом гистограммы на этой странице, но не могу заставить его работать. Возможна ли эта функция?


person maleta    schedule 24.06.2019    source источник


Ответы (2)


Может это то, что вам нужно в ggplot? Я не мог сказать, нужно ли вам решение ggplots или решение rCharts. Итак, это ggplot.

Добавление position = "dodge" в аргумент geom_bar будет имитировать другой график, с которым вы связались

ggplot(df, aes(letter, fill = status)) +
 geom_bar(position = "dodge") +
 facet_wrap(.~numbers)

В качестве альтернативы вы можете "отменить выбор" статуса и заполнить его по номеру - примечание, в этом примере это необходимо сделать одним из факторов:

ggplot(df, aes(letter, fill = as.factor(numbers))) +
 geom_bar(position = "dodge") +
 facet_wrap(.~numbers)

Или опустите и оставьте оттенки серого

ggplot(df, aes(letter)) +
 geom_bar(position = "dodge") +
 facet_wrap(.~numbers)
person Jonni    schedule 24.06.2019
comment
Извините, я имел в виду, что мне нужно решение rCharts, потому что я хочу, чтобы оно было интерактивным. Я отредактировал свой пост, чтобы было понятнее. - person maleta; 25.06.2019

Я был активным rCharts пользователем, но в настоящее время, на мой взгляд, plotly является более поддерживаемым вариантом (rCharts больше не входит в CRAN).

Кроме того, plotly имеет автоматический способ сделать ggplot2 диаграммы интерактивными. Для вашего примера:

library(ggplot2)
library(plotly)
df <- data.frame(
  numbers = rep(1:3, 30),
  letter = sample(c("A", "B", "C", "D"), 90, replace = TRUE),
  status = sample(c("good", "bad", "ugly"), 90, replace = TRUE)
)

p <-
  ggplot(df, aes(letter, fill = status)) + geom_bar() + facet_wrap(. ~ numbers)

ggplotly(p)

ИЗМЕНИТЬ 1

Это изменение сделано в соответствии с потребностями комментария. Запрошенные вами изменения нельзя внести непосредственно из ggplot2, поэтому вам нужно использовать plotly. Может быть более элегантный способ построить диаграмму, чем цикл for, но он, похоже, работает:

library(data.table)
library(ggplot2)
library(plotly)
# make data.table
df <- data.table(
  numbers = rep(1:3, 30),
  letter = sample(c("A", "B", "C", "D"), 90, replace = TRUE),
  status = sample(c("good", "bad", "ugly"), 90, replace = TRUE)
)


# keep unique status values for bars and numbers for facets
traces <- df[,unique(status)]
facets <- df[,unique(numbers)]
# cast df
casted_df <- dcast(df,letter + numbers ~ status )
# initialise list to keep charts   
facetplots <- list()
for(i in 1:length(facets)){
  # initialise chart
  facetplots[[i]] <- plot_ly(type = "bar")
  facet_df <- casted_df[numbers == facets[i]]
  for(j in traces){
    if(i == 1){
      facetplots[[i]] <- add_trace(facetplots[[i]], x = facet_df[,letter], y = facet_df[,get(j)],legendgroup = j , color = j, name = j )

    }else{
      facetplots[[i]] <- add_trace(facetplots[[i]], x = facet_df[,letter], y = facet_df[,get(j)],legendgroup = j, color = j , name = j ,  showlegend = F)

    }
  }
  facetplots[[i]] <- layout(  facetplots[[i]], barmode = "stack")
}

q <- subplot(facetplots, shareX = TRUE)

q
person Jon Nagra    schedule 25.06.2019
comment
Я просто надеялся на функциональность, в которой я мог бы выбирать и отменять выбор хорошего, плохого и уродливого, и полосы автоматически настраивались бы сами. Я могу отображать и скрывать различные категории, но сами полосы не меняются (поэтому, если я сниму выделение категории в середине полос, верхняя часть полос останется над ней, а не морфинг полос). - person maleta; 25.06.2019