Используйте R, чтобы творить искусство и создавать воображаемые цветы, вдохновленные природой.

«Ученый изучает природу не потому, что она полезна; он изучает это, потому что ему это нравится, и он наслаждается этим, потому что это красиво ». - Анри Пуанкаре

Есть много примеров естественных фактов, которые можно описать математическими терминами. Хорошие примеры - форма снежинок, фрактальная геометрия брокколи романеско или то, как самоподобие управляет ростом растений.

R - это инструмент для серьезного анализа, но не все в жизни серьезно. Жизнь тоже забавна, и R можно использовать, чтобы веселиться и делать красивые вещи. Его графическая мощь может быть использована для создания художественных изображений, подобных тому, что иллюстрирует этот раздел, вдохновленный тем, как растения располагают свои листья. Этот факт называется филлотаксисом и ляжет в основу данной статьи.

В этой статье мы используем пакет ggplot2. Помимо развлечения, мы узнаем много важных функций, которые будут полезны не только для рисования, но и для представления данных в реальных задачах.

Начнем с загрузки библиотеки.

# Set plot images to a nice size 
options(repr.plot.width = 4, repr.plot.height = 4)  
# Load the ggplot2 package 
library(ggplot2)

Разминка: рисование точек по кругу

Есть много способов представления данных с помощью ggplot2: от простых графиков разброса до более сложных графиков скрипки. Функции, начинающиеся с geom_, определяют тип графика. В этой статье мы будем работать только с geom_point (), которая отображает точки в двух измерениях. Нам понадобится набор данных с двумя переменными; назовем их x и y.

Мы начнем с рисования 50 точек на окружности радиуса 1. Поскольку каждая точка (x, y) должна находиться в единичном круге, отсюда следует, что x² + y² = 1. Мы можем получить это, используя суперславное тригонометрическое тождество Пифагора. который утверждает, что sin² (θ) + cos² (θ) = 1 для любого действительного числа θ.

# Create circle data to plot 
t <- seq(0, 2*pi, length.out = 50) 
x <- sin(t) 
y <- cos(t) 
df <- data.frame(t, x, y)  
# Make a scatter plot of points in a circle 
p <- ggplot(df, aes(x, y)) 
p + geom_point()

Сделайте его гармоничным с золотым углом

Листья растения располагаются по спирали. Спираль - это кривая, которая начинается от начала координат и удаляется от начала координат, когда вращается вокруг нее. На графике выше все наши точки находятся на одинаковом расстоянии от начала координат. Простой способ расположить их по спирали - это умножить x и y на коэффициент, который увеличивается для каждой точки. Мы могли бы использовать t в качестве этого коэффициента, поскольку он соответствует этим условиям, но мы сделаем что-то более гармоничное. Воспользуемся Золотым углом:

Золотой угол = π (3 - √5)

Это число основано на золотом сечении, одном из самых известных чисел в истории математики. Представьте, что у вас есть окружность, и вы разбиваете ее на две дуги с длинами a и b с a ›b (дуга - это часть окружности). Угол, который разрывает круг так, что a / b = (a + b) / a, называется золотым углом. Другими словами: золотой угол разбивает круг так, что отношение большой дуги к маленькой дуге составляет золотое сечение. Это изображение (из Википедии) иллюстрирует предыдущее определение:

Золотой угол - это угол, образуемый меньшей (красной) дугой. И золотое сечение, и золотой угол появляются в самых неожиданных местах природы. Помимо лепестков цветов и листьев растений, вы найдете их в семенных головках, сосновых шишках, семенах подсолнечника, ракушках, спиральных галактиках, ураганах и т. Д.

Пришло время спирали!

# Define the number of points 
points <- 500  
# Define the Golden Angle 
angle <- pi*(3-sqrt(5))
  
t <- (1:points) * angle 
x <- sin(t) y <-cos(t) 
df <- data.frame(t, x, y)
 
 # Make a scatter plot of points in a spiral 
p <- ggplot(df, aes(x*t, y*t)) 
p + geom_point()

Удалите все лишнее

Помимо данных, график включает в себя множество других компонентов, определяющих его окончательный вид. Наш предыдущий сюжет содержит:

  • фон серого цвета
  • сетка из горизонтальных и вертикальных белых линий
  • галочки по оси
  • заголовок на каждой оси
  • текст по осям для обозначения меток

Искусство не уживается с большинством этих элементов, поэтому пора переходить к действию.

df <- data.frame(t, x, y)  
# Make a scatter plot of points in a spiral and remove some plot #components 
p <- ggplot(df, aes(x*t, y*t)) 
p + geom_point() +   
theme(panel.background = element_rect(fill="white"),                 panel.grid = element_blank(), 
axis.title = element_blank(),         
axis.text = element_blank(),         
axis.ticks = element_blank())

Немного макияжа: размер, цвет и прозрачность

Наш рисунок начинает напоминать растение, но мы можем лучше. Изменяя цвет, прозрачность (также называемую альфа-каналом) и размер точек, изображение станет более привлекательным.

# Change the code from Task 4 to modify the size, transparency, and # color of the points 
p <- ggplot(df, aes(x*t, y*t)) 
p + geom_point(size = 8, alpha = 0.5, color= "darkgreen")

Играйте с эстетикой: одуванчик

До сих пор все точки имели одинаковый внешний вид (размер, цвет, форму и альфа-канал). Иногда нам нужно сделать внешний вид точек зависимым от переменной в наборе данных. Теперь сделаем размер переменной. Мы также изменим форму точек. Хотя мы не сможем подуть на него, полученное изображение должно напоминать вам одуванчик.

# Copy the code from 'a bit of make up' and modify the color, size, # and shape of the points 
p <- ggplot(df, aes(x*t, y*t)) 
p +  geom_point(aes(size = t), alpha = 0.5, color= "darkgreen", shape = 8) + 
theme(legend.position = "none")

Сложите все вместе: подсолнух

Растения не только используют золотой угол для расположения листьев. Золотой угол также встречается в расположении семян подсолнечника. Чтобы нарисовать подсолнух, ничего нового не нужно; нам просто нужно объединить кое-что из того, что мы уже знаем.

# Copy the code from 'play with aesthetics' and modify the color and
# shape of the points, and the background color
p <- ggplot(df, aes(x*t, y*t))
p +  geom_point(aes(size = t), alpha = 0.5, 
                color= "yellow", shape = 17) +
theme(legend.position = "none", 
      panel.background = element_rect(fill = "darkmagenta"))

Что, если вы измените угол?

Эти узоры очень чувствительны к углу между точками, образующими спираль. Небольшие изменения угла могут создавать очень разные изображения. Давайте посмотрим на это на примере.

# Change the value of the angle 
angle <- 2.0 
points <- 1000  
t <- (1:points)*angle 
x <- sin(t) 
y <- cos(t) 
df <- data.frame(t, x, y)  
# Copy the plotting code from previous section
p <- ggplot(df, aes(x*t, y*t)) 
p +  geom_point(aes(size = t), alpha = 0.5, color= "yellow", 
shape = 17) + 
theme(legend.position = "none", panel.background = element_rect(fill = "darkmagenta"))

Теперь все вместе: воображаемые цветы

Техники, которые мы использовали до сих пор, позволяют нам создавать бесконечное количество узоров, вдохновленных природой: единственный предел - это наше воображение. Но рисование также было забавным предлогом, чтобы научиться использовать ggplot2. Все приемы, которые мы видели в этой статье, полезны и при построении реальных данных.

Изображение ниже представляет собой простую вариацию предыдущего цветка и, по сути, очень похоже на первый рисунок, на котором мы нарисовали 50 точек по кругу. Надеюсь, вам понравилось путешествие между этим простым кругом и этим прекрасным цветком. 😄

# Change the values of angle and points 
angle <- 13*pi/180 
points <- 2000  
t <- (1:points)*angle 
x <- sin(t) 
y <- cos(t) 
df <- data.frame(t, x, y)  
# Adjust the plot parameters to create the magenta flower 
p <- ggplot(df, aes(x*t, y*t)) 
p + geom_point(size = 80, alpha = 0.1, shape = 1, color = "blue")+   theme(legend.position="none", panel.background = element_rect(fill = "white"),panel.grid=element_blank(),axis.ticks=element_blank(), 
axis.title=element_blank(),         
axis.text=element_blank())