So haben talentierte Leute bereits herausgefunden, wie man in Mathematica , in LaTeX , in Python und in R Diagramme im xkcd- Stil erstellt .
Wie kann man mit MATLAB ein Diagramm erstellen, das wie oben aussieht?
Was ich versucht habe
Ich habe wackelige Linien erstellt, aber ich konnte keine wackeligen Äxte bekommen. Die einzige Lösung, an die ich dachte, war, sie mit wackeligen Linien zu überschreiben, aber ich möchte in der Lage sein, die tatsächlichen Achsen zu ändern. Ich konnte auch die Humor-Schriftart nicht zum Laufen bringen, das verwendete Codebit war:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
Für die wackelige Linie experimentierte ich mit dem Hinzufügen eines kleinen zufälligen Rauschens und dem Glätten:
smooth(0.05*randn(size(x)),10)
Aber ich konnte den weißen Hintergrund nicht so gestalten, dass er um sie herum erscheint, wenn sie sich schneiden ...
Antworten:
Ich sehe zwei Möglichkeiten, um dies zu lösen: Die erste Möglichkeit besteht darin, den x / y-Koordinaten der Plot-Features etwas Jitter hinzuzufügen. Dies hat den Vorteil, dass Sie ein Diagramm leicht ändern können, aber Sie müssen die Achsen selbst zeichnen, wenn Sie sie xkcdyfied haben möchten (siehe die Lösung von @Rody Oldenhuis ). Die zweite Möglichkeit besteht darin, ein nicht nervöses Diagramm zu erstellen und zu verwenden
imtransform
eine zufällige Verzerrung auf das Bild anzuwenden. Dies hat den Vorteil, dass Sie es mit jedem Plot verwenden können, aber Sie erhalten ein Bild, kein bearbeitbares Plot.Ich werde zuerst # 2 und unten meinen Versuch auf # 1 zeigen (wenn Sie # 1 besser mögen, schauen Sie sich Rodys Lösung an !).
Diese Lösung basiert auf zwei Schlüsselfunktionen: EXPORT_FIG aus dem Dateiaustausch, um einen Anti-Alias-Screenshot zu erhalten, und IMTRANSFORM , um eine Transformation zu erhalten.
Hier ist mein erster Versuch zu zittern
quelle
Anstatt alle verschiedenen Plotfunktionen erneut zu implementieren, wollte ich ein generisches Tool erstellen, mit dem jedes vorhandene Plot in ein xkcd-Plot konvertiert werden kann.
Dieser Ansatz bedeutet, dass Sie Diagramme erstellen und mit den Standardfunktionen von MATLAB formatieren können. Wenn Sie fertig sind, können Sie das Diagramm in einem xkcd-Stil neu rendern und dabei den Gesamtstil des Diagramms beibehalten.
Beispiele
Handlung
Bar & Grundstück
Box-Plot
Wie es funktioniert
Die Funktion iteriert über die untergeordneten Elemente einer Achse. Wenn die Kinder vom Typ sind
line
oderpatch
es sie leicht verzerrt. Wenn das Kind vom Typ isthggroup
, iteriert es auf den Unterkindern deshggroup
. Ich habe Pläne, andere Plottypen zu unterstützen, z. B.image
, aber es ist nicht klar, wie das Bild am besten verzerrt werden kann, um einen xkcd-Stil zu erhalten.Um sicherzustellen, dass die Verzerrungen gleichmäßig aussehen (dh kurze Linien werden nicht mehr als lange Linien verzerrt), messe ich die Linienlänge in Pixel und setze dann das Sample proportional zu seiner Länge auf. Ich füge dann jedem N-ten Sample Rauschen hinzu, das Linien erzeugt, die mehr oder weniger die gleiche Verzerrung aufweisen.
Der Code
Anstatt mehrere hundert Codezeilen einzufügen, verweise ich einfach auf einen Kern der Quelle . Zusätzlich sind der Quellcode und der Code zum Generieren der obigen Beispiele frei verfügbarer GitHub .
Wie Sie den Beispielen entnehmen können, werden die Achsen selbst noch nicht verzerrt, obwohl ich beabsichtige, sie zu implementieren, sobald ich herausgefunden habe, wie dies am besten funktioniert.
quelle
export_fig
bearbeitet, der die Route implementiert , dh zuerst den Plot xkcd-ähnlich formatiert und dann das Bild verzerrt.Der erste Schritt ... finden Sie eine Systemschriftart, die Ihnen gefällt (verwenden Sie die Funktion, um
listfonts
zu sehen, was verfügbar ist) oder installieren Sie eine, die dem Handschriftstil von xkcd entspricht . Ich habe eine TrueType-Schriftart "Humor Sans" von Benutzer ch00f gefunden, die in diesem Blog-Beitrag erwähnt wurde , und werde sie für meine nachfolgenden Beispiele verwenden.Aus meiner Sicht benötigen Sie im Allgemeinen drei verschiedene modifizierte Grafikobjekte, um diese Art von Diagrammen zu erstellen: ein Achsenobjekt , ein Linienobjekt und ein Textobjekt . Vielleicht möchten Sie auch ein Anmerkungsobjekt , um die Dinge einfacher zu machen, aber ich habe darauf verzichtet, da es schwieriger zu implementieren sein könnte als die oben genannten drei Objekte.
Ich habe Wrapper-Funktionen erstellt, mit denen die drei Objekte erstellt wurden, wobei bestimmte Eigenschafteneinstellungen überschrieben wurden, um sie xkcd-ähnlicher zu machen. Eine Einschränkung besteht darin, dass die neuen Grafiken, die sie erstellen, in bestimmten Fällen nicht aktualisiert werden (z. B. Begrenzungsrahmen für Textobjekte beim Ändern der Achsengröße). Dies könnte jedoch durch eine vollständigere objektorientierte Implementierung berücksichtigt werden, bei der vom Handle geerbt wird Klasse , Verwenden von Ereignissen und Listenern usw. Im Moment sind hier meine einfacheren Implementierungen:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
Und hier ist ein Beispielskript, das diese verwendet, um den obigen Comic neu zu erstellen. Ich habe die Linien neu erstellt, indem ich
ginput
Punkte im Plot mit der Maus markiert, sie erfasst und dann so gezeichnet habe, wie ich es wollte:Und (Trompeten) hier ist die resultierende Handlung!:
quelle
OK, hier ist mein weniger roher, aber immer noch nicht ganz vorhandener Versuch:
Ergebnis:
Dinge die zu tun sind:
plot2xkcd
damit wir jede Handlung / Figur in den xkcd-Stil konvertieren können .quelle