조선시대 전답 통계를 stacked area graph로 표시
options(warn = -1)
library(knitr)
library(magrittr)
library(knitr)
year <- c(1404, 1414, 1432, 1592, 1603, 1634, 1719, 1784, 1786, 1807, 1864)
province <- c("경기도", "충청도", "전라도", "경상도", "황해도", "강원도", "함경도", "평안도")
field <- matrix(c(NA, 223090, 173990, 224625, 90922, 59989, 3271, 6648,
NA, 223090, 279090, 226025, 90925, 59989, 3271, 6648,
207119, 236300, 377588, 301147, 104772, 65916, 130413, 308751,
147370, 250503, 442189, 315026, 106832, 34831, 63821, 153009,
141959, 240744, 198672, 173902, 108211, 33884, 54377, 153009,
100359, 258461, 335305, 301819, 128834, 33884, 61243, 94000,
101256, 255208, 377159, 336778, 128834, 44051, 61243, 90804,
110932, 255519, 348489, 335730, 129244, 40889, 109556, 105760,
109932, 255519, 348489, 336730, 129244, 40889, 109556, 106041,
112090, 256528, 340103, 337128, 132211, 41151, 117746, 119635,
111912, 255585, 339743, 337472, 132373, 40926, 117746, 119735),
ncol = 8,
byrow = TRUE)
rownames(field) <- year
colnames(field) <- province
field %>% str
## num [1:11, 1:8] NA NA 207119 147370 141959 ...
## - attr(*, "dimnames")=List of 2
## ..$ : chr [1:11] "1404" "1414" "1432" "1592" ...
## ..$ : chr [1:8] "경기도" "충청도" "전라도" "경상도" ...
options(digits = 2)
mean_field <- field %>% colMeans(na.rm = TRUE)
prop_field <- field %>%
{colMeans(., na.rm = TRUE) / sum(colMeans(., na.rm = TRUE))} %>%
`*`(100) %>%
round(digits = 2)
matrix
(array)에 특화된 melt
사용
library(reshape2)
field_melt <- field %>%
melt(varnames = c("Year", "Province"), value.name = "Area")
field_melt %>% str
## 'data.frame': 88 obs. of 3 variables:
## $ Year : int 1404 1414 1432 1592 1603 1634 1719 1784 1786 1807 ...
## $ Province: Factor w/ 8 levels "경기도","충청도",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Area : num NA NA 207119 147370 141959 ...
# kable(field_melt)
library(ggplot2)
library(extrafont)
source("theme_kr.R")
g0 <- ggplot()
g1 <- g0 +
geom_area(data = field_melt,
mapping = aes(x = Year, y = Area, fill = Province),
colour = "black",
size = 0.2,
alpha = 0.4,
na.rm = TRUE)
g1
g2 <- g1 +
scale_fill_brewer(palette = "Spectral",
name = "",
breaks = levels(field_melt$Province)) +
theme_bw() +
theme_kr
g2
g3<- g2 +
scale_x_continuous(name = "연도",
breaks = as.numeric(row.names(field)[-9]),
labels = row.names(field)[-9])
g3
g4 <- g3 +
theme(axis.text.x = element_text(angle = 90))
g4
g5 <- g4 +
scale_y_continuous(name = "토지 면적(결)",
breaks = cumsum(rev(field[3, ])),
labels = format(cumsum(rev(field[3, ])), big.mark = ","))
g5
g6 <- g5 +
labs(title = "조선 시대 도별 논밭통계", subtitle = "(도표 안의 수치는 기록된 값들의 평균)") +
theme(plot.subtitle = element_text(family = "KoPubWorldDotum Medium", hjust = 1))
g6
g7 <- g6 +
theme(plot.title = element_text(size = 16, hjust = 0.5))
g7
# x.max <- max(year) + 0.15 * diff(range(year))
# g8 <- g7 +
# scale_x_continuous(name = "연도",
# breaks = as.numeric(row.names(field)[-9]),
# labels = row.names(field)[-9],
# limits = c(min(year), x.max)) +
# theme(legend.position = c(0.95, 0.5),
# legend.box.background = element_rect(fill = "white", colour = "black"),
# legend.title = element_blank())
# g8
g9 <- g7 +
theme(legend.position = c(0.75, 0.9),
legend.box.background = element_rect(fill = "white", colour = "black"),
legend.direction = "horizontal")
g9
y_coord <- apply(field[3:4, ], 2, mean)
y_text <- cumsum(c(0, head(rev(y_coord), -1))) + rev(y_coord) / 2
mean_text <- rev(paste(province,
":",
format(mean_field, big.mark = ","),
"결(",
format(prop_field, digits = 2, nsmall = 0),
"%)",
sep = ""))
text_df <- data.frame(x = (year[3] + year[4]) / 2,
y = y_text,
label = mean_text,
row.names = NULL,
stringsAsFactors = FALSE)
g10 <- g9 +
guides(fill = FALSE) +
geom_text(data = text_df,
mapping = aes(x = x, y = y),
label = mean_text,
family = "KoPubWorldDotum Medium", size = 3) +
annotate("text", x = 1592, y = 1650000,
label = "임진왜란",
colour = "red",
size = 5,
family = "KoPubWorldDotum Medium")
# theme(text = element_text(family = "KoPubWorldDotum Medium"))
# annotate("text",
# x = text_df$x,
# y = text_df$y,
# label = mean_text,
# family = "KoPubWorldDotum Medium")
g10
ggsave("../pics/chosun_field_ggplot.png", dpi = 72)