如何使用ggvis标记绘图刻度线

时间:2014-08-11 02:26:19

标签: r ggvis

我正在尝试更改ggvis图中的刻度标签。我的数据点为x = c(1,2,3)y = c(1,2,3)。但是,以下代码会导致刻度标签完全没有意义!

library(dplyr)
library(ggvis)
data.frame(x = c(1,2,3), y = c(1,2,3) ) %>%
  ggvis(~x,~y ) %>%
  layer_lines() %>%
  add_axis("x", properties=axis_props(
    labels=list(angle=90, fontSize = 10, text = c("one","two","three"  )      )
   )
   )

给出:

enter image description here

我想我也必须格式化刻度,或者至少告诉ggvis哪个刻度标记?

2 个答案:

答案 0 :(得分:8)

您正在以错误的方式使用text属性。

ggvis本身仅在R中执行数据绑定和处理。然后"翻译"将ggvis对象放入由vega.js定义的可视化语法中,该对象构建在d3.js之上,以执行实际渲染。

因此,add_axis只是ggvis中的一个瘦包装器,用于在vega.js中定义Axes属性。您可以使用this document找到更多相关信息。

您几乎可以看到传递给add_axis()函数的参数与您在vega.js中指定的JSON规范具有一对一的映射关系。 因此,properties=axis_props(...)中的ggvis映射到Axis properties属性(我知道这可能听起来很混乱。但是点击上面的链接,你会看到那里的层次结构)

属性参数将定义,我在这里引用文档,

  

自定义轴样式的可选标记属性定义。输入对象可以包括用于刻度(主要和次要),majorTicks,minorTicks,标签和轴(用于轴线)的子对象。

因此,属性参数仅用于更改样式,包括labelsticks和{{的样式1}}行。

您的代码:

axis

可以抽象为

properties=axis_props(labels=list(angle=90, fontSize = 10, 
                      text = c("one","two","three"))

基于我们上面的讨论,它正在操纵轴properties=axis_props(labels=list(...)) 样式。 每个labels只是一个SVG label元素,其可调整属性可以是found in this document。通过修改轴标签的样式,可以更改所有 x轴标签的样式

最后,这意味着通过指定<text>,您最终会手动将每个x轴刻度标签设置为数组 text = c("one","two","three"),并将其连接到形成字符串["one", "two", "three"]


解决方案

默认情况下,one,two,three会为您确定轴属性,包括

  • 轴上有多少刻度?
  • 蜱的价值是多少?

这就是如何在不指定ggvis的情况下,最终得到一个很好的渲染y轴。 但您可以通过在add_axis("y", ...)函数中指定values属性来手动覆盖刻度。

例如,

add_axis()

这给了我们:

enter image description here

更近,但还没有,因为标签是数字,而不是你想要的字符串。

最后,为了更改标签,我们可以简单地将X轴上的数据从数字更改为因子,例如:

data.frame(x = c(1,2,3), y = c(1,2,3) ) %>%
  ggvis(~x,~y ) %>%
  layer_lines() %>%
  add_axis("x",
           value=c(1, 2, 3),
           properties=axis_props(
    labels=list(angle=90, fontSize = 10)))

将为您提供enter image description here

答案 1 :(得分:3)

尝试为您希望的每个标签重复add_axis()功能,如下所示:

library(dplyr)
library(ggvis)
data.frame(x = c(1,2,3), y = c(1,2,3) ) %>%
  ggvis(~x,~y ) %>%
  layer_lines() %>%
  add_axis("x",values = c(1,1), properties=axis_props(
           labels=list(angle=90, fontSize = 10, text = 'one', dx = 10))) %>%
  add_axis("x",values = c(2,2), properties=axis_props(
           labels=list(angle=90, fontSize = 10, text = 'two', dx 10))) %>%
  add_axis("x",values = c(3,3), properties=axis_props(
           labels=list(angle=90, fontSize = 10, text = 'three', dx = 10)))

我的数据类别太多,因此保理解决方案对我不起作用。请注意,我总是在 values 参数下调用具有相同重复数字的向量。我不知道为什么但是当我调用单个数字渲染时没有发生。我发现的解决方案是输入两次xD的相同数字。此外 dx 参数可以在这里做得很好,避免使用标签轴叠加:

Code output

如果您的变量包含太多类别,并且您希望只有少量标签,那么这是一种实现自定义标签的方式。