【问题标题】:How do I label plot tick marks using ggvis如何使用 ggvis 标记绘图刻度线
【发布时间】:2014-08-11 02:26:18
【问题描述】:

我正在尝试更改 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 要标记哪个刻度?

【问题讨论】:

    标签: r ggvis


    【解决方案1】:

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

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

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

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

    properties参数会定义,我这里引用文档,

    自定义轴样式的可选标记属性定义。输入对象可以包括刻度(主要和次要)、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> 元素,其可调整属性可以是found in this document。通过修改轴标签的样式,您可以更改ALL x 轴标签的样式

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


    解决方案

    默认情况下,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)))
    

    这给了我们:

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

    最后,为了更改标签,我们可以简单地将 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)))
    

    这会给你

    【讨论】:

    • 非常全面。非常感谢。
    【解决方案2】:

    尝试为您想要的每个标签重复 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 参数在这里也可以做得很好,避免标签轴覆盖:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多