Come centrare le etichette del grafico a barre in pila in percentuale

Sto cercando di tracciare un buon ggplot2 stacked percent barchart ggplot2 usando ggplot2 . Ho letto del materiale e riesco quasi a tracciare, quello che voglio. Inoltre, accludo il materiale, potrebbe essere utile in un unico luogo:

Come faccio a etichettare un grafico a barre in pila in ggplot2 senza creare una cornice dati di riepilogo?

Crea un barilotto impilato in cui ogni pila viene ridimensionata per sumre al 100%

Grafico a barre in percentuale R accatastato con percentuale di fattore binario ed etichette (con ggplot)

Il mio problema è che non posso posizionare le labels dove voglio – nel mezzo delle barre. inserisci la descrizione dell'immagine qui

Puoi vedere il problema nella figura sopra: le etichette appaiono orribili e si sovrappongono l’una all’altra.

Quello che sto cercando in questo momento è:

  1. Come posizionare le etichette nella parte centrale delle barre (aree)

  2. Come tracciare non tutte le etichette, ma per esempio che sono più grandi del 10%?

  3. Come risolvere il problema di sovrapposizione?

Per la Q 1. @ MikeWise ha suggerito la ansible soluzione . Tuttavia, non riesco ancora ad affrontare questo problema.

Inoltre, accludo esempi riproducibili, come ho tracciato questo grahp.

 library('plyr') library('ggplot2') library('scales') set.seed(1992) n=68 Category <- sample(c("Black", "Red", "Blue", "Cyna", "Purple"), n, replace = TRUE, prob = NULL) Brand <- sample("Brand", n, replace = TRUE, prob = NULL) Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL)) USD <- abs(rnorm(n))*100 df <- data.frame(Category, Brand, USD) # Calculate the percentages df = ddply(df, .(Brand), transform, percent = USD/sum(USD) * 100) # Format the labels and calculate their positions df = ddply(df, .(Brand), transform, pos = (cumsum(USD) - 0.5 * USD)) #create nice labes df$label = paste0(sprintf("%.0f", df$percent), "%") ggplot(df, aes(x=reorder(Brand,USD, function(x)+sum(x)), y=percent, fill=Category))+ geom_bar(position = "fill", stat='identity', width = .7)+ geom_text(aes(label=label, ymax=100, ymin=0), vjust=0, hjust=0,color = "white", position=position_fill())+ coord_flip()+ scale_y_continuous(labels = percent_format())+ ylab("")+ xlab("") 

Ecco come centrare le etichette ed evitare di tracciare etichette per piccole percentuali. Un ulteriore problema nei tuoi dati è che hai più sezioni di barre per ogni colore. Invece, mi sembra che tutte le sezioni della barra di un dato colore dovrebbero essere combinate. Il codice seguente utilizza dplyr anziché plyr per impostare i dati per il tracciamento:

 library(dplyr) # Initial data frame df <- data.frame(Category, Brand, USD) # Calculate percentages and label positions df.summary = df %>% group_by(Brand, Category) %>% summarise(USD = sum(USD)) %>% # Within each Brand, sum all values in each Category mutate(percent = USD/sum(USD), pos = cumsum(percent) - 0.5*percent) 

Per tracciare i dati, utilizzare un’istruzione ifelse per determinare se un’etichetta è tracciata o meno. In questo caso, ho evitato di tracciare un’etichetta per percentuali inferiori al 7%.

 ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=percent, fill=Category)) + geom_bar(stat='identity', width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),""), y=pos), colour="white") + coord_flip() + scale_y_continuous(labels = percent_format()) + labs(y="", x="") 

inserisci la descrizione dell'immagine qui

AGGIORNAMENTO: Con ggplot2 versione 2, non è più necessario calcolare le coordinate delle etichette di testo per centrarle. Invece, puoi usare position=position_stack(vjust=0.5) . Per esempio:

 ggplot(df.summary, aes(x=reorder(Brand, USD, sum), y=percent, fill=Category)) + geom_bar(stat="identity", width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),"")), position=position_stack(vjust=0.5), colour="white") + coord_flip() + scale_y_continuous(labels = percent_format()) + labs(y="", x="") 

inserisci la descrizione dell'immagine qui

Ho seguito l’esempio e ho trovato il modo di mettere belle etichette per un semplice diagramma a barre in pila. Penso che potrebbe essere utile anche.

 df <- data.frame(Category, Brand, USD) # Calculate percentages and label positions df.summary = df %>% group_by(Brand, Category) %>% summarise(USD = sum(USD)) %>% # Within each Brand, sum all values in each Category mutate( pos = cumsum(USD)-0.5*USD) ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=USD, fill=Category)) + geom_bar(stat='identity', width = .7, colour="black", lwd=0.1) + geom_text(aes(label=ifelse(USD>100,round(USD,0),""), y=pos), colour="white") + coord_flip()+ labs(y="", x="") 

inserisci la descrizione dell'immagine qui

Lo stesso esempio in macOs Sierra con RStudio 1.0.44 e R versione 3.3.1 mostra un altro accordo:

inserisci la descrizione dell'immagine qui