- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个新的 Geom 类型:geom_ohlc(),它类似于烛台图,用于绘制股票开盘-高-低-收盘数据。
学完这个Hadley's article :我试过这个:
GeomOHLC <- ggproto(`_class` = "GeomOHLC", `_inherit` = Geom,
required_aes = c("x", "op", "hi", "lo", "cl"),
draw_panel = function(data, panel_scales, coord){
coords <- coord$transform(data, panel_scales)
browser() # <<-- here is where I found the problem
grid::gList(
grid::rectGrob(
x = coords$x,
y = pmin(coords$op, coords$cl),
vjust = 0,
width = 0.01,
height = abs(coords$op - coords$cl),
gp = grid::gpar(col = coords$color, fill = "yellow")
),
grid::segmentsGrob(
x0 = coords$x,
y0 = coords$lo,
x1 = coords$x,
y1 = coords$hi
)
)
})
geom_ohlc <- function(data = NULL, mapping = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...)
{
layer(
geom = GeomOHLC, mapping = mapping, data = data,
stat = stat, position = position, show.legend = show.legend,
inherit.aes = inherit.aes, params = list(na.rm = na.rm, ...)
)
}
dt <- data.table(x = 1:10, open = 1:10, high = 3:12, low = 0:9, close = 2:11)
p <- ggplot(dt, aes(x = x, op = open, hi = high, lo = low, cl = close)) +
geom_ohlc()
p
为了简单起见,我只是不考虑条形的颜色。
结果图是这样的:
我在ggproto
函数中添加了browser()
,我发现coord$transform
没有转换 op
、hi
、lo
、cl
美学融入 interverl [0,1]。如何解决这个问题?
此外,除了Hadley的文章之外,还有其他关于如何创建自己的Geom类型的文档吗?
最佳答案
正如OP问题下的评论中所提到的,问题是transform_position()
内的aes_to_scale()
函数,该函数又由coord$transform调用
。转换仅限于名为 x、xmin、xmax、xend、xintercept 的变量以及 y 轴的等效变量。在transform_position的帮助中提到了这一点:
Description
Convenience function to transform all position variables.
Usage
transform_position(df, trans_x = NULL, trans_y = NULL, ...) Arguments
trans_x, trans_y Transformation functions for x and y aesthetics. (will transform x, xmin, xmax, xend etc) ... Additional arguments passed to trans_x and trans_y.
解决方法是使用这些变量名称而不是 OP 使用的变量名称。以下代码可用于转换变量,但在其他地方失败(请参阅末尾)。我不知道预期情节的细节,因此没有尝试修复此错误。
GeomOHLC <- ggproto(
`_class` = "GeomOHLC",
`_inherit` = Geom,
required_aes = c("x", "yintercept", "ymin", "ymax", "yend"),
draw_panel = function(data, panel_scales, coord) {
coords <- coord$transform(data, panel_scales)
#browser() # <<-- here is where I found the problem
grid::gList(
grid::rectGrob(
x = coords$x,
y = pmin(coords$yintercept, coords$yend),
vjust = 0,
width = 0.01,
height = abs(coords$op - coords$cl),
gp = grid::gpar(col = coords$color, fill = "yellow")
),
grid::segmentsGrob(
x0 = coords$x,
y0 = coords$ymin,
x1 = coords$x,
y1 = coords$ymax
)
)
}
)
geom_ohlc <-
function(data = NULL,
mapping = NULL,
stat = "identity",
position = "identity",
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...)
{
layer(
geom = GeomOHLC,
mapping = mapping,
data = data,
stat = stat,
position = position,
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}
dt <-
data.table(
x = 1:10,
open = 1:10,
high = 3:12,
low = 0:9,
close = 2:11
)
p <-
ggplot(dt, aes(
x = x,
yintercept = open,
ymin = high,
ymax = low,
yend = close
)) +
geom_ohlc()
p
这会转换变量,但会产生以下错误:
Error in unit(height, default.units) :
'x' and 'units' must have length > 0
但希望从这里开始它可以发挥作用。
注意:我相当随意地选择了原始变量名称(op、hi、lo、cl)之间的映射。特别是yintercept
似乎不太适合。也许ggplot2需要支持任意比例变量名称?
关于r - 在 ggproto 中,coord$transform 没有将某些列转换为 [0, 1],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40068502/
我正在尝试制作新的几何图形和统计信息。我从这个 vignette 尝试了一个 StatChull 代码. 我的目标是操纵一个不是美学值(value)的外部参数。 像这样的东西: stat_custom
我经常在工作中使用箱线图,喜欢 ggplot2美学。但标准geom_boxplot缺少对我来说很重要的两件事: mustache 的末端和中间标签。多亏了这里的信息,我写了一个函数: gBoxplot
我正在使用 Deckjs 框架在 slidfy 中进行演示。一切都很好,但是突然出现了这段代码: ggplot(cars, aes(x = speed, y = dist)) + geom_poin
我正在使用 ggmap,并收到以下错误: Error: GeomRasterAnn was built with an incompatible version of ggproto. Please
我想创建一个新的 Geom 类型:geom_ohlc(),它类似于烛台图,用于绘制股票开盘-高-低-收盘数据。 学完这个Hadley's article :我试过这个: GeomOHLC 0 但希望
我是一名优秀的程序员,十分优秀!