使用 facet_wrap() 控制主轴和次轴上的标签
Controlling the labels on the primary and secondary axis with facet_wrap()
以下代码生成单个图:
data <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.0, 10.4, 30.7, 26.7, 32.2, 0.0, 9.9, 31.0, 26.5, 32.6, 0.0, 19.1, 29.6, 25.6, 25.7),
unknown = c(rep(30,5), rep(40,5), rep(27,5)),
region = 'Asia')
# Numeric year
data$year_num <- as.numeric(factor(data$year))
# Labels for primary scale
labels <- levels(factor(data$year))
# Labels for secondary scale
dup_labels <- distinct(data, year, unknown) %>% tibble::deframe()
p1 <- ggplot(data, aes(fill=model, x=value, y = year_num)) +
geom_bar(stat='identity', position = position_fill(reverse = TRUE), orientation = "y") +
scale_fill_grey(start=0.8, end=0.2) +
theme_bw() +
ggtitle('Model') +
xlab('') + ylab('') +
theme(legend.position="bottom",
plot.title = element_text(hjust = 0.5),
legend.title=element_blank(),
text = element_text(family = "serif")
) +
scale_x_continuous(labels = percent_format(scale = 100)) +
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels))
p1
接下来,我想用 facet_wrap
制作几个图,但我在控制标签方面遇到了挑战。我不太确定如何迭代相应图的标签。
例如,如果我想用 facet_wrap(~region, dir = 'v', nrow = 2)
绘制以下数据:
data1 <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.0, 10.4, 30.7, 26.7, 32.2, 0.0, 9.9, 31.0, 26.5, 32.6, 0.0, 19.1, 29.6, 25.6, 25.7),
unknown = c(rep(30,5), rep(40,5), rep(27,5)),
region = 'Asia')
data2 <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.4, 15.0, 25.6, 20.6, 38.3, 1.1, 15, 13, 14.6, 56.9, 0.8, 19.8, 22, 18.8,38.1),
unknown = c(rep(28,5), rep(35,5), rep(17,5)),
region = 'Europe')
data <- rbind(data1, data2)
我认为我需要进行某种迭代,但我真的无法解决这个问题。
Facet-wrap 将根据指定方面的值自动添加标签。在您的情况下,您正在 'region,' 方面进行包装,因此您的地块将被标记为“亚洲”和“欧洲”。如果你想要另一个标签,这通常是通过将 labeller 作为 facet_wrap.
的参数来完成的
一个选项是 ggh4x 包,它允许通过 ggh4x::facetted_pos_scales
.
为每个方面设置比例
为此,例如dup_axis
的标签列表,然后通过 ggh4x::facetted_pos_scales
:
向每个方面添加具有相应 dup_labels
的比例
library(ggplot2)
library(ggh4x)
library(scales)
library(dplyr)
# Numeric year
data$year_num <- as.numeric(factor(data$year))
# Labels for primary scale
labels <- levels(factor(data$year))
# Make a list of labels for secondary scale by region
dup_labels <- data %>%
split(.$region) %>%
lapply(function(x) distinct(x, year, unknown) %>% tibble::deframe())
p <- ggplot(data, aes(fill=model, x=value, y = year_num)) +
geom_bar(stat='identity', position = position_fill(reverse = TRUE), orientation = "y") +
scale_fill_grey(start=0.8, end=0.2) +
theme_bw() +
ggtitle('Model') +
xlab('') + ylab('') +
theme(legend.position="bottom",
plot.title = element_text(hjust = 0.5),
legend.title=element_blank(),
text = element_text(family = "serif")
) +
scale_x_continuous(labels = percent_format(scale = 100)) +
facet_wrap(~region, nrow = 2, scales = "free_y")
p +
facetted_pos_scales(
y = list(
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels[["Asia"]])),
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels[["Europe"]])))
)
或者不用复制代码来为每个区域添加比例,您可以使用例如lapply
:
p + facetted_pos_scales(y = lapply(dup_labels, function(x) scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = x))))
以下代码生成单个图:
data <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.0, 10.4, 30.7, 26.7, 32.2, 0.0, 9.9, 31.0, 26.5, 32.6, 0.0, 19.1, 29.6, 25.6, 25.7),
unknown = c(rep(30,5), rep(40,5), rep(27,5)),
region = 'Asia')
# Numeric year
data$year_num <- as.numeric(factor(data$year))
# Labels for primary scale
labels <- levels(factor(data$year))
# Labels for secondary scale
dup_labels <- distinct(data, year, unknown) %>% tibble::deframe()
p1 <- ggplot(data, aes(fill=model, x=value, y = year_num)) +
geom_bar(stat='identity', position = position_fill(reverse = TRUE), orientation = "y") +
scale_fill_grey(start=0.8, end=0.2) +
theme_bw() +
ggtitle('Model') +
xlab('') + ylab('') +
theme(legend.position="bottom",
plot.title = element_text(hjust = 0.5),
legend.title=element_blank(),
text = element_text(family = "serif")
) +
scale_x_continuous(labels = percent_format(scale = 100)) +
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels))
p1
接下来,我想用 facet_wrap
制作几个图,但我在控制标签方面遇到了挑战。我不太确定如何迭代相应图的标签。
例如,如果我想用 facet_wrap(~region, dir = 'v', nrow = 2)
绘制以下数据:
data1 <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.0, 10.4, 30.7, 26.7, 32.2, 0.0, 9.9, 31.0, 26.5, 32.6, 0.0, 19.1, 29.6, 25.6, 25.7),
unknown = c(rep(30,5), rep(40,5), rep(27,5)),
region = 'Asia')
data2 <- tibble(model = rep(c("model 0", "model I", "model II", "model III", "model IV"),3),
year = c(rep('2005-2009', 5), rep('2010-2014',5), rep('2015-2017',5)),
value = c(0.4, 15.0, 25.6, 20.6, 38.3, 1.1, 15, 13, 14.6, 56.9, 0.8, 19.8, 22, 18.8,38.1),
unknown = c(rep(28,5), rep(35,5), rep(17,5)),
region = 'Europe')
data <- rbind(data1, data2)
我认为我需要进行某种迭代,但我真的无法解决这个问题。
Facet-wrap 将根据指定方面的值自动添加标签。在您的情况下,您正在 'region,' 方面进行包装,因此您的地块将被标记为“亚洲”和“欧洲”。如果你想要另一个标签,这通常是通过将 labeller 作为 facet_wrap.
的参数来完成的一个选项是 ggh4x 包,它允许通过 ggh4x::facetted_pos_scales
.
为此,例如dup_axis
的标签列表,然后通过 ggh4x::facetted_pos_scales
:
dup_labels
的比例
library(ggplot2)
library(ggh4x)
library(scales)
library(dplyr)
# Numeric year
data$year_num <- as.numeric(factor(data$year))
# Labels for primary scale
labels <- levels(factor(data$year))
# Make a list of labels for secondary scale by region
dup_labels <- data %>%
split(.$region) %>%
lapply(function(x) distinct(x, year, unknown) %>% tibble::deframe())
p <- ggplot(data, aes(fill=model, x=value, y = year_num)) +
geom_bar(stat='identity', position = position_fill(reverse = TRUE), orientation = "y") +
scale_fill_grey(start=0.8, end=0.2) +
theme_bw() +
ggtitle('Model') +
xlab('') + ylab('') +
theme(legend.position="bottom",
plot.title = element_text(hjust = 0.5),
legend.title=element_blank(),
text = element_text(family = "serif")
) +
scale_x_continuous(labels = percent_format(scale = 100)) +
facet_wrap(~region, nrow = 2, scales = "free_y")
p +
facetted_pos_scales(
y = list(
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels[["Asia"]])),
scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = dup_labels[["Europe"]])))
)
或者不用复制代码来为每个区域添加比例,您可以使用例如lapply
:
p + facetted_pos_scales(y = lapply(dup_labels, function(x) scale_y_continuous(breaks = seq_along(labels), labels = labels, sec.axis = dup_axis(labels = x))))