Гистограмма ggvis: отрицательные значения

Я пытаюсь нарисовать гистограмму с помощью ggvis для некоторых данных, где для каждой переменной у меня есть как отрицательное, так и положительное значение. Это будет похоже на этот пример из ggplot2.

Однако, когда я пробую что-то подобное в ggvis, у меня вообще нет сюжета, только какие-то странные линии.

Пример данных:

df <- data.frame(
direction=rep(c("up", "down"), each=3),
value=c(1:3, -c(1:3)),
x=rep(c("A", "B", "C"), 2))

Это работает для всех положительных значений:

df %>%
mutate(value.pos=abs(value)) %>%
ggvis(x=~x, y=~value.pos) %>%
group_by(direction) %>%
layer_bars(stack=TRUE)

Это мне ничего не дает:

df %>%
ggvis(x=~x, y=~value) %>%
group_by(direction) %>%
layer_bars(stack=TRUE)

Я также пробовал различные комбинации построения их один за другим, например:

df %>%
spread(key=direction, value=value) %>%
ggvis(x=~x, y=~up) %>%
layer_bars() %>%
layer_bars(x=~x, y=~down)

Пока не повезло. Я подозреваю, что мне не хватает какого-то простого решения...


person Zhou H    schedule 03.08.2016    source источник


Ответы (2)


Я не ggvis позволяет создавать гистограммы с накоплением отрицательных значений в тех же группах, что и положительные данные.

Это связано с тем, что если значение x появляется в данных более одного раза, то ggvis суммирует значения y для каждого x. Я думал, что, поскольку вы построили вектор 1:3, они уравнялись, но это не так.

На данный момент я не верю, что для этого существуют уклончивые графики. Тоже путается с этикетками.

Вы можете производить участок без штабеля, заполняя позицию.

df %>%
  group_by(direction) %>%
  ggvis(x=~x, y=~value, fill = ~direction) %>%
  layer_bars(stack = FALSE)

В любом случае, вы можете подумать об отказе от ggvis для любой производственной работы, поскольку он находится в стадии разработки и не обновлялся в течение нескольких месяцев.

person shayaa    schedule 03.08.2016

@shayaa Спасибо, похоже, это работает, хотя, вероятно, потребует некоторой настройки и может выглядеть не так хорошо, как если бы я использовал ggplot2. На самом деле, причина, по которой я использую ggvis, заключается в том, что я хотел бы объединить его с блестящим, чтобы сделать небольшую интерактивную веб-версию. Например:

df <- data.frame(
    direction=rep(c("up", "down"), each=3),
    value=c(1:3, -c(1:3)),
    x=rep(c("A", "B", "C"), 2))

plot_fct <- function(letter) {
    df %>%
        filter(x==letter) %>%
        ggvis(x=~x, y=~value, fill = ~direction) %>%
        layer_bars(stack = FALSE) %>%
        scale_numeric("y", domain=c(NA,NA))
}

ui <- fluidPage(
    sidebarPanel(
        selectInput("letter", "Choose letter", c("A", "B", "C"), selected="A")
    ),
    mainPanel(
        ggvisOutput("letter_barplot")
    )
)

server <- function(input, output) {
    plot_fct(letter=reactive(input$letter)) %>% bind_shiny("letter_barplot")
}   
runApp(shinyApp(ui, server))

Однако у меня это все равно не работает, так как есть некоторая проблема с реактивным существом классового персонажа. Я продолжаю получать ошибку:

Ошибка в eval(substitute(expr), envir, enclos) : сравнение (1) возможно только для атомарных и списковых типов

Думаю, мне придется продолжать попытки.

person Zhou H    schedule 03.08.2016
comment
Абсолютно. И, надеюсь, пакет скоро получит некоторые обновления. А пока вы можете нажать на галочку рядом с моим ответом, чтобы указать, что этот вопрос решен. - person shayaa; 06.08.2016