Motivación
El origen de este post como todo en la vida tiene que ver con una interrogación. Hace no tanto me pregunté qué se podía hacer con R más allá de nuestras tareas habituales y me puse a investigar hasta que un buen día me topé con la interesante idea-concepto-propuesta-intensión del denominado Arte Generativo, sobre el cual quiero compartir unas breves experiencias en forma de código.
El arte generativo, también conocido en la actualidad como arte algorítmico, es un tipo de expresión visual que puede ser recreada digitalmente, estableciendo un diálogo difuso entre los campos del arte y la programación.
A menudo un sentido común extendido asocia el arte al cauce de la expresión emocional de las personas, mientras que el acto de programar es emparentado a fríos códigos y lógicas pragmáticas que conducen a un resultado puntual. El arte generativo, creado por medio de algoritmos, tensa estas creencias siendo ambas cosas y ninguna de ellas. Pondremos aquí en juego herramientas rígidas y lógicas que crean algo asbtracto, impredecible e inesperado.
Es dable destacar que las bases de la propuesta estética fueron establecidas en el Manifiesto Arte Generativo(https://noticiasrecoleta.com.ar/el-arte-generativo-y-sus-60-anos-exposicion-de-obras-en-el-museo-de-arte-moderno/) por los artistas argentinos Eduardo Mac Entyre y Miguel Ángel Vidal ( foto ) donde se proclamaba el espacio como un campo abierto a las tensiones de formas orbitales, trayectorias proyectadas y planos fugados en profundidad.

Manos a la obra
Considero significativo adentrarse a este tema por su relevancia histórico-cultural, destacando además su dimensión práctica, toda vez que en el proceso de desarrollo de estos objetos, podemos experimentar e involucrarnos con diversas lógicas, formas y colores, una caja de herramientas distinta (pero no tanto) a la que habitualmente utilizamos en nuestra rutina laboral y que nos permite expandir creativamente nuestras habilidades al momento de visualizar fenómenos con R.
library(tidyverse)
library(dplyr)
library(viridis)
library(ggplot2)
library(jasmines)
library(aRtsy)
library(generativeart)
Para situarnos en el espacio que nos propone R, comenzamos haciendo algo que ya conocemos: un ggplot de puntos en un plano con colores y formas. En términos generales, esta es una de las lógicas subyacentes de la visualización y nos permite tomar una dimensión de las potencialidades de nuestras herramientas.
data <- data.frame(a1 = 1:5,# ej
a2 = 1:5)
ggplot(data, aes(a1, a2)) + # ggplot
geom_point(col = ifelse(1:nrow(data)==3,
"red", "black"),
shape = ifelse(1:nrow(data)==3,15,16),
size = ifelse(1:nrow(data)==3,5,1))

Crearemos ahora un espiral de arquímedes para ver qué pasa con ggplot cuando vamos mas allá de las rectas:
# crea un fondo blanco para el grafico
opt = theme(legend.position = "none",
panel.background = element_rect(fill="white"),
axis.ticks = element_blank(),
panel.grid = element_blank(),
axis.title = element_blank(),
axis.text = element_blank())
# parametros
a <- 2
b <- 3
theta <- seq(0,10*pi,0.01)
r <- a + b*theta
df <- data.frame(x=r*cos(theta),
y=r*sin(theta)) #coord
#objeto ggplot
ggplot(df, aes(x,y)) +
geom_path(col='lightblue ') +
opt

Luego de esta breve inmersión sensible, indagaremos en las posibilidades que abren tres paquetes que complementan las herramientas gráficas disponibles en r, y fueron desarrollados específicamente para la creación ( o producción?) de arte generativo y como veremos nos entregaránn resultados más qué interesantes.
Jasmines
Con Jasmines podemos modificar creativamente objetos ggplot a partir de múltiples funciones. En este paquete nuestra visualización parte de una semilla (seed) y desde allí se crea un objeto que puede ser modificado en renderizado, forma, tamaño y otros aspectos de personalizables.
#library(jasmines)
use_seed(1000) %>% #(objeto inicial,
#marco de aletoriedad)
entity_circle(grain = 1000,
size = 3)%>%
#circulo,
#diametro,
#renderizado de 1000 pts.
unfold_warp(iterations = 100) %>%
# iteracions (+ "complejidad")
style_ribbon(palette = "magma")

#convierte en ggplot
Avanzamos en la proyección de una figura mas compleja:
use_seed(50) %>%
entity_gaussian(grain = 1000,
size = 1) %>%
unfold_warp(iterations = 100) %>%
style_ribbon(
palette = "plasma",
colour = "ind",
background = "#00002d")

Generative Art
Generative Art permite crear imágenes basadas en miles de puntos. La posición de cada uno ellos se calcula mediante una fórmula que contiene valores aleatorios. Debido a esta aleatoriedad, cada impresión creada es diferente.
Para lograr que una imagen sea reproducible, generative art implementa un archivo de registro que guarda el nombre (file name), la semilla (seed) y la fórmula.
Vamos a crear un archivo con una tirada de 3 imágenes:
#library(generativeart)
# seteamos la ruta
IMG_DIR <- "img/"
IMG_SUBDIR <- "everything/"
IMG_SUBDIR2 <- "handpicked/"
IMG_PATH <- paste0(IMG_DIR, IMG_SUBDIR)
LOGFILE_DIR <- "logfile/"
LOGFILE <- "logfile.csv"
LOGFILE_PATH <- paste0(LOGFILE_DIR, LOGFILE)
# creamos la estructura del directorio
generativeart::setup_directories(IMG_DIR,
IMG_SUBDIR, IMG_SUBDIR2, LOGFILE_DIR)
# escribimos nuestra formula:
my_formula <- list(
x = quote(runif(1, -1, 0.5) * x_i^2 - sin(y_i^2)),
y = quote(runif(1, 1, 0.9) * y_i^2 - cos(x_i^2)))
# llamamos a la funcion principal para
#crear 5 imagenes with a polar coordinate system
generativeart::generate_img(formula = my_formula,
nr_of_img = 3, polar = TRUE,
filetype = "png", color = "#ffedec",
background_color = "#223053")

Artsy
Si la broma te dió risa…¿Qué diferencia hay en que luego te enteres que fue creada por un algoritmo?" (Marcus du Sautoy, El código creativo )
Así comienza Artsy su blog y nos presenta una serie de funcionalidades para crear nuestro arte generativo de forma simple, estandarizado y al alcance de todos y todas. El paquete proporciona varios algoritmos para crear proyecciones ggplot que incorporan aleatoriedad (según la seed) y, de los 3 que vimos, es mi favorito, con lo cual me gustaría profundizar más en él.
Antes de comenzar a utilizar este paquete es importante saber que el mismo se organiza en colecciones, cada una genera un tipo de proyección o forma distinta.
Iterative es una colección basada en un sistema de reglas e iteración en base a ellas.
La función canvas_strokes() permite, por ejemplo, simular el trazo de un pincel ejecutando un calculo de probablilidad en la que todos los puntos de la proyección tienen la probabilidad de adquirir el color del punto próximo, pero también tienen una pequeña posibilidad de asumir un color distinto.
#library(aRtsy)
set.seed(5)
#colores de la paleta de referencia.
#https://www.color-hex.com/color-palette/84832
canvas_strokes(colors =
c('#e8d0d9', '#e590a5',
'#75638b', '#507592',
'#dac291'),
neighbors = 1, p = 0.005,
iterations = 10,
width = 500, height = 500,
side = FALSE)

La colección Geometric en cambio implementa algoritmos que dibujan formas geométricas y le aplican colores aleatorios.
Es el caso de canvas_squares, que utiliza una variedad de cuadrados y rectángulos en lugar de líneas. Funciona cortando repetidamente el lienzo en ubicaciones aleatorias y coloreando el área que crean estos cortes:
set.seed(6)
canvas_squares(colors = c(
'#fac901', '#ffffff',
'#225095', '#dd0100'),
cuts = 50, ratio = 1.458,
width = 100, height = 100)

#paleta de referencia
#https://www.color-hex.com/color-palette/25374
También resultan atractivas las proyecciones de canvas_ribbons() que mantiene la lógica anterior, pero utiliza cintas y triángulos conectados a través de nodos comunes.
set.seed(784)
canvas_ribbons(colors =
c('#CC102D',
'#E88514', '#FFFF28',
'#7DC62C', '#71C0DE',
'#634C8A'),
background = '#1c2117',
triangle = TRUE)

# referencia de la paleta
# https://www.schemecolor.com/the-dark-
# side-of-the-moon-pink-floyd-colors.php
# lo intente!
Finalmente, la colección Supervised trabaja con funciones de agrupación supervisadas propias del machine learning. Los algoritmos de esta colección funcionan generando puntos de datos aleatorios en un plano bidimensional (con una variable de respuesta continua o categórica). Posteriormente la modelan utilizando el algoritmo de aprendizaje supervisado.
Para el caso concreto del cuadro de mosaicos que sigue operaremos de fondo con un algoritmo k means:
canvas_mosaic(colors =
c('#fff2df',
'#d69c42',
'#77ae80','#4b6294',
'#852a02'),
maxk = 1,
n = 150,resolution = 1000)

# paleta de referencia
# https://www.color-hex.com/color-palette/63466
Conclusión
Esta fue una selección de experiencias y posibilidades experimentando con el denominado arte generativo en R, los códigos abiertos de este post y las referencias citadas invitan a lxs interesadxs a replicar-reconfigurar las imágenes propuestas.
Las primeras impresiones de quien escribe con respecto al arte generativo es que en tanto técnica expresiva estimula creativamente a indagar y conocer más sobre el procesamiento de imágenes y la proyección de datos en R.
En este sentido podremos afirmar que arte generativo es una interesante alternativa para quienes quieran programar recrativamente, explorar las posibilidades de formas, colores y espacios que tenemos a disposición en r, procastinar en horario de trabajo o estudio, crear objetos artísticos (eventualmente venderlos a precio justo, recomiendo indagar en que qué es un nft ), todas las anteriores o ninguna, pero siempre con el mismo sentimiento compartido: el amor al arte.
Комментарии