创建R / Shiny多层象形图

时间:2017-06-08 16:53:46

标签: r dataframe plot graph shiny

我正致力于创建一个人的风险象形图。我试图以图形方式显示它,以便清楚地显示不同因素的额外风险。

这是我目前的图表:

我希望能够用红心填充某个因素的风险,并用绿色的心填充其余部分。因此,例如HxCHF将从0填充到~14.1然后从14.1填充到18.5将填充绿色(理想情况下它将一直缩放到100但是我发现图形不能很好地缩放过去~20)。

我认为这个问题是因为我把最后的红心连续夹在一起,让那颗心的其余部分变得透明,我得到了这些空白。无论如何都要创建一个绿色心脏的虚拟数据框架,以达到最大风险,然后将红色风险心叠加在顶部?或者甚至只用红心填充图表的一部分,例如14-16用红心,然后是0-14和16-18用绿色,例如?

我使用这些方法构建图表:

library(png)
library(ggplot2)
library(grid)

fill_images <- function() {
l <- list()
for (i in 1:nrow(newDF))
{
  for (j in 1:dfMaster[1,'MajorComplications']) #From another DF with the max risk overall
  {
    if(j <= ceiling(newDF$units[i]))
      img <- readPNG("www/Heart_symbol_c00.png")
    else
      img <- readPNG("www/green-heart-md.png")
    g <- rasterGrob(img, interpolate=TRUE)
    l <- c(l, annotation_custom(g, xmin = i-1/2, xmax = i+1/2, ymin = j-1, ymax = j))
  }
}
})
l
}

clip_images <- function(restore_grid = TRUE) {
l <- list()
for (i in 1:nrow(newDF)) {
  l <- c(l, geom_rect(xmin = i-1/2,
                    xmax = i+1/2,
                    ymin = newDF$units[i],
                    ymax = ceiling(newDF$units[i]),
                    colour = "white",
                    fill = "white"))
  if (restore_grid && ceiling(newDF$units[i]) %in% major_grid)
   l <- c(l, geom_segment(x = i-1,
                         xend = i+1,
                         y = ceiling(newDF$units[i]),
                         yend = ceiling(newDF$units[i]),
                         colour = grid_col,
                         size = grid_size))
}
l
} 

grid_col <- "grey50"
grid_size <- 0.6
major_grid <- 0:10 * 2
p <- ggplot(newDF, aes(what, units)) +
  fill_images() +
  clip_images() +
  geom_bar(fill=NA, colour="transparent", size=1.2, alpha=0.5, stat="identity") +
  coord_flip() +
  scale_y_continuous(breaks=seq(0, 20, 2)) +
  scale_x_discrete() +
  theme_bw() +
  theme(axis.title.x  = element_blank(), axis.title.y  = element_blank(),
     panel.grid.major.x = element_line(colour = grid_col, size = grid_size),
     panel.grid.major.y = element_line(colour = NA))
p

作为一个较小的旁白问题,当我重新排序dataFrame以将当前风险置于顶部并按降序风险顺序通过:newDF < arrange(newDF,units)对其进行排序时,行标签不会重新排序。知道为什么会这样吗? 提前谢谢!

0 个答案:

没有答案