Note that there are some explanatory texts on larger screens.

plurals
  1. POGradient fill of geom_polygon
    primarykey
    data
    text
    <p>this code produces a chart with 3 polygons ...</p> <p>I'm creating a chart that shows 3 polygons, I'm not that much interested if there are better ways to draw the polygons (atually these polygons represent events and there is a duration for these events).</p> <p>What I'm interested in, in the first place, is the possibility to fill each polygon using a gradient.</p> <pre><code># library("ggplot2") # library(data.table) ## some vectors event.day &lt;- c("A", "A", "B", "B") event.time &lt;- c(1, 2, 1, 2) event.duration &lt;- c(1,2,3,1) sys &lt;- c(100, 50, 50, 100) ## the data data.frame df.event &lt;- data.frame(event.day, event.time,event.duration,sys) # ordering the data.frame df.event &lt;- df.event[with(df.event, order(event.day, event.time)), ] # sys values of the next event df.event$sys.end &lt;- c(df.event$sys[-1], NA) df.event$sys.min &lt;- min(df.event$sys) df.event$sys.minday &lt;- ave(df.event$sys, list(event.day), FUN=function(x) {min(x)}) df.event$sys.max &lt;- max(df.event$sys) df.event$sys.maxday &lt;- ave(df.event$sys, list(event.day), FUN=function(x) {max(x)}) # count all events df.event$cntTotalNoOfEvents &lt;- seq_along(df.event$sys) # count the events within one day df.event$cntTotalNoOfEventsByDay &lt;- 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 &lt;- do.call(c, lapply(df.event$event.day, function(foo){ sum(df.event$event.day==foo) })) # the successor event df.event$event.successor &lt;- c(df.event$cntTotalNoOfEvents[-1], NA) df.event$event.day &lt;- factor(df.event$event.day, levels = unique(df.event$event.day)) event.day.level &lt;- levels(df.event$event.day) df.event$event.day.level.ordinal &lt;- as.numeric(match(df.event$event.day, event.day.level)) ## the position data.frame df.position &lt;- data.frame(event.polygon = rep(c(1:nrow(df.event)), each = 4), polygon.x = 1, polygon.y = 1) df.position$event.polygon.point &lt;- 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 &lt;- 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 &lt;- ggplot() p &lt;- p + geom_polygon(data = dt.polygon ,aes( x = polygon.x ,y = polygon.y ,fill = sys ,group = cntTotalNoOfEvents ) ) p &lt;- p + theme( panel.background = element_rect(fill="white") ) p &lt;- p + scale_fill_gradient(guide = "colourbar", low = "lightgrey", high = "red") p &lt;- p + coord_flip() p </code></pre> <p>produces this chart</p> <p><img src="https://i.stack.imgur.com/RJOZW.png" alt="enter image description here"></p> <p>What I'm trying to achieve is something like this</p> <p><img src="https://i.stack.imgur.com/tzNWi.png" alt="enter image description here"></p> <p>, do you hav any ideas</p> <p>As always any hint is appreciated</p> <p>Tom</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload