Reputation: 113
I am currently trying to get a proportional data chart similar to the one found on this page (http://www.improving-visualisation.org/vis/id=148).
The data I am working from is extracted from a CSV of the number of college graduates any given year stratified by sex and type of course from 1993 to 2003 inclusive. I have split the csv into "df_list"- the 1993 can be seen here.
df_list[1]$1993
year sex type_of_course no_of_graduates
1 1993 Males Education na
2 1993 Males Applied Arts na
3 1993 Males Humanities & Social Sciences 481
4 1993 Males Mass Communication na
5 1993 Males Accountancy 295
6 1993 Males Business & Administration 282
7 1993 Males Law 92
8 1993 Males Natural, Physical & Mathematical Sciences 404
9 1993 Males Medicine 95
10 1993 Males Dentistry 14
11 1993 Males Health Sciences 10
12 1993 Males Information Technology 264
13 1993 Males Architecture & Building 132
14 1993 Males Engineering Sciences 1496
15 1993 Males Services na
16 1993 Females Education na
17 1993 Females Applied Arts na
18 1993 Females Humanities & Social Sciences 1173
19 1993 Females Mass Communication na
20 1993 Females Accountancy 396
21 1993 Females Business & Administration 708
22 1993 Females Law 93
23 1993 Females Natural, Physical & Mathematical Sciences 588
24 1993 Females Medicine 61
25 1993 Females Dentistry 11
26 1993 Females Health Sciences 40
27 1993 Females Information Technology 215
28 1993 Females Architecture & Building 144
29 1993 Females Engineering Sciences 254
30 1993 Females Services na
I understand the next step will to make individual proportional bar graphs for each year with respect to each course- how exactly to I go about that? I am currently stuck trying to merge males and females into a single row.
Upvotes: 0
Views: 768
Reputation: 598
Not having the data to work with, I generated a small sample which might be used by others and improved :
library(dplyr)
library(ggplot2)
set.seed(1)
year <- rep("1993", 20)
sex <- rep(c("M","F"), each = 10)
course <- rep(letters[1:10], 2)
num <- round(runif(20, min = 49, max = 120))
df <- data.frame(year, sex, course, num)
df <- tbl_df(df)
df
Source: local data frame [20 x 4]
year sex course num
(fctr) (fctr) (fctr) (dbl)
1 1993 M a 68
2 1993 M b 75
3 1993 M c 90
4 1993 M d 113
5 1993 M e 63
6 1993 M f 113
7 1993 M g 116
8 1993 M h 96
9 1993 M i 94
10 1993 M j 53
11 1993 F a 64
12 1993 F b 62
13 1993 F c 98
14 1993 F d 76
15 1993 F e 104
16 1993 F f 84
17 1993 F g 100
18 1993 F h 119
19 1993 F i 76
20 1993 F j 104
Note that I used letters for the course names. Now I will make a labeling dataset:
mylab <- data.frame(x = factor(df$course),
y = rep(c(0.3, 0.8), each = 10), l = df$num)
Finally to the plot:
ggplot(data = df, aes(x = factor(course), y = num, fill=factor(sex))) +
geom_bar(stat = "identity", position = "fill") +
geom_text(data = mylab, aes(x = x, y = y, label = l))
Of course now one can play with the labels and title.
Hope it helps.
Upvotes: 0
Reputation: 1846
Although the final question is to obtain a graph, seems more a question of handling data.frame.
A toy-dataset for a reproducible example:
year <- c(rep("1993",6), rep("1994",6))
sex <- c(rep("males",3), rep("females", 3))
course <- c(rep(letters[1:3],4))
number <- 1:12*10
data <- data.frame(cbind(year, sex, course, number))
data$number <- as.numeric(data$number)
data$number[1] <- NA
And unify the number
variable regardless of the sex
variable.
library(dplyr)
df <- data %>% group_by(year, course) %>% summarise(total=sum(number, na.rm=TRUE))
library(plyr)
df_2 <- ddply(df, .(year), transform, label_y=cumsum(total))
footnote(1)
Obtaining the desired chart
library(ggplot2)
ggplot(df_2, aes(x=year, y=total, fill=course)) + geom_bar(stat="identity") +
geom_text(aes(y=label_y ,label=total), vjust=3, colour="white")
(1) The loading of packages and play dplyr is very sensitive. There are functions that are modified and to repeat the process a second time have to leave R. I have not found a better way.
Upvotes: 1
Reputation: 4406
Because the data isn't reproducible this is untested. But I think that something like this would work:
library(ggplot2)
ggplot(dflist, aes(x=sex, y=no_of_graduates, fill=type_of_course)) +
geom_bar(stat="identity")
Or a trivial iris example:
library(dplyr)
iris %>%
mutate(DummyXVar="DummyX") %>%
ggplot(aes(y=Petal.Width, x=DummyXVar,fill=Species)) +
geom_bar(stat="identity")
HTH
Upvotes: 1