2017-08-03 201 views
2

以下指南,如ggplot Donut chart我试图绘制小量规,甜甜圈与中间的标签,并打算将它们放在地图上。ggplot2:甜甜圈,如何有条件的颜色填充if_else

如果该值达到一定的阈值,我希望甜甜圈的填充变为红色。是否有可能通过if_else实现(这将是最自然的,但它不起作用)。

library(tidyverse) 

df <- tibble(ID=c("A","B"),value=c(0.7,0.5)) %>% gather(key = cat,value = val,-ID) 

ggplot(df, aes(x = val, fill = cat)) + scale_fill_manual(aes,values = c("red", "yellow"))+ 
    geom_bar(position="fill") + coord_polar(start = 0, theta="y") 

ymax <- max(df$val) 
ymin <- min(df$val) 

p2 = ggplot(df, aes(fill=cat, y=0, ymax=1, ymin=val, xmax=4, xmin=3)) + 
    geom_rect(colour="black",stat = "identity") + 
    scale_fill_manual(values = if_else (val > 0.5, "red", "black")) + 
    geom_text(aes(x=0, y=0, label= scales::percent (1-val)), position = position_dodge(0.9))+ 
    coord_polar(theta="y") + 
    xlim(c(0, 4)) + 
    theme_void() + 
    theme(legend.position="none") + 
    scale_y_reverse() + facet_wrap(facets = "ID") 

量表填补手册值=如果别的....这部分不工作,错误说:错误if_else(值> 0.5, “红”, “黑色”):对象 'VAL' 不找到。这是我的错误,还是存在其他解决方案?

我也意识到我的代码不是最优的,最初聚集等待更多的变量被包含在图中,但是我没有将一个变量堆叠在另一个之上。现在一个变量应该足以表示完成的百分比。我意识到我的代码对于这个目的是多余的。你能帮我吗?

+1

你尝试过'ifelse()'吗? 'if_else'不是R函数。 – BLT

+0

@BLT'if_else'是一个dplyr函数。它与'ifelse'类似,但是修复了一些问题。 –

+0

@NicolasPinto我有一个旧版本,所以当我搜索它没有出现。谢谢! – BLT

回答

3

一种用于颜色问题的解决方案是在数据首先建立一个变量,然后使用该映射中的情节的颜色:

df <- tibble(ID=c("A","B"),value=c(0.7,0.5)) %>% gather(key = cat,value = val,-ID) %>% 
    mutate(color = if_else(val > 0.5, "red", "black")) 

p2 = ggplot(df, aes(fill=color, y=0, ymax=1, ymin=val, xmax=4, xmin=3)) + 
    geom_rect(colour="black",stat = "identity") + 
    scale_fill_manual(values = c(`red` = "red", `black` = "black")) + 
    geom_text(aes(x=0, y=0, label= scales::percent (1-val)), position = position_dodge(0.9))+ 
    coord_polar(theta="y") + 
    xlim(c(0, 4)) + 
    theme_void() + 
    theme(legend.position="none") + 
    scale_y_reverse() + facet_wrap(facets = "ID") 

其结果将是:

enter image description here