Так талантливые люди уже поняли, как создавать графики в стиле xkcd в Mathematica , в LaTeX , в Python и в R уже.
Как можно использовать MATLAB для создания сюжета, похожего на приведенный выше?
Что я пробовал
Я создал волнистые линии, но я не мог получить волнистые оси. Единственное решение, о котором я подумал, это переписать их волнистыми линиями, но я хочу иметь возможность менять фактические оси. Я также не мог заставить шрифт Humor работать, бит кода был:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
Для волнистой линии я экспериментировал с добавлением небольшого случайного шума и сглаживанием:
smooth(0.05*randn(size(x)),10)
Но я не мог сделать белый фон, который появляется вокруг них, когда они пересекаются ...
Ответы:
Я вижу два способа решить эту проблему: Первый способ - добавить немного дрожания к координатам x / y объектов графика. Преимущество этого в том, что вы можете легко изменить график, но вы должны нарисовать оси самостоятельно, если вы хотите, чтобы они были xkcdyfied (см. Решение @Rody Oldenhuis ). Второй способ - создать не дрожащий график и использовать его
imtransform
для применения случайного искажения к изображению. Это имеет то преимущество, что вы можете использовать его с любым графиком, но в итоге вы получите изображение, а не редактируемый график.Сначала я покажу # 2, а мою попытку # 1 ниже (если вам нравится # 1 лучше, посмотрите на решение Роди !).
Это решение опирается на две ключевые функции: EXPORT_FIG из обмена файлами для получения сглаженного снимка экрана и IMTRANSFORM для получения преобразования.
Вот моя первая попытка дрожания
источник
Вместо того, чтобы заново реализовывать все различные функции построения графиков, я хотел создать универсальный инструмент, который мог бы конвертировать любой существующий график в график в стиле xkcd.
Этот подход означает, что вы можете создавать графики и стилизовать их, используя стандартные функции MATLAB, а затем, когда вы закончите, вы можете повторно визуализировать график в стиле xkcd, сохраняя при этом общий стиль графика.
Примеры
участок
Бар и участок
Коробка и участок
Как это устроено
Функция работает путем перебора дочерних элементов осей. Если дети имеют тип
line
илиpatch
это немного искажает их. Если дочерний тип имеет тип,hggroup
он перебирает дочерние элементыhggroup
. У меня есть планы по поддержке других типов графиков, таких какimage
, но не ясно, как лучше искажать изображение, чтобы иметь стиль xkcd.Наконец, чтобы убедиться, что искажения выглядят равномерно (то есть короткие линии не искажаются больше, чем длинные линии), я измеряю длину линии в пикселях, а затем увеличиваю выборку пропорционально ее длине. Затем я добавляю шум к каждому N-му семплу, который производит линии с более или менее одинаковым искажением.
Код
Вместо того, чтобы вставлять несколько сотен строк кода, я просто сошлюсь на суть источника . Кроме того, исходный код и код для генерации приведенных выше примеров находятся в свободном доступе GitHub .
Как видно из примеров, они еще не искажают сами оси, хотя я планирую реализовать, как только найду лучший способ сделать это.
источник
export_fig
маршрут, то есть сначала форматирует сюжет, похожий на xkcd, а затем искажает картинку.Первый шаг ... найдите системный шрифт, который вам нравится (используйте функцию,
listfonts
чтобы увидеть, что доступно) или установите тот, который соответствует стилю рукописного ввода из xkcd . Я нашел шрифт TrueType "Humor Sans" от пользователя ch00f, упомянутый в этом сообщении в блоге , и буду использовать его для моих последующих примеров.На мой взгляд, для создания таких графов вам обычно понадобятся три различных измененных графических объекта: объект оси , линейный объект и текстовый объект . Возможно, вы также захотите, чтобы объект аннотации упростил задачу, но я упустил это из виду, поскольку его реализация может быть более сложной, чем три вышеуказанных объекта.
Я создал функции-оболочки, которые создали три объекта, переопределяя некоторые настройки свойств, чтобы сделать их более похожими на xkcd. Одним из ограничений является то, что новая графика, которую они производят, не будет обновляться в определенных случаях (например, ограничивающие рамки для текстовых объектов при изменении размера осей), но это может быть учтено в более полной объектно-ориентированной реализации, которая включает наследование от дескриптора. класс , использование событий, слушателей и т. д. На данный момент, вот мои простые реализации:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
А вот пример сценария, который использует их для воссоздания вышеупомянутого комикса. Я воссоздал линии, используя,
ginput
чтобы пометить точки на графике с помощью мыши, захватив их, затем нарисовав их так, как я хотел:И (трубы) вот и получился сюжет!
источник
Хорошо, вот моя менее грубая, но все еще не совсем там еще попытка:
Результат:
Дела, которые необходимо сделать:
plot2xkcd
чтобы мы могли преобразовать любой сюжет / рисунок в стиль xkcd.источник