2012-03-29 14 views
2

Die Grafik, die ich gerade versuche zu erstellen, fällt zwischen zwei Stühlen. Ich möchte ein Histogramm erstellen, das aus gestapelten und etikettierten Feldern besteht. Hier ist ein Beispiel für genau das, was ich rede, aus einem kürzlich erschienenen Artikel in der New York Times wurde:Histogramm der gestapelten Boxen in ggplot2

http://farm8.staticflickr.com/7109/7026409819_1d2aaacd0a.jpg

Ist es möglich, dies mit ggplot2 zu erreichen?

Um die Frage zu etwas, verstärken so weit, was ich habe ist:

dfr <- data.frame(
name = LETTERS[1:26], 
percent = rnorm(26, mean=15) 
) 

ggplot(dfr, aes(x=percent, fill=name)) + geom_bar() + 
stat_bin(geom="text", aes(label=name)) 

... was ich alles falsch klar tue. Was ich im Idealfall am liebsten hätte, ist etwas in der Art der manuell modifizierten Grafik unten, wobei (sagen wir) die Buchstaben A bis M eine Nuance füllten und N bis Z eine andere füllten.

http://farm8.staticflickr.com/7116/7026536711_4df9a1aa12.jpg

+0

Sie etwas in diese Richtung bedeuten? http://stackoverflow.com/questions/7364404/how-do-i-label-a-stacked-bar-chart-in-gplot2-without-creating-a-summary-data-fr –

+0

Danke, Roman. Ich habe das verwendet, um der Frage mehr Details hinzuzufügen. – patabongo

Antwort

11

Hier gehen Sie!

set.seed(3421) 
# added type to mimick which candidate is supported 
dfr <- data.frame(
    name = LETTERS[1:26], 
    percent = rnorm(26, mean=15), 
    type = sample(c("A", "B"), 26, replace = TRUE) 
) 

# easier to prepare data in advance. uses two ideas 
# 1. calculate histogram bins (quite flexible) 
# 2. calculate frequencies and label positions 
dfr <- transform(dfr, perc_bin = cut(percent, 5)) 
dfr <- ddply(dfr, .(perc_bin), mutate, 
    freq = length(name), pos = cumsum(freq) - 0.5*freq) 

# start plotting. key steps are 
# 1. plot bars, filled by type and grouped by name 
# 2. plot labels using name at position pos 
# 3. get rid of grid, border, background, y axis text and lables 
ggplot(dfr, aes(x = perc_bin)) + 
    geom_bar(aes(y = freq, group = name, fill = type), colour = 'gray', 
    show_guide = F) + 
    geom_text(aes(y = pos, label = name), colour = 'white') + 
    scale_fill_manual(values = c('red', 'orange')) + 
    theme_bw() + xlab("") + ylab("") + 
    opts(panel.grid.major = theme_blank(), panel.grid.minor = theme_blank(), 
     axis.ticks = theme_blank(), panel.border = theme_blank(), 
     axis.text.y = theme_blank()) 

enter image description here

+0

Das ist großartig! Danke! Ich habe festgestellt, dass das Ändern des zweiten Schritts Ihrer Datenvorbereitungsstufe auf 'dfr <- ddply (dfr,. (Perc_bin), mutieren, Freq = 1, Pos = Cumsum (Freq) - 0,5 * Freq)' gibt gestapelte Schachteln mit gleicher Höhe. – patabongo

+0

froh, um zu helfen! – Ramnath

Verwandte Themen