2017-04-24 3 views
0

Ich versuche ein Donut-Diagramm zu erstellen und habe Schwierigkeiten beim Hinzufügen von Farbverlauf. Ich möchte in der Lage sein, alle verschiedenen Kategorien zu nehmen und sie von jeder Farbe zu weiß zu verblassen. Gibt es einen einfachen Weg, dies zu tun?Fügen Sie geom_rect einen Farbverlauf hinzu in R

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

Diese vorherige Frage helfen könnte ... http://stackoverflow.com/questions/20069660/r-gradient-fill-for-geom-rect-in -gglplot2 –

+0

Das bedeutet, dass verschiedene Werte verschiedenen Werten zugeordnet werden, um das verblasste Aussehen zu erzeugen. Was ich versuche zu tun ist, dass die Farbe für jeden Wert einen Verlaufseffekt hat. Also für die Kategorie "a" möchte ich, dass das Stück von "weiß" nach "cyan3" verschwindet. –

Antwort

0

Mit alpha Werte die Schattierung innerhalb jeder category steuern.

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

Das funktioniert perfekt und sieht in R gut aus, aber gibt es einen Weg dies zu tun, ohne es so zu machen, dass es Millionen verschiedener Stücke sind? Wenn es aus R exportiert wird und zu einem Dokument, können Sie jede einzelne Zeile sehen. –

+0

@SamMiranda, welches Dateiformat verwenden Sie, um das Bild zu exportieren? – Peter

+0

Ich exportiere es nicht als ein Bild. Ich habe addPlot verwendet, um es einem Powerpoint hinzuzufügen –

0

Es ist nicht möglich, dies direkt zu tun, soweit ich weiß, aber man kann durch die Erweiterung Ihres Datenrahmen und die Einrichtung eines Alpha-Wertes abhängig von dem Radius um einen ähnlichen Effekt zu erzielen. So etwas wie dies ...

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

Verwandte Themen