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

Я хочу сделать интерактивную гистограмму из одной переменной, где столбцы заполнены второй переменной и огранены третьей переменной. Я хотел бы вставить его в слайд-слайд. Я предполагаю, что 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)

Linked chart

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

Ответы [ 2 ]

0 голосов
/ 25 июня 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
0 голосов
/ 25 июня 2019

Может быть, это то, что вы ищете в ggplot?Я не мог сказать, хотели ли вы решение ggplots или решение rCharts.Так что это ggplot.

Добавление позиции = "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)
...