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

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

给出:

enter image description here

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

2个回答

8
你正在错误地使用text属性。 ggvis本身只在R中执行数据绑定和处理。然后,它将ggvis对象“翻译”成由vega.js定义的可视化语法,后者构建在d3.js之上以执行实际渲染。
因此,add_axis只是ggvis中用于在vega.js中定义轴属性的薄包装器。您可以使用this document了解更多信息。
你可以看到,传递给add_axis()函数的参数与你在vega.js中指定的JSON规范具有一对一的映射关系。因此,在ggvis中,properties=axis_props(...)将映射到轴属性属性(我知道这可能听起来很困惑。但点击上面的链接,您会看到层次结构)。 属性参数将定义,我在这里引用文档:

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

因此,属性参数只应更改样式,包括labelsticksaxis线的样式。
你的代码:
properties=axis_props(labels=list(angle=90, fontSize = 10, 
                      text = c("one","two","three"))

可以抽象为

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

根据我们之前的讨论,该部分是在操作轴标签的样式。每个label实际上就是一个SVG <text>元素,其可调属性可以在此文档中找到。通过修改轴标签的样式,您可以改变所有x轴标签的样式
最终,这意味着通过指定text = c("one","two","three"),您最终手动地将每个x轴刻度标签设置为数组["one", "two", "three"],并连接成字符串one,two,three

解决方案

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

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

这就是为什么在不指定 add_axis("y", ...) 的情况下,您最终得到了一个漂亮的 y 轴。但是,您可以通过在 add_axis() 函数中指定 values 属性来手动覆盖刻度。

例如:

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

更接近目标了,但标签是数字,不是你想要的字符串。
最后,为了改变标签,我们可以将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)))

这将为您提供输入图像描述

非常全面。非常感谢。 - Alex

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

如果您的变量具有太多的类别,并且希望只有少数标签,则可以使用此方法实现自定义标签。

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