суббота, 12 июля 2014 г.

Как сделать вторичную круговую диаграмму в LibreOffice Calc

Эта статья является продолжением предыдущей и рассказывает о построении вторичной круговой диаграммы в LibreOffice Calc. Как и в предыдущей статье, я не буду останавливаться на математической модели. В статье я освещаю два способа создания вторичных круговых диаграмм: простое рисование линий и автоматическая их настройка при помощи диаграммы XY. Возможности макросов при этом не будут использоваться.

Также как и со вторичными гистограммами, в пакете LibreOffice до сих пор нет инструмента автоматического создания таких диаграмм. Поэтому, нам нужно создавать их из разных объектов, объединяя конечный результат в одну группу. Однако, это не значит, что невозможно создать удобную для работы диаграмму. Как было показано в прошлой статье, есть способ создавать их быстро и качественно. Чтобы не загружать статью математическими разъяснениями, я их упущу здесь, раскрыв в отдельной статье, для тех кому это действительно интересно. Так же как и в прошлый раз, я прикрепляю файл с примером, чтобы вы могли при желании самостоятельно разобрать структуру формул.
Итак, по порядку что будем разбирать:
  • Вторичная гистограмма с линиями методом рисования;
  • Автоматическая настройка линий при создании вторичной круговой диаграммы от основной гистограммы;
  • Автоматическая настройка линий при создании вторичной круговой диаграммы от основной круговой диаграммы.
Так как в данной статье я не уделяю внимания основам построения круговой диаграммы и гистограммы, советую сначала прочитать статьи Построение Гистограммы и Построение Диаграммы. Если после статей останутся вопросы, не стесняйтесь, задавайте их в комментариях.

Простое рисование линий для вторичной круговой диаграммы

Самый простой способ создать вторичную круговую диаграмму — это создать основную диаграмму, затем вторичную диаграмму, в нашем случае круговую, и нарисовать соединительные линии. Этот способ требует минимум знаний и навыков в построении диаграмм. Он был описан в предыдущей статье, но здесь я его кратко повторю.
Для примера возьмём статистику инвестиций в возобновляемые источники энергии (далее - ВИЭ) в развивающихся странах за 2012 год. Выборка сделана из базы данных The World Bank Private Participation in Infrastructure Database (по условиям лицензии). Таблицы будут выглядеть следующим образом:

Таблица для построения вторичной круговой диаграммы в LibreOffice Calc

Для справки, в правой таблице представлены различные виды технологий солнечных электростанций. PV — photovoltaic — стандартные солнечные панели; CPV — concentrated photovoltaic — то же, только с линзами в качестве первого слоя; CSP — concentrated solar power — электростанции башенного типа, состоящие из зеркал, которые концентрируют солнечный свет в одной точке на башне, нагревая специальный раствор соли для последующей выработки электроэнергии.
Построим наши диаграммы. Для основной диаграммы выделим диапазон A3:B7 и запустим мастер диаграмм. На первом шаге выберем тип «Круговая» и подтип «Обычная». Переходим сразу на четвёртый шаг: заполняем заголовок диаграммы и выбираем в разделе «Показать легенду» «Снизу».
Не выходя из редактора диаграмм, сожмём и сместим вправо «Область построения диаграммы», для этого выделяем её и сжимаем по диагонали, потянув за правый нижний квадратик, а затем перетаскиваем на нужное место. Перемещаем легенду под диаграмму и, растягивая и сжимая её, придаём ей нужный вид. Если легенда не помещается, сожмите ещё немного «Область построения диаграммы». Для нашего случая нужно развернуть диаграмму на 180 градусов. Выделяем «Ряды данных», жмём на них правой кнопкой мыши и в контекстном меню выбираем «Формат рядов данных». На вкладке «Параметры» в разделе «Начальный угол» выставляем 270 градусов (исходные 90 + 180), подтверждаем выбор. С этой диаграммой всё. Выглядит она вот так:

Заготовка для построения вторичной круговой диаграммы в LibreOffice Calc

Сделаем вторичную круговую диаграмму. Для этого выделим диапазон D3:E5 и запустим мастер диаграмм. Строим мы её так же, за исключением того, что нам не нужен заголовок, поэтому мы его не вводим.
После построения в мастере диаграмм, не выходя из редактора, настроим её. Нам нужно сделать прозрачной «Область диаграммы». Для этого нажмём на неё правой кнопкой мыши и в контекстном меню выберем «Формат области диаграммы...». На вкладке «Области» в разделе «Заполнить» в выпадающем меню выберем «Нет» и подтвердим свой выбор. Затем выйдем из редактора, щёлкнув мышкой за границами диаграммы, и, выделив диаграмму, сожмём её по горизонтали примерно до пяти сантиметров. Расположим её на фоне первой, выровняв на глаз по правой и верхней границам.
Заготовка для построения вторичной круговой диаграммы в LibreOffice Calc

Как видите, у нас остались только линии. Для того, чтобы их нарисовать откроем панель рисования (Главное меню → Вид → Панели инструментов → Рисование). На панели инструментов «Рисование» второй элемент слева «Линия». Нажимаем его и проводим прямую от верхнего края жёлтой области основной диаграммы к верхнему краю вторичной. То же самое делаем для нижнего края жёлтой области основной диаграммы, только ведём линию к нижней части вторичной диаграммы. С первого раза, бывает, тяжело нарисовать линию точно. Чтобы поправить расположение конца линии можно увеличить масштаб (нажмите клавишу Ctrl и крутите колёсико вперёд). Нажав на линию правой кнопкой мыши и выбрав в контекстном меню пункт «Линия...», можно настроить её вид. Когда закончим настраивать линии, мы можем сгруппировать все элементы, чтобы было удобно перетаскивать и копировать диаграмму целиком. Для этого выделим все элементы при нажатой кнопке Shift и, нажав правой кнопкой мыши на выделенном, в контекстном меню выберем «Сгруппировать → Сгруппировать».
Я дополнительно перекрасил ряды данных, чтобы диаграмма смотрелась более привлекательно.
В итоге должна получиться подобная диаграмма.

Вторичная круговая диаграмма в LibreOffice Calc

Вторичная круговая диаграмма от гистограммы выполняется аналогично.
Как видно, такой способ построения хорош, только если вы точно уверены, что информация ваша не будет меняться. Однако, на практике данные часто меняются. И маета с линиями начинается по новой. Чтобы этого избежать, а также для удобства создания шаблонов, я так же, как и в предыдущей статье предлагаю иной ход действий.

Автоматическая настройка линий при создании вторичной круговой диаграммы от гистограммы

Для того, чтобы показать автоматическую подстройку линий в LibreOffice Calc при создании вторичной круговой диаграммы будем использовать первый пример. Единственное, думаю будет лучше, если мы отсортируем данные второго столбца по убыванию. Для линий я предлагаю использовать дополнительно диаграмму XY. Она будет изображать координатную сетку с нулём в верхнем левом углу, то есть по оси X у нас будут положительные числа, а по оси Y только отрицательные. Если нам нужно будет сроить сложную диаграмму, то линии сетки диаграммы можно использовать для визуального самоконтроля. Для того, чтобы можно было автоматически рассчитывать положение линий сделаем такую таблицу:

Вспомогательная таблица для построения вторичной круговой диаграммы в LibreOffice Calc

В ячейки столбца «Размер области диаграммы» вносим размер областей диаграмм. «Позиция относительно сетки» это позиция относительно нуля на координатной сетке, это нужно, чтобы ссылаться на позиции диаграмм в формулах. В нашем случае, только D12 (смещение по горизонтали для вторичной круговой диаграммы) отличается от нуля, потому что пример простой. Но в сложных композициях элементов они могут заполняться все. «Позиция внутри области» диаграммы это смещение «Области построения» по отношению к опорной точке. Я использую опорную точку по умолчанию — это левый верхний угол. По моему, это удобно для расчётов. «Размер области построения» также нужен для привязки к сетке. Все эти данные можно узнать щёлкнув на соответствующий элемент и в контекстном меню выбрав пункт «Положение и размер...».

Скриншот окна Положение и размер в LibreOffice Calc

Значения следующих столбцов можно рассчитать по формулам:
  • координата X центра окружности (G12) =D12+E12+F12/2;
  • координата Y центра окружности (G13) =-(D13+E13+F13/2);
  • радиус (H12) =F12/2;
  • длинна стороны «с» верхнего воображаемого треугольника (I10) =SQRT((N10-G12)^2+(N11-G13)^2);
  • длинна стороны «c» нижнего воображаемого треугольника (I12) =SQRT((N12-G12)^2+(N13-G13)^2);
  • длинна стороны «b» верхнего воображаемого треугольника (J10) =SQRT(I10^2-H10^2);
  • длинна стороны «b» нижнего воображаемого треугольника (J12) =SQRT(I12^2-H12^2;
  • угол «А» верхнего воображаемого треугольника (противолежащий радиусу) (K10) =DEGREES(ASIN(H12/I10));
  • угол «А» нижнего воображаемого треугольника (противолежащий радиусу) (K12) =DEGREES(ASIN(H12/I12));
  • угол относительно горизонтали для стороны «с» верхнего воображаемого треугольника (L10) =DEGREES(ACOS((G12-N10)/I10));
  • угол относительно горизонтали для стороны «с» нижнего воображаемого треугольника (L12) =DEGREES(ACOS((G12-N12)/I12).
Оставшиеся два столбца будут задавать координаты линий. При этом нужно учитывать, что для первого столбца значения на гистограмме выстраиваются в обратном порядке. Также, если вы используете перемещение рядов данных на третьем шаге мастера диаграммы, то значения для оси Y будут высчитываться по иному, хотя принцип останется тот же.
Координаты можно вычислить следующим образом:
  • координата X для начала верхней касательной (N10) =D10+E10+F10*3/4;
  • координата X для начала нижней касательной (N12) =G5+H5+I5*1/4;
  • координата Y для начала верхней касательной (N11) =-(SUM(B5:B6)/SUM(B3:B6)*F11+D11+E11);
  • координата Y для начала нижней касательной (N13) =-(SUM(B4:B6)/SUM(B3:B6)*F11+D11+E11);
  • координата X для конца верхней касательной (O10) =IF(N11>G13;N10+J10*COS(RADIANS(L10-K10));N10+J10*COS(RADIANS(L10-K10)));
  • координата X для конца нижней касательной (O12) =IF(N13>G13;N12+J12*COS(RADIANS(-L12-K12));N12+J12*COS(RADIANS(L12-K12)));
  • координата Y для конца верхней касательной (O11) =IF(N11>G13;N11+J10*SIN(RADIANS(K10-L10));N11-J10*SIN(RADIANS(L10-K10)));
  • координата Y для конца нижней касательной (O13) =IF(N13>G13;N13+J12*SIN(RADIANS(-L12-K12));N13+J12*SIN(RADIANS(L12-K12))).
Построим теперь диаграммы. Как и в предыдущем случае, первая будет построена на диапазоне A3:B6, а вторая на диапазоне D3:E5. Строятся они так же, как было описано выше, поэтому я не буду останавливаться на этом. Третьей диаграммой у нас будет диаграмма для линий. Для её построения выделим диапазон N10:O13 и запустим мастер диаграмм. На первом шаге выберем тип «Диаграмма XY» и подтип «Только линии». На втором шаге отмечаем, что данные в строках. На третьем мы видим, что мастер определил три ряда данных, поправим его. Удаляем один ряд данных. Для первого ряда данных, для нашего случая, значения диапазона для X равны N10:O10, а для для Y — N11:O11. Для второго ряда данных N12:O12 и N13:O13 соответственно. На четвёртом шаге нам нужно снять галочки с «Показать легенду» и в разделе «Отображать сетку» «ось Y». Нажмём кнопку «Готово».
Не выходя из редактора диаграмм, нажимаем правой кнопкой мыши на «Области диаграммы» и в контекстном меню выбираем «Формат области диаграммы...». На вкладке «Области» в разделе «Заполнить» в выпадающем меню выбираем «Нет» и подтверждаем выбор. Затем нажимаем на ось X правой кнопкой мыши и в контекстном меню выбираем «Формат оси..». На вкладке «Масштабирование» выставляем для «Минимум» 0, а для «Максимум» 16. То же самое делаем для оси Y, но значения будут -9 и 0 соответственно. Если вы будете делать диаграмму больше, то вам могут понадобиться другие значения. В общем случае, значения должны покрывать всё поле, где будут располагаться диаграммы, а единица их равна одному сантиметру. Теперь мы можем удалить оси (выделить ось и нажать «Del»). По умолчанию линии диаграммы толстые и цветные. Для нашего случая, я думаю, нужно их изменить. Нажмём на линию правой кнопкой мыши и в контекстном меню выберем «Формат точек данных...». На вкладке «Линии» укажем необходимый цвет, вид и толщину линии. Теперь нам нужно обесцветить линию, окружающую «область построения». А затем растянуть «область построения» так, чтобы она занимала всю видимую часть диаграммы. Снимем выделение.
Следующим шагом нам нужно совместить диаграммы, при этом чем точнее мы совместим, тем меньше будут погрешности при построении линий. В нашем примере это можно сделать просто. Площадь основной диаграммы и диаграммы с линиями равны, поэтому мы нажимаем на любой из них (ту которую нам удобнее) правой кнопкой мыши и в контекстном меню выбираем пункт «Положение и размер...». Нас интересуют значения полей на вкладке «Положение и размер» в разделе «Положение»: «Положение X» и «Положение Y». Запоминаем их и переносим во вторую диаграмму. Для вторичной круговой диаграммы «Положение Y» равно положению основной, а «Положение X» = «Положение X» основной диаграммы + размер основной диаграммы - ширина вторичной диаграммы. В моём случае получилось 11.
При изменении положения диаграмм не забываем вносить соответствующие изменения в служебную таблицу.
После того, как мы совместили диаграммы, мы можем их сгруппировать. Теперь мы имеем группу диаграмм, которая выглядит так, как нам хотелось:

Вторичная круговая диаграмма от гистограммы в LibreOffice Calc

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

Автоматическая настройка линий при создании вторичной круговой диаграммы от основной круговой диаграммы

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


Рассмотрим построение новых столбцов.
  • Координата X для центра окружности основной диаграммы (G10) =D10+E10+F10/2;
  • Координата Y для центра окружности основной диаграммы (G11) =-(D11+E11+F11/2);
  • Радиус равен половине области построения (H10) =F10/2;
  • Угол поворота по умолчанию равен 90 градусам, его имеет смысл изменить только в том случае, если вы будете поворачивать диаграмму, узнать его можно в поле рядом с циферблатом для поворота диаграммы в параметрах ряда данных.
Углы поворота радиуса, ограничивающие элемент с двух сторон, можно найти следующим способом:
  • Первый угол (N10) =SUM(B2:B4)/SUM(B3:B6)*360+I10;
  • Второй угол (N11) =SUM(B3)/SUM(B3:B6)*360+I10;
  • X1 для первой линии (P10) =IF(M3>450;G3+J3;J3+K3*COS(RADIANS(M3)));
  • Y1 для первой линии (P11) =IF(M3>450;-(G4+H4);J4+K3*SIN(RADIANS(M3)));
  • X1 для второй линии (P12) =IF(M4<270;G3+J3;J3+K3*COS(RADIANS(M4)));
  • Y2 для второй линии (P13) =IF(M4<270;-(G4+H4+I4);J4+K3*SIN(RADIANS(M4))).
В остальном она строится так же, как и предыдущая.
Заполнив таблицу, мы можем приступать к построениям.
Диаграммы строятся аналогично предыдущим примерам. Основная — на диапазоне А3:B6, вторичная на D3:E5, а вспомогательная на P10:Q13. Не забываем обратить внимание на второй и третий шаг вспомогательной диаграммы.
После построения нам нужно совместить диаграммы. Опять же это ничем не отличается от предыдущего случая. Покончив с диаграммами, вносим поправки в значения положения элементов в служебную таблицу при необходимости и объединяем диаграммы в одну группу.
Как и в предыдущих случаях я перекрасил элементы диаграмм для придания привлекательности.
В итоге у меня получилось вот что:


Как видно из примеров, ничего особо сложного в построении диаграмм такого типа нет. Нужно лишь продумать заранее, что мы хотим видеть в итоге, и последовательно пройти все этапы. Кроме того, несовершенство LibreOffice, по моему, только увеличивает возможности применения наших творческих способностей.
Ещё раз даю ссылку на файл с примером.
Напоминаю, что математическую модель привязки объектов диаграммы к сетке объясню в отдельном уроке.
Если у вас остались вопросы или есть предложения, вы можете их озвучить в комментариях.

Дополнительная литература и источники