我正在尝试更改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
哪个刻度标记?
答案 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,标签和轴(用于轴线)的子对象。
因此,属性参数仅用于更改样式,包括labels
,ticks
和{{的样式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()
这给了我们:
更近,但还没有,因为标签是数字,而不是你想要的字符串。
最后,为了更改标签,我们可以简单地将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)))
将为您提供
答案 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 参数可以在这里做得很好,避免使用标签轴叠加:
如果您的变量包含太多类别,并且您希望只有少量标签,那么这是一种实现自定义标签的方式。