Я был тяжелым 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