Совместное использование осей и легенд между участками в сюжете в R (огранка в ggplot2 и использование ggplotly не работает) - PullRequest
0 голосов
/ 26 июня 2019

У меня есть следующие данные:

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)

ggplot

Если я использую ggplotly, то я могу выбрать и отменить выбор переменных, но столбцы не перенастраиваются, поэтому я получаю что-то похожее на это:

badplot

Так что моя идея заключалась в том, чтобыприведите данные, затем создайте отдельные сюжетные графики и используйте подплот:

df_group <- df %>% group_by(numbers, letter, status) %>% tally()
df_group_cast <- dcast(df_group, numbers + letter ~ status)

p1 <- df_group_cast %>% 
    filter(numbers == 1) %>%
    plot_ly(x = ~letter, y = ~good, type = 'bar', name = 'good') %>%
    add_trace(y = ~bad, name = 'bad') %>%
    add_trace(y = ~ugly, name = 'ugly') %>%
    layout(yaxis = list(title = 'Count'), barmode = 'stack')

p2 <- df_group_cast %>% 
    filter(numbers == 2) %>%
    plot_ly(x = ~letter, y = ~good, type = 'bar', name = 'good') %>%
    add_trace(y = ~bad, name = 'bad') %>%
    add_trace(y = ~ugly, name = 'ugly') %>%
    layout(yaxis = list(title = 'Count'), barmode = 'stack')

p3 <- df_group_cast %>% 
    filter(numbers == 3) %>%
    plot_ly(x = ~letter, y = ~good, type = 'bar', name = 'good') %>%
    add_trace(y = ~bad, name = 'bad') %>%
    add_trace(y = ~ugly, name = 'ugly') %>%
    layout(yaxis = list(title = 'Count'), barmode = 'stack')

subplot(p1, p2, p3)

Bad Plotly

Это интерактивно, но также выглядит плохо.Я хотел бы, чтобы у них была общая шкала, одна легенда и заголовки для каждой группы чисел.

Возможно ли это?

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

1 Ответ

0 голосов
/ 26 июня 2019

Я понял это!В конце концов, мне не нужно было разыгрывать мои данные.Я даже добавил шаг для добавления заголовков подгрупп.

df_group <- df %>% group_by(numbers, letter, status) %>% tally()

Соберите текст аннотации для добавления к графикам:

a <- list(
    text = sprintf("<b>1</b>"),
    xref = "paper",
    yref = "paper",
    yanchor = "bottom",
    xanchor = "center",
    align = "center",
    x = 0.5,
    y = 1,
    showarrow = FALSE)

b <- list(
    text = sprintf("<b>2</b>"),
    xref = "paper",
    yref = "paper",
    yanchor = "bottom",
    xanchor = "center",
    align = "center",
    x = 0.5,
    y = 1,
    showarrow = FALSE)

c <- list(
    text = sprintf("<b>3</b>"),
    xref = "paper",
    yref = "paper",
    yanchor = "bottom",
    xanchor = "center",
    align = "center",
    x = 0.5,
    y = 1,
    showarrow = FALSE)

Соберите фактические графики, отметьте «аннотации»вариант под макет.Мне также не нужно было добавлять всю эту бессмысленную чепуху, мне помогли раскраски по статусу.

p1 <- df_group %>% 
    filter(numbers == 1) %>% 
    group_by(letter) %>% 
    plot_ly(x = ~letter, y= ~n, color = ~status, type = 'bar', legendgroup = ~status) %>% 
    layout(barmode = 'stack', annotations = a)

p2 <- df_group %>% 
    filter(numbers == 2) %>% 
    group_by(letter) %>% 
    plot_ly(x = ~letter, y= ~n, color = ~status, type = 'bar', legendgroup = ~status, showlegend = FALSE) %>% 
    layout(barmode = 'stack', annotations = b)

p3 <- df_group %>% 
    filter(numbers == 3) %>% 
    group_by(letter) %>% 
    plot_ly(x = ~letter, y= ~n, color = ~status, type = 'bar', legendgroup = ~status, showlegend = FALSE) %>% 
    layout(barmode = 'stack', annotations = c)

Печать:

subplot(p1, p2, p3, shareY = TRUE)

Imgur не может показать интерактивность, поэтомувам просто нужно верить, что это интерактивно, и вы можете выбирать категории на всех графиках, нажимая на их ярлыки.

Good plot

...