Я был активным 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