ggvis 数字类别排序

ggvis numeric category sorting

我有一个数据框,我想为其创建条形图。 X 轴将只是快照编号,Y 轴将是该类别中的观察数。不幸的是,我必须将观测值转换为一个字符,这样 ggvis() 才能工作。这打破了排序,因为例如“2”>“10”。我无法让两者同时工作。

eachObs <-
structure(list(obs = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 2, 3, 4, 5, 6, 7, 
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
20, 21, 22, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
16, 17, 18, 19, 20, 21, 22, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 2, 3, 4, 5, 6, 
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
19, 20, 21, 22, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 18, 19, 20, 21, 22), key = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L), .Label = c("Sadness", 
"Neutral", "Contempt", "Disgust", "Anger", "Surprise", "Fear", 
"Happiness"), class = "factor"), value = c(0, 0, 4, 4, 4, 0, 
0, 0, 0, 8, 0, 0, 0, 0, 8, 4, 4, 0, 0, 8, 4, 4, 68, 48, 44, 28, 
40, 28, 40, 36, 36, 40, 40, 44, 44, 40, 40, 44, 36, 36, 48, 40, 
60, 32, 12, 12, 4, 28, 8, 8, 4, 8, 20, 20, 24, 16, 16, 16, 12, 
20, 20, 0, 8, 4, 12, 12, 8, 4, 20, 12, 4, 12, 16, 12, 16, 12, 
8, 8, 4, 4, 8, 0, 16, 8, 4, 4, 4, 8, 0, 4, 8, 0, 4, 8, 4, 4, 
4, 0, 8, 8, 4, 8, 8, 0, 4, 8, 8, 4, 12, 8, 4, 8, 8, 8, 8, 8, 
8, 20, 4, 0, 4, 4, 4, 8, 0, 16, 0, 12, 4, 12, 4, 0, 0, 4, 0, 
4, 0, 4, 4, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 16, 8, 20, 0, 8, 8, 
20, 12, 16, 32, 32, 24, 20, 20, 16, 16, 20, 28, 20, 24, 16, 20, 
20, 20, 8, 4, 28)), .Names = c("obs", "key", "value"), row.names = c(NA, 
-176L), class = "data.frame")
EMO_COLORS <- #used with the colors above
  c("blue", "grey", "darkred",
    "green", "red", "orange",
    "black", "yellow")

使用此数据,此 returns 错误

eachObs %>% 
    ggvis(x = ~obs, y = ~value, fill = ~key, fillOpacity := 0.5) %>%
    layer_bars() %>%
    scale_nominal("fill",
                  domain = unique(as.character(eachObs[, 'key'])),
                  range = EMO_COLORS)

Error in eval(expr, envir, enclos) : object 'key' not found

这修复了它,但产生了排序问题

eachObs[, 1] <- as.character(eachObs[, 1])
eachObs %>% 
    ggvis(x = ~obs, y = ~value, fill = ~key, fillOpacity := 0.5) %>%
    layer_bars() %>%
    scale_nominal("fill",
                  domain = unique(as.character(eachObs[, 'key'])),
                  range = EMO_COLORS)

为了获得更好的秩序,您可以尝试:

eachObs[, 1] <- as.ordered(eachObs[, 1])
eachObs %>% 
        ggvis( x = ~obs, y = ~value, fill = ~key, fillOpacity := 0.5) %>%
        layer_bars()

这是我得到的:

这个,就在最后的情节之前,而不是 as.character():

eachObs[, 1] <- as.factor(eachObs[, 1])