Фасет со свободными весами, но фиксированное соотношение сторон
Я использую ggplot для рисования граненых карт и не смог решить, как разрешить "свободные" масштабы в каждом аспекте (так что небольшие области не выглядят слишком маленькими), сохраняя при этом соотношение сторон xy.
Вот упрощенный пример:
require(maps)
require(ggplot2)
map_nz <- subset(fortify(map_data('nz')),
region %in% c("South.Island ", "North.Island "))
gg_nz <- qplot(long, lat, data=map_nz, geom="polygon", group=group)
Теперь у меня есть сюжет о Северном и Южном островах Новой Зеландии. Я могу сделать это и отобразить его с фиксированным соотношением сторон:
gg_nz + coord_fixed() + facet_wrap(~region)
с результатом, который выглядит так:
Обратите внимание, что на гранях Северного острова довольно много места. Я бы хотел, чтобы он занимал больше свободного места. Я могу высвободить весы следующим образом:
gg_nz + facet_wrap(~region, scales="free")
со следующим результатом:
Проблема в том, что соотношение сторон xy больше не равно 1:1 в каждом аспекте. Я рад, что каждая грань в другом масштабе, но в пределах фасета я хотел бы сохранить соотношение сторон.
Я пробовал следующее без успеха:
gg_nz + facet_wrap(~region, scales="free") + coord_fixed()
Предположительно, параметр scale
в facet_wrap
переопределяет coord_fixed
. Какие-либо предложения?
ОБНОВЛЕНИЕ: чтобы дать более драматичную иллюстрацию, здесь одно и то же явление с некоторыми штатами США:
Фиксированные координаты (с использованием функции coord_fixed
или coord_equal
):
Свободные координаты (с использованием scales = free
):
Ни одна из этих карт не идеальна: во-первых, Делавэр крошечный. Во втором аспекте пропорции довольно искажены. Например, Нью-Джерси, которая является узким государством, слишком растянута.
Ответы
Ответ 1
ОБНОВИТЬ:
Я считаю, что то, что вы ищете, это способность обрезать или масштабировать в один грань. Другими словами, настроить ylim
и xlim
независимо для каждой грани. Похоже, что такая функция была запрошена, но еще не реализована (https://github.com/hadley/ggplot2/issues/187)
Если параметр space=free
ниже не работает, альтернативой является обрезка граней и использование макетов сетки и/или видовых экранов для печати каждого графика вручную.
Использование facet_grid
вместо facet_wrap
и добавление space=free
:
gg_state + facet_grid(~region, scales = "free_x", space="free")
Оригинальный ответ:
возможно, вместо того, чтобы иметь свободную ось оси, просто иметь только одну шкалу:
map_state <- subset(fortify(map_data('state')),
region %in% c("california", "nevada"))
gg_state <- qplot(long, lat, data=map_state, geom="polygon", group=group)
gg_state + facet_wrap(~region, scales="free_x")
Ответ 2
theme(aspect.ratio = 1)
работает.
gg_nz + facet_wrap(~region, scales="free") + theme(aspect.ratio = 1)
Ответ 3
Помогает ли coord_equal
?
gg_nz + facet_wrap(~region, scales="free") + coord_equal()
редактировать
Вы можете использовать grid.arrange
чтобы вручную разместить графики на странице, фиксируя ширину и высоту. Это похоже на трюк, но я не могу заставить его работать с функциями facet()
. Благодаря этому сообщению от @mnel.
nz_sth <- qplot(long, lat, data=map_nz[map_nz$region == "South.Island ",], geom="polygon", group=group) + coord_fixed()
nz_nth <- qplot(long, lat, data= map_nz[ map_nz$region == "North.Island " , ] , geom="polygon", group=group) + coord_fixed()
grid.arrange( heights=unit(0.75, "npc") , widths=unit(0.5, "npc") , nz_sth,nz_nth, ncol=2)