пирамидальный граф в базе R - PullRequest
1 голос
/ 23 октября 2019

У меня есть список индивидуальной информации о возрасте и поле, например:

+-----+--------+
| age | gender |
+-----+--------+
|  46 | male   |
|  33 | female |
|  63 | female |
|  51 | male   |
|  46 | male   |
|  44 | female |
|  27 | male   |
|  38 | female |
|  56 | male   |
+-----+--------+

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

enter image description here

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

age <- as.data.frame(table(age))
age <- dcast(age, age ~ gender)
age <- data.frame(male = paste0("-",as.character(age$male)), female = 
as.character(age$female), ages = as.character(age$age), stringsAsFactors = F)
for (i in 18:80) {
  if(i %!in% age$ages) {
    addrow <- data.frame(male = "0", female = "0", ages = as.character(i), 
stringsAsFactors = F)
    age <- rbind(age, addrow)
  }
}
age <- data.frame(male = as.numeric(age$male), female = 
as.numeric(age$female), ages = as.numeric(age$age), stringsAsFactors = F)
age <- age[order(age$ages),] %>% select(c("male", "female"))

barplot(age$male,
        xlim = c(min(age$male), max(age$female)),
        horiz = T)
barplot(age$female,
        xlim = c(min(age$male), max(age$female)),
        horiz = T)

enter image description here enter image description here

1 Ответ

2 голосов
/ 23 октября 2019

Предположим, у нас есть возрастная матрица, подобная этой:

ag
#          5  10 15  20  25  30  35  40  45  50  55  60  65  70  75 80
# male   3.2 2.6  5 3.0 2.2 3.8 2.8 3.2 4.2 3.4 3.4 3.2 2.0 2.8 2.2  3
# female 4.6 2.6  4 2.4 1.8 2.8 1.8 3.0 2.8 5.2 3.6 4.2 2.4 2.8 3.0  3

Затем мы можем разделить строки и нарисовать две barplot по отдельности, одна часть должна быть установлена ​​в отрицательное значение.

ag.f <- - ag[1, ]
ag.m <- ag[2, ]

Нам нужно настроить xlim и указать add=TRUE на втором графике.

mwd <- max(range(ag)) +.5   # for adjustment

## barplots
b <- barplot(ag.f, horiz=T, xlim=c(-mwd, mwd), col=2, xaxt="n", yaxt="n")  # plot left
barplot(ag.m, horiz=T, add=TRUE, col=4, xaxt="n", yaxt="n")  # plot right

## axes
axis(1, at=(-5):5, labels=FALSE, tck=.02)
mtext(paste0(c(5:1, 0:5), "%"), 1, 1, at=(-5):5, las=1)
axis(2, b, labels=FALSE, tck=.02, lty=0)
mtext(colnames(ag), 2, 1, at=b, las=1)

## headers
text(-6, 21, "age", xpd=TRUE, font=2)
text(-2.5, 21, "female", xpd=TRUE, font=2)
text(2.5, 21, "male", xpd=TRUE, font=2)

Результат

enter image description here

Данные

ag <- structure(c(3.2, 4.6, 2.6, 2.6, 5, 4, 3, 2.4, 2.2, 1.8, 3.8, 
2.8, 2.8, 1.8, 3.2, 3, 4.2, 2.8, 3.4, 5.2, 3.4, 3.6, 3.2, 4.2, 
2, 2.4, 2.8, 2.8, 2.2, 3, 3, 3), .Dim = c(2L, 16L), .Dimnames = structure(list(
    c("male", "female"), c("5", "10", "15", "20", "25", "30", 
    "35", "40", "45", "50", "55", "60", "65", "70", "75", "80"
    )), .Names = c("", "")))
...