#r #ggplot2
#r #ggplot2
Вопрос:
У меня есть большая гистограмма:
Я хочу разделить ее на две части и распечатать на двух страницах, подобных приведенной ниже, но с одинаковым размером шкалы с обеих сторон. Приведенная ниже была выполнена:
library(dplyr)
library(gridExtra)
p1 = d %>%
slice(1:30) %>%
ggplot(aes(reorder(shop_id, sales), sales))
geom_bar(stat = "identity")
labs(x = "shop")
theme_minimal()
coord_flip()
p2 = d %>%
slice(31:60) %>%
ggplot(aes(reorder(shop_id, sales), sales))
geom_bar(stat = "identity")
labs(x = "shop")
theme_minimal()
coord_flip()
grid.arrange(p1,p2, ncol = 2)
… но должен быть лучший метод.
structure(list(shop_id = 0:59, sales = c(1.18748097798519, 1.1114829165199,
1.17810011157708, 1.1105671314429, 1.14905078186287, 1.12003981246235,
1.21564666174709, 1.15465941180522, 1.05363423212192, 4.22980538523061,
1.14609524699724, 1.14629258517034, 2.11788781921946, 1.10878590664273,
1.25409015927959, 1.19643427265548, 1.16875260742595, 1.12583877995643,
1.23031544141131, 1.14933266573829, 3.27678571428571, 1.17936456057661,
1.32565919795748, 1.10656326296137, 1.2046688791673, 1.2999183252375,
1.25932109070673, 1.29697435605414, 1.29755895214928, 1.19274758760792,
1.19598898938262, 1.31888590877455, 1.10494526236316, 1.09051123930774,
1.12152294853964, 1.18087090426897, 1.07843137254902, 1.16696099702306,
1.17110381848608, 1.23638392857143, 1.16114634719286, 1.17530440584269,
1.32659057417188, 1.28832544167812, 1.13680748798381, 1.16728427739545,
1.19102546704664, 1.19299761883764, 1.15255413659078, 1.0783014701243,
1.16977889616866, 1.09754011658002, 1.14348765573997, 1.16507624572476,
1.29488430443267, 1.82311829503293, 1.12226007215443, 1.20164696665191,
1.14407693061407, 1.16350812197207)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -60L))
Комментарии:
1. Можете ли вы опубликовать код, который вы использовали для получения выходных данных?
Ответ №1:
Вот одно из решений facet_wrap
. Я решил скрыть информацию о фасете постфактум, но вы можете легко изменить это, если хотите:
x <- structure(list(shop_id = 0:59, sales = c(1.18748097798519, 1.1114829165199,
1.17810011157708, 1.1105671314429, 1.14905078186287, 1.12003981246235,
1.21564666174709, 1.15465941180522, 1.05363423212192, 4.22980538523061,
1.14609524699724, 1.14629258517034, 2.11788781921946, 1.10878590664273,
1.25409015927959, 1.19643427265548, 1.16875260742595, 1.12583877995643,
1.23031544141131, 1.14933266573829, 3.27678571428571, 1.17936456057661,
1.32565919795748, 1.10656326296137, 1.2046688791673, 1.2999183252375,
1.25932109070673, 1.29697435605414, 1.29755895214928, 1.19274758760792,
1.19598898938262, 1.31888590877455, 1.10494526236316, 1.09051123930774,
1.12152294853964, 1.18087090426897, 1.07843137254902, 1.16696099702306,
1.17110381848608, 1.23638392857143, 1.16114634719286, 1.17530440584269,
1.32659057417188, 1.28832544167812, 1.13680748798381, 1.16728427739545,
1.19102546704664, 1.19299761883764, 1.15255413659078, 1.0783014701243,
1.16977889616866, 1.09754011658002, 1.14348765573997, 1.16507624572476,
1.29488430443267, 1.82311829503293, 1.12226007215443, 1.20164696665191,
1.14407693061407, 1.16350812197207)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -60L))
x$rank <- rank(-x$sales)
x$group <- ifelse(x$rank <= 30, 1,2)
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 3.4.4
ggplot(x, aes(reorder(shop_id, sales), sales))
geom_bar(stat = "identity")
coord_flip()
facet_wrap(~group, scales = "free_y")
xlab("Store")
theme(strip.background = element_blank(), strip.text = element_blank())
Создано 2019-04-15 пакетом reprex (версия 0.2.1)
Ответ №2:
Вы могли бы использовать slice
для подмножества ваших данных, а затем вручную установить разрывы scale_y_continuous
.
data %>%
slice(1:30) %>%
ggplot(aes(reorder(shop_id, sales), sales))
geom_col()
coord_flip()
scale_y_continuous(limits = c(0, 4))
data %>%
slice(31:60) %>%
ggplot(aes(reorder(shop_id, sales), sales))
geom_col()
coord_flip()
scale_y_continuous(limits = c(0, 4))
Вы также можете превратить это в функцию, если собираетесь часто ее использовать:
slice_and_dice <- function(data, rows) {
data %>%
slice(rows) %>%
ggplot(aes(reorder(shop_id, sales), sales))
geom_col()
coord_flip()
scale_y_continuous(limits = c(0, 4))
}