Гистограмма / гистограмма, содержащая две переменные в столбце - PullRequest
1 голос
/ 01 марта 2020

Я хочу сделать / гистограмму, которая выглядит аналогично графику ниже:

Click here

У меня есть следующий код

d1 <- read.table("Session_data_TU2010AND15.csv", header = TRUE, sep = ";")
d <- d1[,c("IncHouseh","HousehNumcars")]

Первая переменная IncHouseh - это доход разных домохозяйств. Они должны быть показаны в интервалах по оси X, в то время как HousehNumcars (количество автомобилей в домохозяйстве) должно быть процентом, показанным в столбце для каждого интервала.

Данные d выглядят так, но с более чем 20000 строками:

      IncHouseh HousehNumcars
1           800             2
2           384             2
4           638             1
5           580             2
6           700             2
7           744             2
8           560             1
9           500             1
10          686             1
11          310             1
12          510             1
13          648             2
14          372             1
15          542             1

Поскольку я новичок в , я нахожу очень трудно быть в состоянии проиллюстрировать что-то похожее на приведенную выше ссылку Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: После следования приведенному ниже коду massisenergy (большое спасибо) мне удалось получить эту цифру (это правильно):

enter image description here

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Сначала вы можете использовать cut для классификации данных о доходах.

dat$IncHouseh.c=cut(dat$IncHouseh, seq(1e3, 5e3, 1e3), 
                    labels=c("10k-20k", "20k-30k", "30k-40k", "40k-50k"))

Затем, во-вторых, для агрегирования процента от количества автомобилей, которые вы можете использовать prop.table(table(x))) в tapply.

agg <- do.call(rbind, with(t(dat), tapply(HousehNumcars, IncHouseh.c, FUN=function(x)
  prop.table(table(x)))))

В-третьих, сюжет!

op <- par(mar=c(5, 5, 4, 6), xpd=TRUE)                   ## expand outer margins
b <- barplot(agg, xaxt="n", col=2:5,                     ## assign position output to `b`
             xlab="Income", ylab="Probability", main="Cars in households")
mtext(rownames(agg), 1, 1, at=b)                         ## use `b` for label positioning
legend(5, 1, title="cars", col=5:2, pch=15, legend=3:0)  ## legend
par(op)

Обратите внимание, что dat необходимо переставить t.

Результат

enter image description here


Данные:

set.seed(42)
dat <- data.frame(IncHouseh=sample(1e3:5e3, 2e3, replace=T),
                  HousehNumcars=sample(0:3, 2e3, replace=TRUE))
0 голосов
/ 01 марта 2020

Вот еще один подход, использующий знаменитый для обработки данных и для построения графиков. Pacakge magrittr предназначен для конструкции %>% pipe.

STEP1

Считывает данные и структурирует их как с именем df. Не забудьте использовать stringsAsFactors = F для создания столбцов любого типа, отличного от factor, для упрощения манипулирования данными на следующих шагах.

library(dplyr); library(magrittr); library(ggplot2)
d1 <- read.table(text = "IncHouseh HousehNumcars
1           800             2
2           384             2
4           638             1
5           580             2
6           700             2
7           744             2
8           560             1
9           500             1
10          686             1
11          310             1
12          510             1
13          648             2
14          372             1
15          542             1", header =T)
df <- data.frame(d1, stringsAsFactors = F)

STEP2

Используйте mutate (для добавления новых столбцов, пригодных для построения графиков), case_when (для создания if-else построения)

df <- df %>% mutate(x_labels = case_when(IncHouseh <= 100 & IncHouseh > 0 ~ "under100",
                                      IncHouseh <= 200 & IncHouseh > 100 ~ "100-200",
                                      IncHouseh <= 300 & IncHouseh > 200 ~ "200-300",
                                      IncHouseh <= 400 & IncHouseh > 300 ~ "300-400",
                                      IncHouseh <= 500 & IncHouseh > 400 ~ "400-500",
                                      IncHouseh <= 600 & IncHouseh > 500 ~ "500-600",
                                      IncHouseh <= 700 & IncHouseh > 600 ~ "600-700",
                                      IncHouseh <= 800 & IncHouseh > 700 ~ "700-800",
                                      IncHouseh <= 900 & IncHouseh > 800 ~ "800-900",
                                      IncHouseh <= 1000 & IncHouseh > 900 ~ "900-1000"))
df <- df %>% group_by(x_labels) %>% mutate(Probability = (HousehNumcars/sum(HousehNumcars)
                                           *100), Cars = as.factor(HousehNumcars))

STEP3

Печать!

plot <- df %>% ggplot(aes(x = x_labels, y = Probability, fill = Cars)) + geom_col()
#some codes for beautification, but not necessary
plot + ylab("Probability or number of cars (%)") + xlab("Range of income") + 
ggtitle("Number of cars according to houshold income") +
theme(plot.title = element_text(hjust = 0.5))

enter image description here

РЕДАКТИРОВАТЬ

Цель: создать группировку по своему усмотрению для заливки переменная Cars. Идея та же: использование case_when.

df_cars <- df %>% group_by(x_labels) %>% mutate(Probability = (HousehNumcars/
                                                sum(HousehNumcars)*100), Cars = 
                                       case_when(HousehNumcars == 1 ~ "1",
                                                 HousehNumcars >= 2 ~ "2+"))

#Plotting in the same way:
plot <- df_cars %>% ggplot(aes(x = x_labels, y = Probability, fill = Cars)) + geom_col()
plot + ylab("Probability or number of cars (%)") + xlab("Range of income") + 
ggtitle("Number of cars according to houshold income") +
  theme(plot.title = element_text(hjust = 0.5))

enter image description here

...