Jadi orang-orang berbakat telah menemukan cara membuat grafik gaya xkcd di Mathematica , di LaTeX , di Python dan di R sudah.
Bagaimana cara menggunakan MATLAB untuk menghasilkan plot yang terlihat seperti di atas?
Apa yang saya coba
Saya membuat garis wiggly, tetapi saya tidak bisa mendapatkan sumbu wiggly. Satu-satunya solusi yang saya pikirkan adalah menimpa mereka dengan garis-garis yang bergelombang, tetapi saya ingin dapat mengubah sumbu yang sebenarnya. Saya juga tidak dapat mengaktifkan font Humor, kode yang digunakan adalah:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
Untuk garis wiggly, saya bereksperimen dengan menambahkan suara acak kecil dan menghaluskan:
smooth(0.05*randn(size(x)),10)
Tapi aku tidak bisa membuat latar belakang putih muncul di sekitar mereka ketika mereka berpotongan ...
Jawaban:
Saya melihat dua cara untuk mengatasi ini: Cara pertama adalah menambahkan beberapa jitter ke koordinat x / y dari fitur plot. Ini memiliki keuntungan bahwa Anda dapat dengan mudah memodifikasi plot, tetapi Anda harus menggambar sendiri jika Anda ingin memilikinya xkcdyfied (lihat solusi @Rody Oldenhuis ' ). Cara kedua adalah membuat plot non-gugup, dan gunakan
imtransform
untuk menerapkan distorsi acak pada gambar. Ini memiliki keuntungan bahwa Anda dapat menggunakannya dengan plot apa pun, tetapi Anda akan berakhir dengan gambar, bukan plot yang dapat diedit.Saya akan menunjukkan # 2 pertama, dan upaya saya di # 1 di bawah (jika Anda suka # 1 lebih baik, lihat solusi Rody !).
Solusi ini bergantung pada dua fungsi utama: EXPORT_FIG dari pertukaran file untuk mendapatkan tangkapan layar anti-alias, dan IMTRANSFORM untuk mendapatkan transformasi.
Inilah upaya awal saya untuk jittering
sumber
Daripada menerapkan kembali semua fungsi plot yang beragam, saya ingin membuat alat generik yang dapat mengubah plot yang ada menjadi plot gaya xkcd.
Pendekatan ini berarti Anda dapat membuat plot dan menatanya menggunakan fungsi standar MATLAB dan kemudian setelah selesai Anda kemudian dapat membuat kembali plot dalam gaya xkcd sambil mempertahankan keseluruhan gaya plot.
Contohnya
Merencanakan
Bar & Plot
Box & Plot
Bagaimana itu bekerja
Fungsi ini bekerja dengan mengulangi anak-anak dari kapak. Jika anak-anak dari tipe
line
ataupatch
itu sedikit mendistorsi mereka. Jika anak adalah tipehggroup
maka iterates pada sub-anak darihggroup
. Saya memiliki rencana untuk mendukung jenis plot lainnya, sepertiimage
, tetapi tidak jelas apa cara terbaik untuk mendistorsi gambar untuk memiliki gaya xkcd.Akhirnya untuk memastikan bahwa distorsi terlihat seragam (yaitu, garis pendek tidak terdistorsi lebih dari garis panjang), saya mengukur panjang garis dalam piksel dan kemudian mengambil sampel yang sebanding dengan panjangnya. Saya kemudian menambahkan noise ke setiap sampel N yang menghasilkan garis yang memiliki jumlah distorsi yang kurang lebih sama.
Kode
Daripada menempelkan beberapa ratus baris kode, saya hanya akan menautkan ke inti sumbernya . Selain itu kode sumber dan kode untuk menghasilkan contoh-contoh di atas tersedia secara bebas GitHub .
Seperti yang dapat Anda lihat dari contoh, itu belum mengubah sumbu sendiri meskipun saya berencana untuk menerapkan segera setelah saya mencari cara terbaik untuk melakukan itu.
sumber
export_fig
rute, yaitu memformat plot seperti xkcd, dan kemudian mendistorsi gambar.Langkah pertama ... temukan font sistem yang Anda sukai (gunakan fungsi
listfonts
untuk melihat apa yang tersedia) atau instal font yang cocok dengan gaya tulisan tangan dari xkcd . Saya menemukan font TrueType "Humor Sans" dari pengguna ch00f yang disebutkan dalam posting blog ini , dan akan menggunakannya untuk contoh saya selanjutnya.Seperti yang saya lihat, Anda biasanya membutuhkan tiga objek grafik yang dimodifikasi untuk membuat grafik seperti ini: objek sumbu , objek garis , dan objek teks . Anda mungkin juga menginginkan objek anotasi untuk mempermudah, tetapi saya perkirakan untuk saat ini karena mungkin lebih sulit untuk diterapkan daripada tiga objek di atas.
Saya membuat fungsi wrapper yang menciptakan tiga objek, mengesampingkan pengaturan properti tertentu untuk membuatnya lebih seperti xkcd. Satu batasan adalah bahwa grafik baru yang mereka hasilkan tidak akan diperbarui dalam kasus-kasus tertentu (seperti kotak pembatas pada objek teks ketika mengubah ukuran sumbu), tetapi itu dapat dipertanggungjawabkan dengan implementasi berorientasi objek yang lebih lengkap yang melibatkan mewarisi dari pegangan kelas , menggunakan acara dan pendengar , dll. Untuk saat ini, ini adalah implementasi sederhana saya:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
Dan inilah contoh skrip yang menggunakan ini untuk membuat ulang komik di atas. Saya membuat ulang garis dengan menggunakan
ginput
untuk menandai titik dalam plot dengan mouse, menangkapnya, lalu memplotnya seperti yang saya inginkan:Dan (trompet) inilah plot yang dihasilkan !:
sumber
Baiklah kalau begitu, inilah upayaku yang kurang mentah-tapi-masih-belum-belum-cukup-belum:
Hasil:
Hal yang harus dilakukan:
plot2xkcd
sehingga kita dapat mengonversi plot / gambar apa pun menjadi gaya xkcd.sumber