Фасет со свободными весами, но фиксированное соотношение сторон

Я использую 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)

с результатом, который выглядит так:

NZ map - fixed aspect ratio

Обратите внимание, что на гранях Северного острова довольно много места. Я бы хотел, чтобы он занимал больше свободного места. Я могу высвободить весы следующим образом:

gg_nz + facet_wrap(~region, scales="free")

со следующим результатом:

NZ map - free scales

Проблема в том, что соотношение сторон xy больше не равно 1:1 в каждом аспекте. Я рад, что каждая грань в другом масштабе, но в пределах фасета я хотел бы сохранить соотношение сторон.

Я пробовал следующее без успеха:

gg_nz + facet_wrap(~region, scales="free") + coord_fixed()

Предположительно, параметр scale в facet_wrap переопределяет coord_fixed. Какие-либо предложения?

ОБНОВЛЕНИЕ: чтобы дать более драматичную иллюстрацию, здесь одно и то же явление с некоторыми штатами США:

Фиксированные координаты (с использованием функции coord_fixed или coord_equal):

US map - Fixed aspect Свободные координаты (с использованием scales = free):

US map -Free scales

Ни одна из этих карт не идеальна: во-первых, Делавэр крошечный. Во втором аспекте пропорции довольно искажены. Например, Нью-Джерси, которая является узким государством, слишком растянута.

Ответы

Ответ 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")

enter image description here


Оригинальный ответ:

возможно, вместо того, чтобы иметь свободную ось оси, просто иметь только одну шкалу:

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")

enter image description here

Ответ 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)

enter image description here