2017-08-31 1 views
1

Ich würde gerne wissen, ob es möglich ist, die Ticks der x-Achse mit einem Ggplot Kreisdiagramm zu ändern.ggplot Kreisdiagramm wählen Achsen Ticks

Hier ist, was ich tun kann:

# Some colors 
couleurs <- data.frame(
id=seq(1,17,1), 
mix=c(c(rep(1,6),rep(2,7),rep(3,4))), 
html=c("#A00020","#109618","#388EE4","#C484D1","#FFAA33","#CCCDD0","#004AC5","#F80094","#CB5023","#638995","#33CFCF","#95DC4E","#F7D633","#5C403C","#F72020","#00D96C","#FDE4C5") 
) 
couleurs$html <- factor(couleurs$html, levels = couleurs$html[order(couleurs$id, decreasing = FALSE)]) 

# Data 
activite <- data.frame(label=c("B to B","B to C","B to B/B to C", "B to B"), cible=c(rep("Externe",3), "Interne"), nb=c(12,9,3,12)) 
activite$label <- factor(activite$label, levels = activite$label[order(activite$nb[activite$cible=="Externe"], decreasing = TRUE)]) 
library(plyr) 
activite<-ddply(activite,.(cible),transform,pc=(nb/sum(nb))*100) 
activite 

# Pie chart 
library(ggplot2) 
ggplot(data = activite, aes(x = "", y = nb, fill = label)) + 
geom_bar(stat = "identity", position = position_fill(), width = 1) + 
coord_polar(theta= "y", start = 0, direction = -1) + 
labs(fill="") + 
scale_fill_manual(values=as.character(couleurs$html[1:nrow(activite)]), labels=paste(activite$label,"\t\t\t",sep="")) + 
geom_text(aes(label = paste(pc,"%", sep=" ")), size=4, colour = "white", fontface = "bold", position = position_fill(vjust = 0.5)) + 
theme(strip.text = element_text(size=20, face = "bold",), strip.background = element_rect(fill="grey75")) + 
theme(panel.background = element_rect(fill = "white")) + 
theme(plot.background = element_rect(fill = "grey92")) + 
theme(legend.position="bottom", legend.background = element_rect(fill="grey92")) + 
theme(legend.key = element_blank()) + 
theme(panel.grid.minor = element_blank(), panel.grid.major = element_line(colour = "grey75")) + 
theme(axis.text.y = element_blank()) + 
theme(axis.ticks.length = unit(0, "mm")) + 
theme(axis.title.x = element_blank(),axis.title.y = element_blank()) + 
theme(legend.box.spacing = unit(1, "mm")) + 
facet_wrap(~ cible) 

Hier mein Ergebnis:

My pie chart

Nach mehreren Stunden serach, ich habe nicht eine Lösung finden, zu schaffen, was ich will. Die exakt gleiche Kreisdiagramm aber mit personalisierten Zecken wie folgt aus:

The result I would like to reach

Mit diesen besonderen Bedingungen: - nicht die Richtung der Daten in dem Kreisdiagramm ändern, ich will es aus wie genau dieses - wenn möglich (aber wenn es nicht möglich ist, ist es in Ordnung), möchte ich die Etiketten der Zecken nicht mit der Achse überlagert.

Wenn mir jemand helfen kann, würde ich mich sehr freuen.

Antwort

2

Hier ist eine Lösung:

ggplot(data = activite %>% 
     group_by(cible) %>% 
     arrange(desc(nb)) %>% 
     mutate(axis.label = cumsum(nb), 
       axis.position = cumsum(pc)/100) %>% 
     mutate(axis.label = ifelse(pc == min(pc), 
            paste(axis.label, "0", sep = "-"), 
            axis.label)), 
     aes(x = 1, y = nb, fill = label)) + 
    geom_segment(aes(x = 1, xend = 1.6, y = axis.position, yend = axis.position), 
       colour = "grey75") + 
    geom_vline(xintercept = 1.6, colour = "grey75") + 
    geom_bar(stat = "identity", position = position_fill(reverse = T), width = 1) + 
    coord_polar(theta= "y", start = 0, direction = 1) + 
    labs(fill="") + 
    scale_fill_manual(values=as.character(couleurs$html[1:nrow(activite)]), labels=paste(activite$label,"\t\t\t",sep="")) + 
    geom_text(aes(label = paste(pc,"%", sep=" ")), size=4, colour = "white", 
      fontface = "bold", position = position_fill(vjust = 0.5, reverse = T)) + 
    geom_text(aes(x = 1.7, label = axis.label), size = 3, 
      position = position_fill(reverse = T)) + 
    theme(strip.text = element_text(size=20, face = "bold",), strip.background = element_rect(fill="grey75")) + 
    theme(panel.background = element_rect(fill = "white")) + 
    theme(plot.background = element_rect(fill = "grey92")) + 
    theme(legend.position="bottom", legend.background = element_rect(fill="grey92")) + 
    theme(legend.key = element_blank()) + 
    theme(panel.grid = element_blank()) + 
    theme(axis.text = element_blank()) + 
    theme(axis.ticks = element_blank()) + 
    theme(axis.title = element_blank()) + 
    theme(legend.box.spacing = unit(1, "mm")) + 
    facet_wrap(~ cible) 

plot

Erklärung:

  1. Die Reihenfolge, in Ihre Etiketten ging im Uhrzeigersinn, während die Richtung der Polarkoordinaten ging gegen den Uhrzeigersinn . Das macht das Etikettieren ziemlich mühsam. Ich habe die Richtung für Polarkoordinaten, & hinzugefügt reverse = T innerhalb der Position Anpassung Anrufe für die Geoms.

  2. Es ist schwierig, verschiedene Facetten der gleichen Grafik verschiedenen Achsenunterbrechungen zuzuordnen, also tat ich es nicht. Stattdessen habe ich die Daten so modifiziert, dass sie berechnete Achsenbeschriftungen/Randpositionen enthält, hinzugefügte Ränder über geom_segment/geom_vline, & versteckte den Achstext/Ticks in theme().

+0

Großartig! Vielen Dank ! Das hätte ich selbst nie geschafft. –

Verwandte Themen