Así que personas con talento han descubierto cómo hacer gráficos de estilo xkcd en Mathematica , en LaTeX , en Python y en R ya.
¿Cómo se puede usar MATLAB para producir un diagrama que se parezca al anterior?
Lo que he intentado
Creé líneas onduladas, pero no pude obtener ejes ondulados. La única solución que pensé fue sobreescribirlos con líneas onduladas, pero quiero poder cambiar los ejes reales. Tampoco pude hacer funcionar la fuente Humor, el bit de código utilizado fue:
annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');
Para la línea ondulada, experimenté agregando un pequeño ruido aleatorio y suavizado:
smooth(0.05*randn(size(x)),10)
Pero no pude hacer que el fondo blanco aparezca a su alrededor cuando se cruzan ...
Respuestas:
Veo dos formas de resolver esto: la primera es agregar algo de fluctuación a las coordenadas x / y de las características de la trama. Esto tiene la ventaja de que puede modificar fácilmente una trama, pero debe dibujar los ejes usted mismo si desea que sean xkcdyfied (consulte la solución de @Rody Oldenhuis ). La segunda forma es crear una trama no nerviosa y utilizarla
imtransform
para aplicar una distorsión aleatoria a la imagen. Esto tiene la ventaja de que puede usarlo con cualquier gráfico, pero terminará con una imagen, no un gráfico editable.Primero mostraré el # 2, y mi intento en el # 1 a continuación (si te gusta el # 1 mejor, ¡mira la solución de Rody !).
Esta solución se basa en dos funciones clave: EXPORT_FIG del intercambio de archivos para obtener una captura de pantalla suavizada e IMTRANSFORM para obtener una transformación.
Aquí está mi intento inicial de fluctuación
fuente
En lugar de volver a implementar todas las diversas funciones de trazado, quería crear una herramienta genérica que pudiera convertir cualquier trazado existente en un trazado de estilo xkcd.
Este enfoque significa que puede crear trazados y aplicarles estilo utilizando las funciones estándar de MATLAB y luego, cuando haya terminado, puede volver a representar el diagrama en un estilo xkcd mientras conserva el estilo general del diagrama.
Ejemplos
Trama
Bar & Plot
Box & Plot
Cómo funciona
La función funciona iterando sobre los hijos de un eje. Si los niños son del tipo
line
o lospatch
distorsiona ligeramente. Si el hijo es de tipohggroup
, itera en los hijos secundarios delhggroup
. Tengo planes para admitir otros tipos de trama, comoimage
, pero no está claro cuál es la mejor manera de distorsionar la imagen para tener un estilo xkcd.Finalmente, para garantizar que las distorsiones se vean uniformes (es decir, las líneas cortas no se distorsionan más que las líneas largas), mido la longitud de la línea en píxeles y luego la muestra proporcional a su longitud. Luego agrego ruido a cada enésima muestra que produce líneas que tienen más o menos la misma cantidad de distorsión.
El código
En lugar de pegar varios cientos de líneas de código, simplemente vincularé a una esencia de la fuente . Además, el código fuente y el código para generar los ejemplos anteriores están disponibles gratuitamente en GitHub .
Como puede ver en los ejemplos, todavía no distorsiona los ejes, aunque planeo implementarlos tan pronto como encuentre la mejor manera de hacerlo.
fuente
export_fig
ruta, es decir, primero formatea la trama como xkcd y luego distorsiona la imagen.El primer paso ... encuentre una fuente del sistema que le guste (use la función
listfonts
para ver qué hay disponible) o instale una que coincida con el estilo de escritura a mano de xkcd . Encontré una fuente TrueType "Humor Sans" del usuario ch00f mencionado en esta publicación de blog , y la usaré para mis ejemplos posteriores.Tal como lo veo, generalmente necesitará tres objetos gráficos modificados diferentes para hacer este tipo de gráficos: un objeto de ejes , un objeto de línea y un objeto de texto . Es posible que también desee un objeto de anotación para facilitar las cosas, pero lo dejé por ahora, ya que podría ser más difícil de implementar que los tres objetos anteriores.
Creé funciones de contenedor que crearon los tres objetos, anulando ciertas configuraciones de propiedad para hacerlos más parecidos a xkcd. Una limitación es que los nuevos gráficos que producen no se actualizarán en ciertos casos (como los cuadros delimitadores en objetos de texto al cambiar el tamaño de los ejes), pero eso podría explicarse con una implementación orientada a objetos más completa que implica heredar del controlador clase , usando eventos y escuchas , etc. Por ahora, aquí están mis implementaciones más simples:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
Y aquí hay un script de muestra que los usa para recrear el cómic anterior. Recreaba las líneas usando
ginput
para marcar puntos en la trama con el mouse, capturándolos y luego dibujándolos como quería:Y (trompetas) ¡ aquí está la trama resultante !:
fuente
Bien, entonces, aquí está mi intento menos burdo pero aún no del todo:
Resultado:
Cosas para hacer:
plot2xkcd
para que podamos convertir cualquier gráfico / figura al estilo xkcd.fuente