_zif (_zif) wrote,
_zif
_zif

Categories:

Quantum GIS: картодиаграммы

Вообще, следующей по порядку должна была быть карта с электростанциям, но в силу внешних обстоятельств я решил, что картодиаграммы будут актуальнее. Речь идёт вот об этой карте:

После того, как я выложил её в качестве «рекламы» моих будущих постов про QGIS, мне рассказали о том, что сектора на круговых диаграммах должны откладываться от вертикального направления «на север», а вовсе не от горизонтального «на восток». Я попробовал что-то сделать в рамках версии 1.8 с диаграммами, но понял, что ничего пока с ними сделать нельзя.

К счастью, в процессе работы над картой я успел узнать, что модуль построения диаграмм сейчас очень активно перерабатывает Matthias Kuhn. И я решил, что надо ему написать письмо про то, что хорошо бы в настройки диаграмм включить пункт о том, от какого направления откладывать сектора. Он ответил довольно быстро, сообщив, что такая возможность есть в планах, но пока не очень приоритетная, и только €300 могут способствовать тому, что она будет реализована быстро. Я почти отказался от мысли что-то сделать с диаграммами, когда получил новое письмо от Матиаса, в котором он написал, что в итоге и без всяких 300 евро добавил эту «фичу». В итоге она даже попала в список добавлений для версии 2.0, формирование которого заканчивается сегодня (31 марта). Я скачал тестовую версию 1.9 и проверил — «поворот» диаграмм действительно работает! Всё это определённо добавляет энтузиазма по поводу программ с открытым кодом.

Если вам срочно нужны правильно повёрнутые диаграммы, можно поставить себе QGIS версии 1.9. А если не срочно, то просто порадоваться наличию этой возможности в версии 2.0, которая, надеюсь, скоро выйдет.

Пока же — про все остальные подробности создания картодиаграмм в QGIS.

Статистика

На этот раз статистику пришлось запрашивать хитрее, чем просто «скачать файл с сайта». Нужные мне данные я выбирал, работая вот с этой таблицей. После выгрузки в элеткронные таблицы в виде xls-файла эти данные выглядели так:

Приятно, что названия регионов в столбце Area совпадают с названиями в атрибутивной таблице слоя NZ_admin1. Данные о занятости разбиты по различным сферам деятельности, обозначенными буквами от A до S. Для построения диаграмм я решил пересчитать все числа в проценты от общего числа занятых по региону, и все категории где получится (для конкретного региона) менее 5%, объединить в "Прочее". Для этого я сформировал ниже основной статистической таблицы новую таблицу, которую заполнил такими формулами:

=IF(ROUND(100*D8/$C8)<5;0;ROUND(100*D8/$C8))

После этого таблица выглядит вот так:

Если у вас эксель с русскими функциями, то формула выглядит так:

=ЕСЛИ(ОКРУГЛ(100*D8/$C8)<5;0;ОКРУГЛ(100*D8/$C8))

Столбец с названиями регионов я просто скопировал, убрав оттуда слово Region с помощью замены и лишние пробелы вокруг с помощью функции TRIM (СЖПРОБЕЛЫ, если по-русски), а столбец с общим числом занятых по региону — просто скопировал.

В конце каждой строчки таблицы я добавил столбец OTHER с формулой =100-SUM(D27:V27) (по-русски SUM называется СУММ), чтобы посчитать, сколько процентов приходится на «Прочее».

Теперь всю эту таблицу с числами можно скопировать в отдельный файл, вставляя уже не формулы, а значения.

Оказывается, что в некоторых столбцах вообще не нашлось значений больше либо равных 5, и теперь они заполнены сплошь нулями (например, столбец D). Такие столбцы можно выкинуть, чтобы не таскать с собой зря ненужные данные. Чтобы не ошибиться, можно, например, просуммировать каждый столбец и выкинуть те, в которых сумма равна нулю.

После всех удалений у меня остались столбцы:
R_NAME, TOTAL, A, B,C, E, F, G, H, I, K, M, N, O, P, Q, OTHER. Все эти данные я сохраняю в CSV файл и создаю csvt в котором прописан тип "String" для первого столбца и "Integer" для 16 следюущих.

Добавленный в качестве слоя файл NZ_empl_data.csv исмеет в ГИС следюущую атрибутивную таблицу:

Подложка и географическая привязка данных

В качестве подложки нам подойдёт уже использовавшийся нами ранее слой NZ_admin1, а для расположения диаграмм мы будем использовать слой его центроидов NZ_admin1_labels.

Их оба надо ещё раз добавить в ГИС (помимо того, что они есть в группе «Адм.деление». Например, можно создать новую группу «Занятость» и добавить их туда. Для NZ_admin1 в качестве оформления прописываем простой знак с закрашиванием зелёным цветом и тёмно-зелёной обводкой.

После этого окно ГИС выглядит так:

К слою NZ_admin1_labels надо привязать csv файл по совпадению поля R_NAME в csv с полем name в слое. В атрибутивную таблицу слоя добавится куча столбцов из csv-файла:

Напротив далёких тихоокеанских островов стоят значения NULL, но их мы традиционно игнорируем. Получившися в результате связи слой сохраняем как NZ_employed с добавлением на карту, а NZ_admin1_labels и csv-файл удаляем из списка слоёв.

Диаграммы

Версия 1.8 находится в промежуточном состоянии. В ней уже частично реализован новый модуль построения диаграмм, однако можно включить и старый, который назывался «Совмещение». Если вам нужно строить не круговые диаграммы, а гистограммы, и именно в версии 1.8, то придётся воспользоваться старым модулем (он включается через меню «Модули» — «Управление модулями...», после чего в свойствах слоя появляется вкладка «Совмещение»).
Однако для круговых диаграмм в новом модуле, который называется «Диаграммы» уже почти всё работает в версии 1.8. Чтобы попасть в его настройки, надо открыть свойства слоя NZ_employed и выбрать вкладку «Диаграммы»:

Чтобы хоть что-то появилось, естественно, надо поставить галочку «Включить диаграммы». Тип диаграммы — «Круговая», приоритет лучше поставить на максимум: всё-таки сейчас диаграммы — основной элемент нашей карты. Как я понимаю, при низком приоритете какие-то диаграммы могут не показываться, если они неудачно сочетаются с другими элементами карты.

Для круговых диаграмм имеет смысл настроить цвет и толщину обводки. Правда, выставление толщины в ноль почему-то не убирает обводку совсем, так что, возможно, имеет смысл ставить там просто маленькие (меньше 1) значения. Пока я там оставлю ноль.

Важный раздел настроек диаграммы — размер. Чуть позже мы сделаем площадь диаграмм пропорциональной числу занятых, но пока сделаем хотя бы диаграммы фиксированного размера. Здесь есть очень важный нюанс, свяазанный с последующим оформлением карты. Эксперименты показали, что диаграммы нормально переносятся на макет карты только если использовать единицы измерения карты, а не миллиметры. Надеюсь, что в будущих версиях это исправится, но пока мы в версии 1.8, в списке «Единицы» надо выбрать «Единицы карты». В качестве фиксированного размера круговых диаграмм, указываем 50000. Это их диаметр, и, введя 50000, мы попросили рисовать круговые диаграммы диаметром 50км.

В «Позиционировании» можно смело выбирать «Размещение»: «По центру», поскольку сами точки центроидов нам не будут нужны, и их можно закрыть диаграммами.

Дальше надо добавить в список все атрибуты, которые должны быть отражены на круговой диаграмме, выбирая каждый из них в списке и нажимая на кнопочку с плюсом. После добавления всех атрибутов с A по OTHER, окно настроек диаграммы выглядит так:

После нажатия кнопки «ОК» на карте появятся круговые диаграммы:

В целом — неплохо. Правда, можно заметить, что диаграмма для Нельсона на севере Южного острова не нарисовалась, потому что она наложилась бы на диаграмму Мальборо. Но с этим мы попозже разберёмся.

Пока же можно сделать размер круговой диаграммы меняющимся.
Поскольку мы хотим, чтобы пропорционально числу занятых менялась площадь круга, нам надо завести специальное поле в атрибутивной таблице, чтобы можно было задать диаметр диаграммы пропорциональный этому полю. Для этого надо в атрибутивной таблице через калькулятор добавить, например, поле SCALE, которое заполнено выражением sqrt(TOTAL) — квадратный корень из общего числа занятых.

Теперь можно вернуться в настройки диаграммы и там прописать, что размер должен менять пропорционально SCALE. Для удобства составления легенды пропишем, что 500 000 занятых должен соответствовать круг диаметра 200 км. Поскольку кв.корень из 500 000 равен 707.1, мы прописываем соответствующее соответствие в описании масштабирования (значению 707.1 в поле SCALE соответствует диаметр 200000):

После этого диаграммы на карте станут разноразмерными. Правда, диаграмма Окленда настолько большая, что не отрисовывается из-за того, что накладывается на соседние диаграммы:

Чтобы это исправить, можно либо уменьшить общий размер диаграмм, либо подвинуть точку, поверх которой располагается диаграмма Окленда (это лучше проделывать смотря на карту в масштабе 1:7500000, в котором мы хотим её потом отображать, чтобы правильно понимать последствия своих действий).

Чтобы подвинуть точку, нужно открыть слой для редактирования, нажав на верхней панели кнопку , а затем воспользоваться инструментом для перемещения точек с той же панели .

После удачного перемещения точки диаграмма должна появиться, а слой можно сохранить и закрыть режим редактирования:

Перемещая карту, стоит убедиться, что все остальные диаграммы тоже отобразились. Теперь можно заняться внешним видом. Толщину обводки диаграмм в итоге я выставил в 750 (в единицах карты) — это потоньше, чем 0, который, видимо, даёт какую-то толщину обводки «по умолчанию».

Кроме того, каждой из отраслей, отображаемых в круговой диаграмме, надо присвоить цвет. Те, которые присваиваются автоматически, редко бывают удачными. А ещё, на самом деле, существуют рекомендации, относительно того, какую отрасль каким цветом стоит отображать. Чтобы поменять цвет, надо во вкладке «Диаграммы» два раза щёлкнуть по нему в списке полей, по которым строится диаграмма, и в открывшемся окне выбрать/настроить желаемый цвет. Цвета стоит выбирать попроще, а ещё их лучше где-нибудь записывать, потому что их потом придётся вручную прописывать в легенде (автоматического формирования легенд для диаграмм пока нет).

Не уверен, что я выполнил все рекомендации по цветам отраслей, но в итоге карта выглядит у меня примерно так:

Составление легенды

Поскольку стандартного способа получения легенды для диаграмм в QGIS пока нет, я пользуюсь следующим «нестандартным» способом. Я создаю пустой слой (без данных), в котором прописываю нужное мне оформление, чтобы оно правильно отобразилось в легенде.

Для круговых диаграмм нам нужно в легенде отобразить две вещи: во-первых, как размеры кругов соответствуют числу занятых, а во-вторых — соответствие цветов отраслям.

Начнём с первого. Нажмём на панели кнопку для создания нового слоя. В открывшемся окне соглашаемся на то, что слой будет точечным, и что никаких атрибутов кроме числового id нам не нужно:

Этот слой я называю empty и после сохранения он появляется в списке слоёв. Его можно перетащить в группу «Занятость» и там переименовать в «Число занятых», а затем открыть окно его свойств на вкладке «Стиль».

Теоретически, размер значков тоже можно задавать в единицах карты, но лучше так не делать: попробовав это, я чуть не повесил компьютер. Поэтому нам придётся ещё немного посчитать. Если я в легенде хочу отобразить три круга, соответствующие 500 000, 200 000 и 50 000 занятых, то их диаметры в единицах карты должны составить 200000, 126491 и 63245 (получается из 200000 умножением на квадратный корень из числа занятых и делением на 707.1). Поскольку масштаб планируемой карты у нас 1:7500000, диаметр этих кругов на карте будет 0.0267 метра, 0.0168 метра и 0.008 метра, что в миллиметрах даёт, соответственно: 26.7, 16.8 и 8. Именно такие круги я хочу нарисовать как условный знак для несуществующих объектов слоя «Число занятых».

В настройках знака этого слоя я нажимаю кнопку «Изменить...» (с гаечным ключом, слева) и создаю знак из трёх слоёв, каждый из которых — круг, нужного мне диаметра: самый верхний имеет диаметр 8мм:

Для каждого из них можно задать заливку в цвет «моря», чтобы в легенде они казались как бы прозрачными, а ещё их можно сместить по вертикали (заполняя для каждого слоя второе поле в «Смещение по X,Y»). Средний круг надо сместить вниз на (26.7-16.8 )/2= 4.95мм, а самый маленький верхний на (26.7-8)/2 = 9.35мм. В итоге знак выглядит так:

В следующий раз в таком виде мы его уже увидим на макете, и там же добавим поверх него подписи с количеством занятых, а пока займёмся разбивкой по отраслям.

Для этого можно использовать тот же самый слой empty. Его надо добавить ещё раз, переименовать в «Отрасли» и в качестве «Стиля» прописать «Уникальные значения» по полю id. В качестве знака настраиваем круг (например, радиуса 5мм), а затем создаем для каждой отрасли своё уникальное значение со своей меткой и тем цветом, который использовался в диаграммах (и не важно, что в слое нет ни одного объекта). В итоге настройки слоя выглядят так:

В основном окне сделанные настройки тоже видны, хоть в слое и нет объектов:

Теперь можно перейти к оформлению макета. Как обычно, создаём новый и загружаем настройки из шаблона. Добавленная поверх карты легенда, к сожалению, располагается не лучшим образом:

Даже если убрать из неё совсем ненужные пункты, всё равно хотелось бы разделить её на две колонки — одну для отраслей, другую — для числа занятых. Решение очень простое — надо добавить ещё одну легенду, в первой оставить только отрасли, а во второй — только число занятых. Станет несколько лучше:

У числа занятых можно добавить поверх кругов значения 500 000, 200 000 и 50 000 и эта часть легенды будет практически готова, а вот с отраслями придётся ещё повозиться.

Во-первых, между пунктами списка слишком большие промежутки, из-за чего он вылезает сильно вниз. Убрать эти промежутки можно прописав в свойствах легенды в окне слева значение «Отступ знака», равное нулю:

Смена размера шрифта элемента на 10 пунктов даёт уже приемлемый результат, но остаётся ещё проблема слишком длинных строчек:

На самом деле и она тоже решается. Внизу свойств легенды есть неприметный пункт под названием «Максимальная длина строк»:

Название этого пункта переведено неправильно! На самом деле, туда надо вписать символ, который в подписях легенды будет означать переход на новую строчку. Я туда вписал символ вертикальной черты: | . Теперь можно с помощью него разделить слишком длинные подписи на несколько строк. Открывая элементы легенды для редактирования, вписываем в нужные места символ-разделитель:

После уменьшения в параметрах легенды «Высоты знака» до 2мм, получаем легенду, которая уже ничего не перекрывает. Остаётся только сохранить карту как картинку:

Опубликовано у меня в блоге.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments