Ранним утром понедельника, я заприметил интересный вопрос опубликованный на Mathematica Stack Exchange с совершенно невинным названием: «Графики в стиле xkcd (xkcd-style graphs)». Зная популярность онлайн-комиксов xkcd Ренделла Мунро, я ожидал нечто большего чем обычные 10 голосов и несколько закладок. Если бы я знал! Спонтанный вирусный эффект сложно предсказать и уж если ты обнаружил один такой, за его развитием и ростом популярности интересно наблюдать. Всего за два дня вопрос набрал 120000 просмотров, почти 300 голосов и 200 закладок (прим. пер.: цифры обновлены); создал резонанс в других обществах StackExchange (прим. пер.: например, «Создание xkcd-графиков в TeX», «R», «Matlab»); образовал маленькое торнадо в Twitter и обсуждался на Hacker News и reddit.
Для удобства я приведу вопрос Аматея и пример изображения:
I received an email to which I wanted to respond with a xkcd-style graph, but I couldn’t manage it. Everything I drew looked perfect, and I don’t have enough command over Plot Legends to have these pieces of text floating around. Any tips on how one can create xkcd-style graphs? Where things look hand-drawn and imprecise. I guess drawing weird curves must be especially hard in Mathematica.
Я получил письмо, на которое я хочу ответить в стиле графиков на xkcd, но у меня ничего не выходит. Всё что я рисую смотрит превосходно, но у меня нету достаточного контроля над Plot Legends, чтобы эти куски текста, плавали вокруг. Посоветуйте, как можно создать xkcd- стиль графики? Где все выглядит рисованным и неточным. Мне кажется что рисовать странные линии должно бы особенно трудно в Mathematica.
Удивительно, но оказалось что «рисовать странные линии» в Mathematica просто и весело. Mathematica Stack Exchange это активно растущее сообщество В&О организованное только за счёт усилий наших пользователей. Я был доволен увидев насколько оно привлекло внимание интригующим вопросом и красивыми, изобретательными ответами. Лучше пройти по ссылке и самому ознакомиться с ответами. Тут же будет обсуждение только одного ответ, авторством Саймона Вудса, которое можно применять ко всем типам графиков в Mathematica и даже к изображениям.
Саймон начал всё с объявления стиля шрифта, который бы имитировал юмористическое представление комиксов xkcd.
Следующим шагом надо сделать функцию, которая заменяет наш текст на схожий с xkcd. Учитывая точки на графике и смещение для текстовых меток, функция использует сплайны чтобы соединить точки с меткой гладкой кривой.
Теперь надо задать правила, которые будучи указаны для графического объекта, делают текст в стилем xkcd и заменяют линии на более толстые. Заметьте, как шесть строчек кода меняют линии в графиках толстыми чёрными линиями, нарисованными поверх чуть более широких белых. Это необходимо для получения заметного зазора, когда одна кривая пересекает другую — особенная характеристика рисованных, мультяшных диаграмм.
Следующая функция применяет эти правила и делает оси координат толще.
Пришло время для обработки изображений, наиболее передового и привлекательного элемента ответа Саймон. Почему? — такой подход позволяет работать независимо от остального кода с обычными изображениями, а не только с графиками Mathematica. Позже вы увидите что это позволяет менять стиль для любой научной диаграммы! Результат функции: слегка исказить идеальные линии графика для имитации неравномерно нарисованной от руки фигуры.
Сначала функция растеризует график Mathematica, фактически превращая его в изображения. Следующим шагом она создаёт два дополнительных произвольных изображения и сглаживает их с помощью свёртки с Гауссовым ядром. Произвольные, но гладко изменяющиеся пиксели этого изображения указывают смещение пикселей в оригинальном изображение. Трансформация изображения происходит с помощью функции ImageTransformation. А самая последняя функция объединяет использования xkcd-стиля с искажением изображения.
Давайте посмотрим на наше решение применимое к графиках. Вот некоторые примеры Саймона:
xkcdConvert можно применять для разных типов графиков в Mathematica. Заметьте, что xkcdConvert может быть использовано как к функции, так и к самому графику. Это значит, что вы можете сначала построить 3D график, подкорректировать его мышкой и лупой; и уже потом применить xkcdConvert для результата.
Я признаюсь, несколько лет назад, Джон МакЛун написал другую автоматизацию в стиле xkcd и назвал её «Самоописание (Self-Description)». Там он описал как можно создать самоссылающийся график и разбавить его цветами. Теперь мы можем дать ему некоторую встряску для создания эффекта ручной прорисовки:
Мне кажется что вид аутентичный. Прекрасная работа, Саймон! Но всё равно, обратите внимание на оригинальное обсуждение. Как вы уже видели, xkcdConvert можно использовать к изображениям, но мы так не сможем заменить шрифты. Но и без этого результат достаточно реалистичный.
У Ю-Сунг Чанга появилась прекрасная идея в создании CDF-приложения, которому только дай ссылку на изображение для создание его в xkcd-стиле. Правда мы использовали слегка другую, отличную от Саймона идею. В нашем случае, случайная BSplineFunction используется для смещения пикселей. Это позволит настраивать амплитуду и частоту смещения.
Как видите, это удивительно, как можно серьёзный продукт для профессионалов, используемый в производстве и исследованиях, использовать для эффективного решения очень необычных проблем связанных с искусством, оригинальным
Ответ заключается в интеграции. Mathematica поставляется с широким спектром технологий и алгоритмов, доступными из коробки. Они разработаны в тщательно согласованным образом, так что пользователи могут гибко сочетать их, как части LEGO и построить универсальное приложение. Давайте посмотрим, как много областей мы использовали: типографика, графики, правила и закономерности, сплайны, обработка изображений, импорт и экспорт, веб-операции, динамическая интерактивность, развертывание и CDF. Поэтому, я надеюсь, что в следующий раз, когда наши читатели откроют Mathematica чтобы решить уравнение или построить график, они будут помнить, что почти безграничные возможности для импровизации могут завести их далеко за пределы этой рутинной задачи.
Автор: m0nhawk