Donc , les gens talentueux ont compris comment faire xkcd graphiques de style dans Mathematica , en LATEX , en Python et en R déjà.
Comment peut-on utiliser MATLAB pour produire un tracé qui ressemble à celui ci-dessus?
Ce que j'ai essayé
J'ai créé des lignes ondulées, mais je n'ai pas pu obtenir d'axes ondulés. La seule solution à laquelle j'ai pensé était de les écraser avec des lignes ondulées, mais je veux pouvoir changer les axes réels. Je ne pouvais pas non plus faire fonctionner la police Humor, le bit de code utilisé était:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
Pour la ligne ondulée, j'ai expérimenté l'ajout d'un petit bruit aléatoire et le lissage:
smooth(0.05*randn(size(x)),10)
Mais je n'ai pas pu faire apparaître le fond blanc autour d'eux lorsqu'ils se croisent ...
Réponses:
Je vois deux façons de résoudre ce problème: La première consiste à ajouter un peu de gigue aux coordonnées x / y des caractéristiques du tracé. Cela a l'avantage que vous pouvez facilement modifier un tracé, mais vous devez dessiner les axes vous-même si vous souhaitez les avoir xkcdyfied (voir la solution de @Rody Oldenhuis ). La deuxième façon consiste à créer un tracé non instable et à utiliser
imtransform
pour appliquer une distorsion aléatoire à l'image. Cela a l'avantage que vous pouvez l'utiliser avec n'importe quel tracé, mais vous vous retrouverez avec une image, pas un tracé modifiable.Je montrerai le # 2 en premier, et ma tentative de # 1 ci-dessous (si vous préférez le # 1, regardez la solution de Rody !).
Cette solution repose sur deux fonctions clés: EXPORT_FIG à partir de l'échange de fichiers pour obtenir une capture d'écran anticrénelée et IMTRANSFORM pour obtenir une transformation.
Voici ma première tentative de trembler
la source
Plutôt que de réimplémenter toutes les différentes fonctions de traçage, j'ai voulu créer un outil générique qui pourrait convertir n'importe quel tracé existant en un tracé de style xkcd.
Cette approche signifie que vous pouvez créer des tracés et les styliser à l'aide des fonctions MATLAB standard , puis lorsque vous avez terminé, vous pouvez ensuite restituer le tracé dans un style xkcd tout en préservant le style général du tracé.
Exemples
Terrain
Bar & Terrain
Box & Plot
Comment ça fonctionne
La fonction fonctionne en itérant sur les enfants d'un axe. Si les enfants sont de type
line
oupatch
ça les déforme légèrement. Si l'enfant est de type,hggroup
il répète les sous-enfants duhggroup
. J'ai l'intention de prendre en charge d'autres types de tracés, tels queimage
, mais il n'est pas clair quel est le meilleur moyen de déformer l'image pour avoir un style xkcd.Enfin, pour m'assurer que les distorsions semblent uniformes (c'est-à-dire que les lignes courtes ne sont pas distordues plus que les lignes longues), je mesure la longueur de la ligne en pixels, puis jusqu'à l'échantillon proportionnel à sa longueur. J'ajoute ensuite du bruit à chaque Nième échantillon qui produit des lignes qui ont plus ou moins la même distorsion.
Le code
Plutôt que de coller plusieurs centaines de lignes de code, je vais simplement créer un lien vers un résumé de la source . De plus, le code source et le code pour générer les exemples ci-dessus sont disponibles gratuitement GitHub .
Comme vous pouvez le voir dans les exemples, cela ne déforme pas encore les axes eux-mêmes, même si je prévois de les mettre en œuvre dès que je trouverai la meilleure façon de le faire.
la source
export_fig
itinéraire, c'est-à-dire qu'il formate d'abord l'intrigue comme xkcd, puis déforme l'image.La première étape ... trouvez une police système que vous aimez (utilisez la fonction
listfonts
pour voir ce qui est disponible) ou installez-en une qui correspond au style d'écriture manuscrite de xkcd . J'ai trouvé une police TrueType "Humour Sans" de l'utilisateur ch00f mentionné dans cet article de blog , et je l'utiliserai pour mes exemples suivants.Selon moi, vous aurez généralement besoin de trois objets graphiques modifiés différents pour créer ces sortes de graphiques: un objet axes , un objet ligne et un objet texte . Vous pouvez également souhaiter un objet d'annotation pour faciliter les choses, mais je l'ai prévenu pour l'instant car il pourrait être plus difficile à implémenter que les trois objets ci-dessus.
J'ai créé des fonctions d'encapsuleur qui ont créé les trois objets, en remplaçant certains paramètres de propriété pour les rendre plus similaires à xkcd. Une limitation est que les nouveaux graphiques qu'ils produisent ne seront pas mis à jour dans certains cas (comme les cadres de délimitation sur les objets texte lors du redimensionnement des axes), mais cela pourrait être pris en compte avec une implémentation orientée objet plus complète qui implique l'héritage de la poignée classe , en utilisant des événements et des écouteurs , etc. Pour l'instant, voici mes implémentations plus simples:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
Et voici un exemple de script qui les utilise pour recréer la bande dessinée ci-dessus. J'ai recréé les lignes en utilisant
ginput
pour marquer des points dans l'intrigue avec la souris, en les capturant, puis en les traçant comme je le voulais:Et (trompettes) voici l'intrigue qui en résulte!:
la source
OK alors, voici ma tentative moins brute mais pas encore tout à fait là-bas:
Résultat:
Choses à faire:
plot2xkcd
afin que nous puissions convertir n'importe quel tracé / figure au style xkcd.la source