2016-11-24 11 views
0

Я хотел сделать сюжет с использованием ggplot2, так что есть гистограммы, показывающие уровни (бары) людей в каждом виде урбанистической/сельской среды (фасет). Я достиг этого.Как добавить проценты к графам гистограммы в ggplot2 в R?

Теперь я хочу добавить соотношение людей с каждым видом квалификации для каждой грани. То, что я получил, используя приведенный ниже код, составляет для всего населения.

Как изменить код, чтобы проценты учитывались внутри каждой грани?

Вот пример с 1000 строк из набора данных, который я использовал: link.

library(ggplot2) 
library(scales) 

# plot urban/rural by degree in facets 
myplot <- ggplot(data = si 
        ,aes(DEGREE) 
    ) 
    myplot <- myplot + geom_bar() 
    myplot <- myplot + labs(title = "Degree by Urban/Rural", y = "Percent", x = "DEGREE") 
    myplot <- myplot + geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) 
    myplot <- myplot + facet_wrap(~URBRURAL) 
    myplot <- myplot + theme(axis.text.x = element_text(angle = 20, hjust = 1)) 
    myplot 

enter image description here

+0

вы можете поделиться образец данных? –

+1

Много потенциальных дубликатов там, в том числе [здесь] (http://stackoverflow.com/questions/4725339/percentage-on-y-lab-in-a-faceted-ggplot-barchart), [здесь] (http : //stackoverflow.com/questions/9614720/obtaining-percent-scales-reflective-of-individual-facets-with-ggplot2) и [здесь] (http://stackoverflow.com/questions/12236160/ggplot-sum -percentages-для-каждого-фасеточного Респект-заливку). Вы пробовали какие-либо варианты в ответах? – aosmith

+0

[Вот пример моих данных] (http://s000.tinyupload.com/?file_id=02792393224272274158) –

ответ

0

Это работает, я думаю:

si <- read.csv('sampledata.csv', sep=' ') 
myplot <- ggplot(data = si 
       ,aes(DEGREE) 
) 
myplot <- myplot + geom_bar() 
myplot <- myplot + labs(title = "Degree by Urban/Rural", y = "Percent", x = "DEGREE") 
myplot <- myplot + geom_text(aes(y = ((..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]), label = scales::percent((..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])), stat = "count", vjust = -0.25) 
myplot <- myplot + facet_wrap(~URBRURAL) 
myplot <- myplot + theme(axis.text.x = element_text(angle = 20, hjust = 1)) 
myplot 

enter image description here

На самом деле у этикетки оси не процентов, а реальные отсчеты, как они были в исходном рисунке, надписи на бары представляют проценты, посмотрите на строку 18 ниже, что показывает, что 45 не является предварительным значением, а фактическим числом этой группы в данные образцов, которые вы предоставили, тогда как 15,7% на одном и том же баре в соответствующей фасете представляют процент.

library(dplyr) 
as.data.frame(si %>% group_by(URBRURAL, DEGREE) %>% summarise(n=n())) 

1 Country village, other type of community Above higher secondary level, other qualification 6 
2 Country village, other type of community      Above lowest qualification 16 
3 Country village, other type of community      Higher secondary completed 9 
4 Country village, other type of community      Lowest formal qualification 31 
5 Country village, other type of community       No formal qualification 20 
6 Country village, other type of community      University degree completed 1 
7    Farm or home in the country      Above lowest qualification 1 
8    Farm or home in the country      Higher secondary completed 1 
9    Farm or home in the country      Lowest formal qualification 5 
10    Farm or home in the country       No formal qualification 1 
11    Farm or home in the country      University degree completed 1 
12   Suburb, outskirt of a big city Above higher secondary level, other qualification 45 
13   Suburb, outskirt of a big city      Above lowest qualification 57 
14   Suburb, outskirt of a big city      Higher secondary completed 75 
15   Suburb, outskirt of a big city      Lowest formal qualification 48 
16   Suburb, outskirt of a big city       No formal qualification 23 
17   Suburb, outskirt of a big city      University degree completed 15 
18      Town or small city Above higher secondary level, other qualification 45 
+0

Высота баров не соответствует процентному масштабу, например, первая полоса в левой фасете ковер («Город или маленький город») имеет отметку 15,7%, но полоса достигает 45%. – Uwe

+0

Фактически оси оси y не являются процентами, но * фактические подсчеты *, как они были на вашем исходном рисунке, метки на барах представляют * проценты *, обновили сообщение. –

2

Вы всегда можете преобразовать свои данные, чтобы рассчитать, что вы хотите, до его построения. Я добавил некоторые настройки (метки в верхней части панели, обертка строк по оси х, ограничения по оси и метки).

library(dplyr) 
library(ggplot2) 
library(stringr) 

plot_data <- df %>% 
    group_by(URBRURAL, DEGREE) %>% 
    tally %>% 
    mutate(percent = n/sum(n)) 

ggplot(plot_data, aes(x = DEGREE, y = percent)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(label = percent(percent)), vjust = -0.5) + 
    labs(title = "Degree by Urban/Rural", y = "Percent", x = "DEGREE") + 
    scale_y_continuous(labels = percent, limits = c(0,1)) + 
    scale_x_discrete(labels = function(x) str_wrap(x, 10)) + 
    facet_wrap(~URBRURAL) 

enter image description here

+0

Чистое и простое решение для вычисления и улучшения графики. Тем не менее, код, который вы предоставили, по-прежнему печатает наклонные метки по оси x и не обертывается, как показано. Пожалуйста, вы можете добавить код для упаковки этикеток - Спасибо. – Uwe

+0

Исправлено, спасибо, что указали это! –

+0

Спасибо Джейку. 'scales_x_discrete()' создает ошибку. Он должен читать 'scale_x_discrete()'. К сожалению, мне не разрешено делать изменения менее 6 символов, так что вы можете правильно поправить опечатку самостоятельно - Спасибо. – Uwe

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

  • Нет связанных вопросов^_^