4

我正在尝试更改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"  )      )
   )
   )

给出:

在此处输入图像描述

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

4

2 回答 2

8

您以错误的方式使用该text物业。

ggvisggvis它本身仅在 R 中执行数据绑定和处理。然后它将对象“翻译”为由 定义的可视化语法,该语法建立在执行实际渲染的vega.js基础之上。d3.js

因此,add_axis它只是一个ggvis用于在vega.js. 您可以使用此文档找到更多相关信息。

您几乎可以看到您传递给add_axis()函数的参数与您将在vega.js. 因此,properties=axis_props(...)ggvis映射到Axis 属性属性(我知道这听起来可能令人困惑。但是单击上面的链接,您会在那里看到层次结构)。

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

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

因此,properties参数只应该更改样式,包括labelsticksaxis线条的样式。

你的代码:

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

可以抽象为

properties=axis_props(labels=list(...))

根据我们上面的讨论,它正在操纵轴的样式labels。每个label都是简单的 SVG<text>元素,可以在本文档中找到其可调整的属性。通过修改轴标签的样式,您可以更改所有x 轴标签的样式。

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


解决方案

默认情况下,ggvis将为您确定轴属性,包括

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

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

例如,

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)))

这给了我们:

在此处输入图像描述

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

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

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

这会给你在此处输入图像描述

于 2014-08-13T20:06:47.930 回答
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参数也可以在这里做得很好,避免标签轴覆盖:

代码输出

如果您的变量有太多类别并且您只希望使用很少的标签,这是一种实现自定义标签的方法。

于 2017-10-10T00:06:54.730 回答