2017-12-18 3 views
0

Ich habe einige Daten, und ich möchte einige Variablen aus stat_count() verwenden, um ein Balkendiagramm zu beschriften.Wie benutze ich eine benutzerdefinierte Funktion, um eine Textbeschriftung in geom_text() ändern

Dies ist, was ich tun möchte:

library(ggplot2) 
library(scales) 
percent_and_count <- function(pct, cnt){ 
    paste0(percent(pct), ' (', cnt, ')') 
} 

ggplot(aes(x=Type)) + 
stat_count(aes(y=(..prop))) + 
geom_text(aes(y=(..prop..), label=percent_and_count(..prop.., ..count))), 
    stat='count') 

Allerdings habe ich diesen Fehler, da es nicht die Funktion in dem, was finden kann ich davon ausgehen, ist entweder einige Pakete Base oder der Datenrahmen:

Fehler bei eval (ausdr, envir, enclos): konnte nicht funktionieren "percent_and_count"

ich diesen Fehler finden, wenn ich percent(..prop..) auch tun, althoug h ist es in Ordnung mit scales::percent(..prop..). Ich habe meine Funktion nicht aus einem Paket geladen.

Wenn alles andere fehlschlägt, ich

geom_text(aes(y=(..prop..), label=utils::getAnywhere('percent_and_count')$objs[[1]]((..prop..),(..count..)))) 

tun können, aber dies scheint unnötig Kreisverkehr für das, was eine blöde einfache Aufgabe sein sollte.

Antwort

1

können Sie verwenden bquote und aes_:

# Sample data 
set.seed(2017); 
df <- data.frame(
    Type = sample(6, 100, replace = T) 
); 

library(ggplot2); 
library(scales); 

# Your custom function 
percent_and_count <- function(pct, cnt){ 
    paste0(percent(pct), ' (', cnt, ')') 
} 

ggplot(df, aes(x = Type)) + 
stat_count(aes(y = ..prop..)) + 
geom_text(
    stat = "count", 
    aes_(
     y = ~(..prop..), 
     label = bquote(.(percent_and_count)((..prop..), (..count..))))) 

enter image description here

Erläuterung: bquote(.(percent_and_count)(...)) stellt sicher, dass percent_and_count gefunden wird (als Begriffe .(...) in der Elternumgebung ausgewertet werden). Wir verwenden dann aes_, um sicherzustellen, dass zitierte Ausdrücke (entweder mit ~ oder bquote) ordnungsgemäß ausgewertet werden.

Immer noch nicht schön, aber wahrscheinlich straighter als mit utils::getAnywhere.

Verwandte Themen