mã này tạo biểu đồ với 3 đa giác ...Gradient fill of geom_polygon
Tôi đang tạo biểu đồ hiển thị 3 đa giác, tôi không quan tâm nhiều lắm nếu có cách tốt hơn để vẽ đa giác (tại các đa giác này đại diện cho các sự kiện và có một khoảng thời gian cho các sự kiện này).
Điều tôi quan tâm, ngay từ đầu, là khả năng điền vào mỗi đa giác bằng cách sử dụng một gradient.
# library("ggplot2")
# library(data.table)
## some vectors
event.day <- c("A", "A", "B", "B")
event.time <- c(1, 2, 1, 2)
event.duration <- c(1,2,3,1)
sys <- c(100, 50, 50, 100)
## the data data.frame
df.event <- data.frame(event.day, event.time,event.duration,sys)
# ordering the data.frame
df.event <- df.event[with(df.event, order(event.day, event.time)), ]
# sys values of the next event
df.event$sys.end <- c(df.event$sys[-1], NA)
df.event$sys.min <- min(df.event$sys)
df.event$sys.minday <- ave(df.event$sys, list(event.day), FUN=function(x) {min(x)})
df.event$sys.max <- max(df.event$sys)
df.event$sys.maxday <- ave(df.event$sys, list(event.day), FUN=function(x) {max(x)})
# count all events
df.event$cntTotalNoOfEvents <- seq_along(df.event$sys)
# count the events within one day
df.event$cntTotalNoOfEventsByDay <- ave(1:nrow(df.event), df.event$event.day,FUN=function(x) seq_along(x))
# aggregate the number or events within one day
df.event$TotalNoOfEventsByDay <- do.call(c, lapply(df.event$event.day, function(foo){
sum(df.event$event.day==foo)
}))
# the successor event
df.event$event.successor <- c(df.event$cntTotalNoOfEvents[-1], NA)
df.event$event.day <- factor(df.event$event.day, levels = unique(df.event$event.day))
event.day.level <- levels(df.event$event.day)
df.event$event.day.level.ordinal <- as.numeric(match(df.event$event.day, event.day.level))
## the position data.frame
df.position <- data.frame(event.polygon = rep(c(1:nrow(df.event)), each = 4), polygon.x = 1, polygon.y = 1)
df.position$event.polygon.point <- ave(1:nrow(df.position), df.position$event.polygon,FUN=function(x) seq_along(x))
## merge of the data and the positition data.frame
dt.polygon <- data.table(merge(df.event, df.position, by.x = "cntTotalNoOfEvents", by.y = "event.polygon"))
## calculating the points of the polygon
dt.polygon[dt.polygon$event.polygon.point == 1, polygon.x := event.day.level.ordinal - .5 * sys/sys.max ]
dt.polygon[dt.polygon$event.polygon.point == 1, polygon.y := cntTotalNoOfEventsByDay]
dt.polygon[dt.polygon$event.polygon.point == 2, polygon.x := event.day.level.ordinal - .5 * sys.end/sys.max]
dt.polygon[dt.polygon$event.polygon.point == 2, polygon.y := cntTotalNoOfEventsByDay + event.duration]
dt.polygon[dt.polygon$event.polygon.point == 3, polygon.x := event.day.level.ordinal + .5 * sys.end/sys.max]
dt.polygon[dt.polygon$event.polygon.point == 3, polygon.y := cntTotalNoOfEventsByDay + event.duration]
dt.polygon[dt.polygon$event.polygon.point == 4, polygon.x := event.day.level.ordinal + .5 * sys/sys.max]
dt.polygon[dt.polygon$event.polygon.point == 4, polygon.y := cntTotalNoOfEventsByDay]
p <- ggplot()
p <- p + geom_polygon(data = dt.polygon
,aes(
x = polygon.x
,y = polygon.y
,fill = sys
,group = cntTotalNoOfEvents
)
)
p <- p + theme(
panel.background = element_rect(fill="white")
)
p <- p + scale_fill_gradient(guide = "colourbar", low = "lightgrey", high = "red")
p <- p + coord_flip()
p
tạo biểu đồ này
một cái gì đó như thế này
Những gì tôi đang cố gắng để đạt được là, bạn có hav bất kỳ ý tưởng
Như luôn luôn bất kỳ gợi ý được đánh giá cao
Tom
tối ưu hóa vòng qua data.frame bằng cách chỉ sử dụng vectơ mà không có vòng lặp thứ 2 về thời lượng –
Trả lời câu hỏi của riêng bạn là [khuyến khích mạnh mẽ ed] (http://stackoverflow.com/help/self-answer). Cảm ơn bạn đã chia sẻ những gì bạn đã học! – Gregor