Tak utalentowani ludzie zorientowali się, jak sprawić, by xkcd wykresy styl w Mathematica , w lateks , w Pythonie oraz w badania już.
Jak wykorzystać MATLAB do stworzenia fabuły, która wygląda jak powyższa?
Co próbowałem
Tworzyłem kręte linie, ale nie mogłem uzyskać krętych osi. Jedynym rozwiązaniem, o którym myślałem, było zastąpienie ich krętymi liniami, ale chcę móc zmieniać rzeczywiste osie. Nie mogłem również uruchomić czcionki Humor, użyty bit kodu to:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
W przypadku krętej linii eksperymentowałem z dodaniem małego przypadkowego hałasu i wygładzeniem:
smooth(0.05*randn(size(x)),10)
Ale nie mogłem sprawić, by białe tło pojawiło się wokół nich, kiedy się przecinają ...
Odpowiedzi:
Widzę dwa sposoby rozwiązania tego problemu: Pierwszy sposób polega na dodaniu drgań do współrzędnych x / y elementów wykresu. Ma to tę zaletę, że możesz łatwo modyfikować wykres, ale musisz sam narysować osie, jeśli chcesz je xkcdyfied (patrz rozwiązanie @Rody Oldenhuis ). Drugi sposób polega na utworzeniu fabuły pozbawionej wstrząsów i zastosowaniu
imtransform
do losowego zniekształcenia obrazu. Ma to tę zaletę, że można go używać z dowolną fabułą, ale skończy się to obrazem, a nie edytowalną fabułą.Najpierw pokażę # 2, a moja próba # 1 poniżej (jeśli bardziej ci się podoba # 1, spójrz na rozwiązanie Rody !).
To rozwiązanie opiera się na dwóch kluczowych funkcjach: EXPORT_FIG z wymiany plików, aby uzyskać zrzut ekranu z aliasingiem , oraz IMTRANSFORM, aby uzyskać transformację.
Oto moja pierwsza próba drżenia
źródło
Zamiast ponownie wdrożyć wszystkie różne funkcje drukowania, chciałem stworzyć ogólne narzędzie, które może przekonwertować dowolny istniejący wykres na wykres w stylu xkcd.
Podejście to oznacza, że możesz tworzyć wykresy i nadawać im styl za pomocą standardowych funkcji MATLAB, a po zakończeniu możesz ponownie renderować wykres w stylu xkcd, zachowując ogólny styl wykresu.
Przykłady
Wątek
Bar & Plot
Pudełko i fabuła
Jak to działa
Ta funkcja działa poprzez iterację nad dziećmi osi. Jeśli dzieci są tego typu
line
lubpatch
lekko je zniekształca. Jeśli dziecko jest typuhggroup
, iteruje się w podrzędnychhggroup
. Mam plany obsługi innych typów wykresów, takich jakimage
, ale nie jest jasne, jaki jest najlepszy sposób na zniekształcenie obrazu w stylu xkcd.Wreszcie, aby upewnić się, że zniekształcenia wyglądają jednolicie (tzn. Krótkie linie nie są zniekształcone bardziej niż długie linie), mierzę długość linii w pikselach, a następnie próbkę proporcjonalnie do jej długości. Następnie dodaję szum do każdej N-tej próbki, która wytwarza linie, które mają mniej więcej tyle samo zniekształceń.
Kod
Zamiast wklejać kilkaset wierszy kodu, po prostu odsyłam do istoty źródła . Dodatkowo kod źródłowy i kod do wygenerowania powyższych przykładów są swobodnie dostępne GitHub .
Jak widać z przykładów, nie zniekształca to jeszcze samych osi, chociaż planuję wdrożyć, jak tylko wymyślę najlepszy sposób, aby to zrobić.
źródło
export_fig
trasę, tzn. Najpierw formatuje wykres podobny do xkcd, a następnie zniekształca obraz.Pierwszy krok ... znajdź czcionkę systemową, którą lubisz (użyj tej funkcji,
listfonts
aby zobaczyć, co jest dostępna) lub zainstaluj taką, która pasuje do stylu pisma od xkcd . Znalazłem czcionkę TrueType „Humor Sans” od użytkownika ch00f wspomnianą w tym poście na blogu i wykorzystam ją do moich kolejnych przykładów.Jak ja to widzę, to trzeba zazwyczaj trzy różne zmodyfikowane grafiki obiektów, aby uczynić te rodzaje wykresów: AN osie sprzeciwić , a obiekt liniowy , a obiekt tekstowy . Możesz także chcieć, aby obiekt adnotacji uprościł sprawę, ale zignorowałem to na razie, ponieważ może być trudniej zaimplementować niż powyższe trzy obiekty.
Utworzyłem funkcje opakowania, które utworzyły trzy obiekty, przesłaniając niektóre ustawienia właściwości, aby były bardziej podobne do xkcd. Jednym ograniczeniem jest to, że nowa grafika, którą tworzą, nie będzie aktualizowana w niektórych przypadkach (takich jak obwiednia na obiektach tekstowych podczas zmiany rozmiaru osi), ale można to wyjaśnić za pomocą pełniejszej implementacji obiektowej, która obejmuje dziedziczenie z uchwytu klasa , używanie zdarzeń i detektorów itp. Na razie oto moje prostsze implementacje:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
A oto przykładowy skrypt, który wykorzystuje je do odtworzenia powyższego komiksu. Odtworzyłem linie za pomocą
ginput
myszy, zaznaczając punkty na wykresie, przechwytując je, a następnie wykreślając je tak, jak chciałem:A (trąbki) oto wynikowy spisek !:
źródło
OK, oto moja mniej prymitywna-ale-wciąż-nie-całkiem-jeszcze-próba:
Wynik:
Rzeczy do zrobienia:
plot2xkcd
, abyśmy mogli przekonwertować dowolny wykres / rysunek na styl xkcd.źródło