Tôi muốn tạo kiểu Geom mới: geom_ohlc(), cái gì đó giống như Biểu đồ Candlestick, để vẽ cổ phiếu mở cao-thấp- đóng dữ liệu.
Sau khi biết Hadley's article này: Tôi cố gắng này:
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
vì đơn giản, tôi chỉ cần không xem xét màu sắc của quán bar.
Cốt truyện kết quả là như thế này:
tôi thêm một browser()
bên trong ggproto
chức năng, và tôi phát hiện ra rằng coord$transform
không chuyển đổi op
, hi
, lo
, cl
thẩm mỹ vào interverl [ 0,1]. Cách khắc phục sự cố này?
Hơn nữa, có bất kỳ tài liệu nào khác về cách tạo kiểu Geom của riêng bạn ngoại trừ bài viết của Hadley không?
Đổ lỗi có vẻ là 'transform_position()' được gọi bởi hàm trong 'coord $ transform'. Mã cho thấy rằng nó sẽ chỉ chuyển đổi các cột trong data.frame có tên là 'x' và' y'. Tôi không biết giải pháp cho vấn đề của bạn nhưng tôi sẽ cố gắng nghĩ xem liệu bạn có cần chúng * để được thay đổi kích thước (?). – ddiez
Mặc dù trên suy nghĩ thứ hai cùng một mã cũng cho thấy khả năng của một số quy mô là "x" và/hoặc "y". Có lẽ có cái gì đó ở đó? – ddiez
Ngoài ra, hàm 'ggplot2 ::: aes_to_scale' là hàm ánh xạ các tên' data.frame' cho dù chúng là thang đo 'x' hay' y'. Nhìn vào tài liệu bạn cần sử dụng '" x "," xmin "," xmax "," xend "," xintercept "' hoặc tính thẩm mỹ tương đương cho trục y. Nó cũng được đề cập trong '? Transform_position'. Tôi nghĩ rằng nếu bạn có thể tìm ra cách để ánh xạ các biến của bạn với những biến số bạn sẽ giải quyết được vấn đề của bạn. – ddiez