2012-03-29 2 views
2

Графа, которую я сейчас пытаюсь сделать, падает между двумя стульями. Я хочу сделать гистограмму, состоящую из уложенных и помеченных ящиков. Вот пример именно та вещь, о которой я говорю, взято из недавней статьи в New York Times:Гистограмма уложенных ящиков в ggplot2

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

Можно ли достичь этого с помощью ggplot2?

Чтобы усилить этот вопрос несколько, до сих пор, что у меня есть:

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)) 

... который я явно делает все неправильно. В конечном итоге то, что мне идеально понравилось, - это что-то вроде строк с модифицированным вручную графиком ниже, с (скажем) буквами А-М, заполненными одним оттенком, а N-Z заполняет другой.

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

+0

Вы имеете в виду что-то вдоль этих линий? http://stackoverflow.com/questions/7364404/how-do-i-label-a-stacked-bar-chart-in-ggplot2-without-creating-a-summary-data-fr –

+0

Спасибо, Роман. Я использовал это, чтобы добавить более подробные сведения к вопросу. – patabongo

ответ

11

Здесь вы идете!

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

Это потрясающе! Спасибо! Я обнаружил, что изменение второго шага этапа подготовки данных к 'dfr <- ddply (dfr,. (Perc_bin), mutate, freq = 1, pos = cumsum (freq) - 0.5 * freq)' дает уложенные коробки равной высоты тоже. – patabongo

+0

рад помочь! – Ramnath

Смежные вопросы