ggvis - 自定义非数值y轴标签显示为“NaN”。

3

编辑:示例代码已更新,包含更复杂的示例

我有一个数据框,其中包含(x,y)值和每个对应的名称,并在ggvis散点图中绘制它。Stack Overflow用户已经指向了这篇帖子(How do I label plot tick marks using ggvis),我更新了我的代码以反映那里看到的内容,通过使用factor()创建自定义y轴标签列表ylabels_,并将其提供给add_axis()语句下的values=。以下是新代码:

library(stringi)
require(ggvis)

set.seed(13)
df <- data.frame(x = 1:15, 
                 y = c(rep.int(1, 15), 
                       rep.int(4, 15), 
                       rep.int(7, 15)))

ylabels_ <- factor(c(1,4,7), labels = stri_rand_strings(3, 7))

df %>%
  ggvis(~x, ~y) %>% 
  add_axis("y", values = ylabels_)

我的轴标签仍然返回NaN而不是因素。我错过了什么吗?

解决方案编辑:这是我最终成功的代码。请注意,我更改了x值以交错,以便区分三条线。

library(stringi)
require(ggvis)

set.seed(13)
df <- data.frame(x = c(seq(1, length.out = 15, by = 3),
                       seq(2, length.out = 15, by = 3),
                       seq(3, length.out = 15, by = 3)),
                 y = factor(c(rep.int(1, 15), 
                       rep.int(4, 15), 
                       rep.int(7, 15)), labels = c("one", "four", "seven"),
                       ordered = T))

df %>%
  ggvis(~x, ~y) %>% 
  layer_points() %>%
  scale_ordinal("y", domain = c("seven", "four", "one")

我不理解为什么在domain=部分,我必须颠倒因子的顺序才能按正确顺序显示。如果有人对此有任何见解,将非常有帮助!

2个回答

1
请注意,在链接的答案中,新的因子变量被用作 y 变量。你也可以将其用于你的 values,但并不一定需要。
基于 y 创建新因子变量,但使用 name 作为标签是为了得到正确顺序的 name 变量以进行绘图。
df$ylabels_ <- factor(df$y, labels = stri_rand_strings(3, 7))

因为您现在正在使用y轴上的一个因子变量,所以需要显式地使用layer_points

df %>%
    ggvis(~x, ~ylabels_) %>% 
    layer_points()  

请注意,这种方法只适用于原始的y数据为整数的情况。

我认为我给出的例子太简单了 - 我将发布一个修订后的例子。 - Jonathan H
@JonathanH 如果问题是重复的y值,请将新变量放入数据集中,而不是创建一个独立的向量。但是根据我关于连续变量的注释,因子会导致等间距而不是“连续”间距。 - aosmith
1
我最终对代码进行了更多的修改,但是你的答案帮助我到达了我需要到达的地方! - Jonathan H

0

别说我是傻瓜,但我认为这是一个bug(顺便说一下,这并没有回答你的问题):

## set up data
lab <- factor(1:15, labels=stri_rand_strings(15, 7))
val <- 1:15

## all works according to expectations on the "x" axis
data.frame(xx=lab, yy=val) %>%
    ggvis(~xx, ~yy) %>% 
    layer_points() %>%
    add_axis("x", values=lab,
             properties=axis_props(labels=list(angle=90, fontSize = 10)))

## nothing works according to expectations on the "y" axis
## attempt 1
data.frame(xx=val, yy=lab) %>%
    ggvis(~xx, ~yy) %>% 
    layer_points() %>%
    add_axis("y", values=lab,
             properties=axis_props(labels=list(angle= 0, fontSize = 10)))

## attempt 2
data.frame(xx=val, yy=as.numeric(val)) %>%
    ggvis(~xx, ~yy) %>% 
    layer_points() %>%
    add_axis("y", values=lab,
             properties=axis_props(labels=list(angle= 0, fontSize = 10)))

我不太确定你所描述的问题是什么,但我找到的解决方案已经在上面了。 - Jonathan H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接