2017-04-24 42 views
0

我正在尝试创建一个圆环图并且难以添加颜色渐变。我希望能够采取所有不同的类别,并将它们从任何颜色淡入淡出。是否有捷径可寻?在R中添加颜色渐变到geom_rect

data<-data.frame(count=c(39,36,19,6), category=c("a","b","c","d")) 
data$fraction = data$count/sum(data$count) 
data = data[order(data$fraction), ] 
data$ymax = cumsum(data$fraction) 
data$ymin = c(0, head(data$ymax, n=-1)) 

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
#Create Plot 
fill <- c("blue3","cyan3","darkgrey","forestgreen") 

p1 = ggplot(data, aes(fill=category, ymax=ymax, ymin=ymin, xmax=4, xmin=3.5)) 
+ geom_rect(colour="White") + 
coord_polar(theta="y") + 
scale_fill_manual(values=fill)+ 
theme_bw()+ 
theme(panel.grid=element_blank())+ 
theme(axis.ticks=element_blank()) +  
xlim(c(0, 4)) + 
theme(axis.text=element_blank()) + 
labs(title="donut plot") 


print(p1) 
+0

这个前面的问题可能有帮助... http://stackoverflow.com/questions/20069660/r-gradient-fill-for-geom-rect-in -ggplot2 –

+0

即将不同的颜色分配给不同的值以创建褪色的外观。我想要做的是让每个值的颜色具有渐变效果。所以对于类别“a”,我希望这件作品从“白色”渐变为“cyan3” –

回答

0

使用alpha值来控制每个category内的阴影。

library(ggplot2) 
library(dplyr) 

N <- 100 
fill <- c("blue3","cyan3","darkgrey","forestgreen") 

data   <- data.frame(count = c(39,36,19,6), category = c("a","b","c","d")) 
data$fraction <- data$count/sum(data$count) 
data   <- data[order(data$fraction), ] 
data$ymax  <- cumsum(data$fraction) 
data$ymin  <- c(0, head(data$ymax, n = -1)) 

data2 <- 
    data.frame(count = rep(data$count, each = N), 
      category = rep(data$category, each = N), 
      ymin = c(0, 
         seq(0.00, 0.06, length = N), 
         seq(0.06, 0.25, length = N), 
         seq(0.25, 0.61, length = N), 
         seq(0.61, 1.00, length = N)[-N]), 
      ymax = c(seq(0.00, 0.06, length = N)[-1], 
         seq(0.06, 0.25, length = N), 
         seq(0.25, 0.61, length = N), 
         seq(0.61, 1.00, length = N), 
         1.00)) 
data2$y <- with(data2, (ymin + ymax)/2) 

data2 <- 
    data2 %>% 
    group_by(category) %>% 
    mutate(alpha = (y - min(y))/max(y)) %>% 
    ungroup() 

ggplot(data2) + 
    aes(ymax = ymax, ymin = ymin, xmax = 4, xmin = 3.5, fill = category, alpha = alpha) + 
    geom_rect() + 
    coord_polar(theta = "y") + 
    theme_bw()+ 
    theme(panel.grid=element_blank()) + 
    theme(axis.ticks=element_blank()) +  
    xlim(c(0, 4)) + 
    theme(axis.text=element_blank()) + 
    labs(title="donut plot") + 
    scale_fill_manual(values = fill) + 
    guides(alpha = "none") 

enter image description here

+0

这在R中完美并且看起来很棒,但是有没有办法做到这一点,而不是使它成为一百万个不同的作品?当它从R和文档中导出时,您可以看到每条单独的行。 –

+0

@SamMiranda,你用什么文件格式导出图像? – Peter

+0

我不会将其导出为图像。我使用addPlot将它添加到powerpoint –

0

这是不可能直接这样做,因为据我所知,但你可以实现通过扩展数据帧,并设置取决于半径的α值类似的效果。事情是这样的......

data<-data.frame(count=c(39,36,19,6), category=c("a","b","c","d")) 
data$fraction = data$count/sum(data$count) 
data = data[order(data$fraction), ] 
data$ymax = cumsum(data$fraction) 
data$ymin = c(0, head(data$ymax, n=-1)) 

data <- as.data.frame(lapply(data,rep,10)) 
data$xmin <- rep(0:9,each=4) 

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
#Create Plot 
fill <- c("blue3","cyan3","darkgrey","forestgreen") 

p1 = ggplot(data, aes(fill=category, ymax=ymax, ymin=ymin, xmin=xmin, xmax=xmin+1)) + geom_rect(aes(alpha=xmin/9)) + 
    coord_polar(theta="y") + 
    scale_fill_manual(values=fill)+ 
    scale_alpha_continuous(guide=FALSE)+ 
    theme_bw()+ 
    theme(panel.grid=element_blank())+ 
    theme(axis.ticks=element_blank()) +  
    theme(axis.text=element_blank()) + 
    labs(title="donut plot") 

print(p1) 

enter image description here