Borrachos, bochinche, futbol

De los tiempos en que escuchaba radio y veía televisión colombiana, mi impresión de Felix de Bedout es el de un periodista serio y crítico. Por los reenvíos que me llegan en twitter de quienes siguen su cuenta, mantengo esa impresión. Con motivo de la ley seca en Bogotá durante los partidos de la selección Colombia en el mudial de Brasil 2014 trinó:

Como entre meme y meme, y broma y broma la verdad se asoma, me parece que es importante no considerar ese mapa de prohibiciones en el vacío, sino asociarlo con otro que nos permite triangular la correlación que podríamos expresar como fútbol + violencia = ley seca. Como para formalizarlo un poquito más, en lugar de un meme, voy a usar un trino como mi fuente para los paises que reportan más de 100 heridos después de que juega su selección:

y usando Pharo más Roassal y ese trino (tweet) del Alcalde Petro tendremos nuestro nuevo mapa:

^Arriba | Paises con más de 100 heridos cuando "celebran" que juega su selección y código para construir la imagen. (Click en cada imagen para agrandarla)

A la izquierda están las instrucciones para crear el mapa (código fuente) y a la derecha la gráfica resultante (click para agrandar). En la parte inferior hay más detalles para las personas interesadas.

Esto nos ayuda a poner el mapa de la prohibición trinado por Felix en perspectiva e indirectamente pone a conversar este trino con el del Alcalde Petro sobre las cifras de violencia en correlación con el fútbol (no he visto conversaciones entre ellos a través de este medio).

Ojalá este deporte ocupase un lugar más sosegado junto a las demás actividades recreativas. No me imagino gente con temor de salir a la calle porque quizás se encuentre con un violento hooligan debido Nairo Quintana tuvo un excelente desempeño ciclístico, o por que a bailarines de Colombia hicieron un inmejorable trabajo en el Mundial de Salsa.

Afortunadamente estamos teniendo celebraciones más tranquilas y entendiendo de los logros del proceso, al margen de los resultados, como el del pasado domingo 6 de Julio de 2014, cuando cerca de $125.000 personas se reunieron para darle la bienvenida a jugadores y cuerpo técnico de la selección Colombia de fútbol. Yo, que soy indiferente a éste deporte, sí disfruté de que la celebración haya sido en calma y multitudinaria, a pesar de que no comparto ese discurso totalitario del fútbol que supuestamente pone a vibrar a 47 millones de colombianos, como si fuera incomptable la nacionalidad con que ese deporte esté por fuera de nuestras preocupaciones y reconocer que entonces quien celebraba era una parte numerosa de Colombia, pero no total del país. Ojalá la "pasión del fútbol" no cometa el error tan desafortunadamente generalizado en los medios de comunicación de invisibilizar a las minorías y lo diferente, por ejemplo a quienes no disfrutan de ese deporte y sirva como escenario de reflexión y diálogo sobre otras cosas, como bien lo decía Mauricio Albarracín en su artículo de la silla vacía, que recomiendo sobre manera, al respecto de las relaciones raciales y de género. El título de este texto lo he mantenido para mostrar que podemos ir más allá de las relaciones evidentes y de las reaciones habituales con respecto al fútbol, al menos eso me ha hecho pensar este mundial.

En este texto, quiere aportar en ese sentido, por ejemplo nos permitió juntar conversaciones como las de Felix de Bedout, Gustavo Petro, Mauricio Albarracín y la mía, hablar de convivencia y la posibilidad de reconocer la diversidad y a las minorías, eso gracias a Internet y al Fútbol.

Más detalles sobre el algoritmo de visualización

El argumento está esencialmente hecho: pongamos al fútbol en perspectiva, miremos qué diálogos posibilita y qué nos enseña a través de ellos. Para mantener la argumentación fluida sólo hice unos pequeños enlaces, pero en esta parte ampliaremos más los aspectos técnicos.

Acá está el código fuente del mapa generado acá por fuera de la imagen, por si se quiere copiar (contenido entre las comillas triples):

In [3]:
codigo_smalltalk = u"""
    "@md:
    # Ley Seca en Bogotá

    Un pequeño ejercicio de 'periodismo de datos' amateur ;-)
    "

    "Definamos nuestras variables"
    | mapa datos |

    "Los datos será una tabla que guarda tripletas de la forma:
     ' Pais | Cantidad de heridos | Fuente' "
    datos := RTTabTable new.
    datos input: 
        'Colombia 	110 	https://twitter.com/petrogustavo/status/479464213640130560' 
        usingDelimiters: String tab.
    datos convertColumn: 2 to: [ :t | Integer readFrom: t ].

    "Ahora dibujemos nuestros datos en un mapa mundi"
    mapa := RTMetricMap new.
    mapa allCountriesColor: Color white.
    mapa countries: datos values named: #first metric: #second.
    mapa open setLabel: '
            Paises con más de 100 heridos reportados cuando "celebran" 
            que juega su selección'.
"""

Debido a que el IPython Notebook, la herramienta de escritura para este texto no soporta (aún) el resaltado sintáctico para Smalltalk (el entorno en el que está basado Pharo), usaremos pygments para colorearlo manera más adecuada.

In [4]:
from pygments import highlight
from pygments.lexers import SmalltalkLexer
from pygments.formatters import HtmlFormatter
from IPython.core.display import HTML

html_snippet = highlight(codigo_smalltalk,SmalltalkLexer(),HtmlFormatter(full=True, style='trac'))
HTML(html_snippet)
Out[4]:

    "@md:
    # Ley Seca en Bogotá

    Un pequeño ejercicio de 'periodismo de datos' amateur ;-)
    "

    "Definamos nuestras variables"
    | mapa datos |

    "Los datos será una tabla que guarda tripletas de la forma:
     ' Pais | Cantidad de heridos | Fuente' "
    datos := RTTabTable new.
    datos input: 
        'Colombia 	110 	https://twitter.com/petrogustavo/status/479464213640130560' 
        usingDelimiters: String tab.
    datos convertColumn: 2 to: [ :t | Integer readFrom: t ].

    "Ahora dibujemos nuestros datos en un mapa mundi"
    mapa := RTMetricMap new.
    mapa allCountriesColor: Color white.
    mapa countries: datos values named: #first metric: #second.
    mapa open setLabel: '
            Paises con más de 100 heridos reportados cuando "celebran" 
            que juega su selección'.

Tan pronto se obtuvo ese código coloreado el esquema de colores no era de mi agrado. Para saber qué estilos estaban disponibles ejecuté el siguiente código y probé los resultados hasta que encontré alguno que me gustara.

In [43]:
from pygments.styles import get_all_styles
estilos = list(get_all_styles())
print estilos
['monokai', 'manni', 'rrt', 'perldoc', 'borland', 'colorful', 'default', 'murphy', 'vs', 'trac', 'tango', 'fruity', 'autumn', 'bw', 'emacs', 'vim', 'pastie', 'friendly', 'native']

¿Puede el mismo mapa ser dibujado en IPython? Según este enlace es posible, sin embargo esto requiere la instalación de cartopy, la cual puede ser dispendiosa y no alcancé a resolverla en el tiempo que tuve y nos muestra la ventaja de tener un entorno totalmente integrado, como Pharo/Roassal. En caso de curiosidad, este es el código base en Python (y el error que arroja). La extensión es casi la misma, aunque el código en Smalltalk no sólo es más corto sino mucho más legible a mi juicio.

In [2]:
import matplotlib.pyplot as plt
import cartopy
import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs

ax = plt.axes(projection=ccrs.PlateCarree())
#ax.add_feature(cartopy.feature.LAND)
ax.add_feature(cartopy.feature.OCEAN)
#ax.add_feature(cartopy.feature.COASTLINE)
#ax.add_feature(cartopy.feature.BORDERS, linestyle='-', alpha=.5)
#ax.add_feature(cartopy.feature.LAKES, alpha=0.95)
#ax.add_feature(cartopy.feature.RIVERS)
ax.set_extent([-150, 60, -25, 60])

shpfilename = shpreader.natural_earth(resolution='110m',
                                      category='cultural',
                                      name='admin_0_countries')
reader = shpreader.Reader(shpfilename)
countries = reader.records()

for country in countries:
    if country.attributes['adm0_a3'] == 'USA':
        ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                          facecolor=(0, 0, 1),
                          label=country.attributes['adm0_a3'])
    else:
        ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                          facecolor=(0, 1, 0),
                          label=country.attributes['adm0_a3'])

plt.show()
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-2b0609bfd57d> in <module>()
      1 import matplotlib.pyplot as plt
----> 2 import cartopy
      3 import cartopy.io.shapereader as shpreader
      4 import cartopy.crs as ccrs
      5 

ImportError: No module named cartopy

Perspectivas y enlaces extra

Acá hay algunos enlaces que no alcancé a mencionar antes y que ayudaron a escribir la publicación:

En cuando a lo venidero, me gustaría trabajar más con Smalltalk/Pharo como entorno de visualización. He estado pensando en algo que por lo pronto tiene el nombre tentativo de [Tweetom] por (tweet + atom) o quizás trinomo en su acepción en español (tríno + átomo) que intentaría visualizar una "unidad de conversación" en esta y otras redes de microblogging desde una metáfora similar a las de los átomos. Ya hablaré de ello.

Comments

Comments powered by Disqus