Точкова діаграма в R з використанням ggplot2 на прикладі

⚡ Розумний підсумок

Точкова діаграма в R з використанням ggplot2 відображає дві неперервні змінні на осі x та y за допомогою geom_point(). Цей посібник охоплює групиping за кольором, логарифмічними перетвореннями, підібраними лініями регресії, мітками, фасетуванням, виправленнями накладання графіків, масштабами, темами та збереженням.

  • 📍 Базовий синтаксис: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() будує графік з даних, картиping, та геометрія.
  • 🎨 Групове розфарбовування: aes(color = factor(gear)) всередині geom_point() розділяє точки на один колір для кожного рівня фактора.
  • 📈 Лінії тренду: stat_smooth(method = “lm”) накладає підібрану лінію регресії, а se = FALSE видаляє довірчу зону.
  • 🗂️ Огранювання: facet_wrap() малює одну панель для кожної групи у спільній шкалі, що краще, ніж згортання кожної серії в одну діаграму.
  • 🔁 Надмірне нанесення: Зменште альфа-відсоток, застосуйте джиттер до точок або переключіться на geom_hex(), коли маркери накопичуються один на одному.
  • 💾 Експорт: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) записує останній графік до робочого каталогу.

Точкова діаграма в R з використанням ggplot2

Чому графіки важливі в аналізі даних

Графіки є третьою частиною процесу аналізу даних. Перша частина про дані extracції, друга частина стосується очищення та маніпулювання даними. Нарешті, спеціалісту з даних може знадобитися повідомте свої результати графічно.

Робочий процес спеціаліста з обробки даних коротко зображено на зображенні нижче.

  • Перше завдання науковця з даних — визначити дослідницьке питання. Це питання дослідження залежить від завдань і цілей проекту.
  • Після цього одним із найвидатніших завдань є розробка функцій. Спеціаліст з даних повинен збирати, обробляти та очищати дані
  • Коли цей крок завершено, він може почати досліджувати набір даних. Іноді виникає необхідність уточнення та зміни вихідної гіпотези через нове відкриття.

Діаграма розсіювання в R

  • Коли пояснювальний аналізу досягнуто, дослідник даних повинен враховувати здатність читача до розуміти базові концепції та моделі.
  • Його результати мають бути представлені у форматі, зрозумілому всім зацікавленим сторонам. Один з найкращих методів спілкуватися результати через a графік.
  • Графіки є неймовірним інструментом для спрощення складного аналізу.

У решті цього посібника ці графіки будуються за допомогою пакета ggplot2.

Пакет ggplot2

Цей посібник зосереджений на побудові діаграм в R за допомогою ggplot2.

У цьому посібнику ви будете використовувати пакет ggplot2. Пакет реалізує граматику графіки, описану Леландом Вілкінсоном у 2005 році. ggplot2 є гнучким, постачається з багатьма темами та дозволяє вказати графік на високому рівні ABS.tracція. Зверніть увагу, що він не створює тривимірну або інтерактивну графіку; для них потрібні такі пакети, як plotly або rgl.

У ggplot2 графік складається з таких аргументів:

  • дані
  • естетична картаping
  • геометричний об'єкт
  • статистичні перетворення
  • ваги
  • система координат
  • коригування положення
  • огранювання

Ви дізнаєтеся, як керувати цими аргументами в підручнику.

Основний синтаксис ggplot2:

ggplot(data, mapping=aes()) +
geometric object 

arguments: 
data: Dataset used to plot the graph
mapping: Control the x and y-axis 
geometric object: The type of plot you want to show. The most common object are:
 
- Point: `geom_point()` 
- Bar: `geom_bar()`
- Line: `geom_line()` 
- Histogram: `geom_histogram()`

Як створити діаграму розсіювання в R

Давайте подивимося, як ggplot працює з набором даних mtcars. Ви починаєте з побудови діаграми розсіювання змінної mpg та змінної drat.

Основна діаграма розсіювання

library(ggplot2)
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point()

Code Пояснення

  • Спочатку ви передаєте набір даних mtcars до ggplot.
  • Всередині аргументу aes() ви додаєте вісь x і вісь y.
  • Знак + означає, що ви хочете, щоб R продовжував читати код. Це робить код більш читабельним, розбиваючи його.
  • Використовуйте geom_point() для геометричного об’єкта.

вихід:

Основна діаграма розсіювання

Точкова діаграма з групами

Іноді може бути цікаво розрізнити значення за групою даних (тобто дані рівня факторів).

ggplot(mtcars, aes(x = mpg, y = drat)) +
    geom_point(aes(color = factor(gear)))

Code Пояснення

  • aes() всередині geom_point() контролює колір кожної групи. Групаping Змінна має бути фактором, тому шестерня обгортається у factor().
  • Загалом у вас є код aes(color = factor(gear)), який змінює колір точок.

вихід:

Точкова діаграма з групами

Зміна масштабу осей за допомогою логарифмічного перетворення

Перемасштабування даних є значною частиною роботи аналітика, оскільки необроблені змінні рідко надходять у чіткій формі дзвона. Логарифмування – це один із способів стиснути екстремальні значення та зробити графік менш чутливим до викидів.

ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear)))

Code Пояснення

  • Ви трансформуєте змінні x та y у log() безпосередньо всередині карти aes().ping.

Зауважте, що можна застосувати будь-яке інше перетворення, наприклад стандартизацію чи нормалізацію.

вихід:

Змінити вісь

Діаграма розсіювання з підігнаними значеннями

Ви можете додати до графіка ще один рівень інформації. Ви можете накласти підібрані значення лінійна регресія.

my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear))) +
    stat_smooth(method = "lm",
        col = "#C42126",
        se = FALSE,
        size = 1)
my_graph

Code Пояснення

  • my_graph: графік зберігається в об'єкті my_graph, тому на наступних кроках можна додавати шари без повторення всього виклику
  • Аргумент stat_smooth() керує методом згладжування
  • method = “lm”: лінійна регресія
  • стовпець = “#C42126”: Code для червоного кольору лінії
  • se = FALSE: не відображати стандартну помилку
  • size = 1: товщина лінії. У ggplot2 3.4.0 та пізніших версіях цей аргумент було перейменовано на linewidth для геометрій ліній.

вихід:

Точкова діаграма з підігнаними значеннями

Зауважте, що доступні інші методи згладжування

  • glm
  • гам
  • лес: за замовчуванням менше ніж 1,000 спостережень
  • rlm: робустна лінійна модель з пакету MASS

Перш ніж стилізувати діаграму, варто знати, коли взагалі доцільно використовувати точкову діаграму.

Точкова діаграма проти лінійної діаграми Bubble Діаграма в R

Усі три порівнюють дві неперервні змінні одна з одною, тому вибір зводиться до того, що читач має зрозуміти.

Критерії Діаграма розкиду Графік лінія Bubble Діаграма
Шоу Кореляція між двома змінними Зміна однієї змінної вздовж упорядкованої осі Кореляція плюс третя величина
Вісь X Будь-яка неперервна змінна Зазвичай час або інша впорядкована шкала Будь-яка неперервна змінна
Порядок очок Нерелевантні Критичні точки з'єднані Нерелевантні
Третя змінна Через колір або форму Через окремі лінії Розмір наскрізної точки
виклик ggplot2 geom_point() geom_line() geom_point(aes(розмір = z))

З'єднання точок розсіювання лінією, коли вісь x не має природного порядку, є поширеною помилкою: це означає послідовність, якої не існує. Зарезервуйте geom_line() для впорядкованих осей, таких як дати. Для розподілів однієї змінної використовуйте коробкова діаграма замість цього.

Додайте інформацію до графіка

Поки що графіки не містять пояснювального тексту. Читач повинен мати змогу зрозуміти суть лише з даних діаграми, без звернення до додаткової документації, а це означає, що діаграма потребує гарних підписів. Ви можете додати підписи за допомогою функції labs().

Основний синтаксис для labs() такий:

labs(title = "Hello Guru99")
arguments:
- title: Main title displayed above the plot
- subtitle: Secondary line below the title
- caption: Note below the plot, usually the data source
- x: Rename the x-axis
- y: Rename the y-axis
- color / fill: Rename the legend

Example: labs(title = "Hello Guru99", subtitle = "My first plot")

Додайте назву

Однією з обов’язкових відомостей, яку потрібно додати, є назва.

my_graph +
    labs(
        title = "Plot Mile per hours and drat, in log"
         )

Code Пояснення

  • my_graph: ви використовуєте графік, який ви зберегли. Це дозволяє уникнути переписування всіх кодів кожного разу, коли ви додаєте нову інформацію на графік.
  • Ви поміщаєте заголовок всередину labs().

вихід:

Додайте заголовок

Додайте назву з динамічною назвою

Динамічний заголовок корисний для додавання більш точної інформації в заголовок.

Ви можете використовувати функцію paste() для друку статичного та динамічного тексту. Основний синтаксис paste() такий:

paste("This is a text", A)
arguments
- " ": Text inside the quotation marks are the static text
- A: Display the variable stored in A
- Note you can add as much static text and variable as you want. You need to separate them with a comma	

приклад:

A <- 2010
paste("The first year is", A)

вихід:

## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)

вихід:

## [1] "The first year is 2010 and the last year is 2018"

Ви можете додати динамічну назву до нашого графіка, а саме середнє значення mpg.

mean_mpg <- mean(mtcars$mpg)
my_graph + labs(
    title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg)
)

Code Пояснення

  • Ви створюєте середнє значення mpg за допомогою mean(mtcars$mpg), що зберігається у змінній mean_mpg
  • Ви використовуєте paste() із mean_mpg, щоб створити динамічний заголовок, який повертає середнє значення mpg

вихід:

Додайте назву з динамічною назвою

Додайте субтитри

Дві додаткові деталі роблять графік більш чітким. Йдеться про підзаголовок і підпис. Підзаголовок розміщується одразу під заголовком. Підпис може інформувати про те, хто виконав обчислення та джерело даних.

my_graph +
    labs(
        title =
        "Relation between Mile per hours and drat",
        subtitle =
        "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Пояснення

  • Усередині labs() ви додали:
    • title = «Співвідношення між милями на годину та дратами»: Додайте назву
    • subtitle = «Розбивка зв’язків за класом спорядження»: додайте підзаголовок
    • caption = “Власні розрахунки авторів: Додайте підпис
    • Ви відокремлюєте кожну нову інформацію комою, ,
  • Зауважте, що ви порушуєте рядки коду. Це не є обов’язковим і лише допомагає легше читати код

вихід:

Додайте субтитри

Перейменуйте вісь x і вісь y

Назви стовпців рідко бувають зручними для презентації. Вони часто скорочуються або використовують підкреслення між словами, як у GDP_CAP. Перейменуйте їх на графіку та додайте одиниці вимірювання там, де вони важливі.

my_graph +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Пояснення

  • Усередині labs() ви додали:
    • x = «Визначення креслення»: змініть назву осі x
    • y = «Миля на годину»: змініть назву осі y

вихід:

Перейменуйте вісь x і вісь y

Керуйте вагами

Ви можете керувати масштабом осі.

Функція seq() зручна, коли потрібно створити послідовність чисел. Основний синтаксис:

seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`	

Наприклад, діапазон від 0 до 12 з кроком 4 повертає чотири числа: 0, 4, 8 та 12.

seq(0, 12,4)

вихід:

## [1]  0  4  8 12

Ви можете керувати масштабом осей X і Y, як показано нижче

my_graph +
    scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
    scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Пояснення

  • Функція scale_y_continuous() керує осі
  • Функція scale_x_continuous() керує вісь x.
  • Параметр breaks керує розділенням осі. Ви можете вручну додати послідовність чисел або скористатися функцією seq():
    • seq(1, 3.6, by = 0.2): Створити послідовність від 1 до 3.6 з кроком 0.2, тобто 14 точок зупинки
    • seq(1, 1.6, by = 0.1): Створити сім чисел від 1 до 1.6 з кроком 0.1

вихід:

Керуйте вагами

тема

Зрештою, ggplot2 дозволяє змінювати стиль усього сюжету за допомогою однієї функції теми. У пакеті постачається вісім повних тем:

  • theme_bw()
  • theme_light()
  • класична_тема()
  • theme_linedraw()
  • theme_dark()
  • theme_minimal()
  • theme_gray()
  • theme_void()
my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

вихід:

тема

Зберегти ділянки

Після всіх цих кроків настав час зберегти та поділитися вашим графіком. Викличте функцію ggsave(“name_of_the_file.png”) одразу після побудови графіка, і зображення буде записано на диск.

Графік зберігається в робочому каталозі. Щоб перевірити робочий каталог, ви можете запустити цей код:

directory <- getwd()
directory

Побудуйте готовий графік, збережіть його та перевірте, де він зупинився:

my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

вихід:

Зберегти ділянки

ggsave("my_fantastic_plot.png")

вихід:

## Saving 5 x 4 in image

Примітка:: Лише з педагогічною метою ми створили функцію під назвою open_folder(), щоб відкрити для вас папку каталогу. Вам просто потрібно запустити наведений нижче код і побачити, де зберігається зображення. Ви повинні побачити імена файлів my_fantastic_plot.png.

# Run this code to create the function
open_folder <- function(dir) {
    if (.Platform['OS.type'] == "windows") {
        shell.exec(dir)
    } else {
        system(paste(Sys.getenv("R_BROWSER"), dir))
    }
}

# Call the function to open the folder
open_folder(directory)

Як створити фасетовані діаграми розсіювання в R за допомогою facet_wrap()

Фасетування – один із восьми компонентів ggplot2, перелічених раніше, і це найчистіша відповідь на переповнену діаграму. Замість того, щоб втискати кожну групу в одну панель, ggplot2 малює невеликий кратний для кожного рівня змінної, всі в однакових масштабах, щоб панелі залишалися порівнянними.

# One panel per gear count
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point() +
    facet_wrap(~ gear) +
    theme_classic()

Три аргументи виконують більшу частину роботи.

  • кол or нурувати: примусово розмістити панелі у заданому макеті, наприклад facet_wrap(~ gear, ncol = 2).
  • ваги: за замовчуванням «фіксовано», тому кожна панель має один спільний діапазон осей. Використовуйте «free_y» або «free», коли групи суттєво відрізняються за величиною, але майте на увазі, що вільні масштаби роблять візуальне порівняння між панелями оманливим.
  • етикетувальний верстат: замінює рівень необробленого коефіцієнта в кожній смузі, наприклад, labeller = label_both для друку «gear: 4» замість «4».

Дві групиping змінні. Використайте facet_grid() для побудови матриці панелей, де перша змінна розподіляється по рядках, а друга – по стовпцях:

ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point(aes(color = factor(cyl))) +
    facet_grid(am ~ gear) +
    theme_classic()

Грані чи кольори? Колір добре працює приблизно для чотирьох груп на діаграмі з обмеженим перекриттям. Після цього, або коли групи сильно перекриваються, фасетування легше читати, оскільки кожна панель містить лише свої власні точки. Ви можете комбінувати обидва: фасетування за однією змінною та колір за іншою, як у прикладі facet_grid() вище.

Як обробляти перенаповнення на точкових діаграмах R

При кількох десятках спостережень видно кожну точку. При тисячах маркери накладаються один на одного, і найщільніша область просто зчитується як суцільна пляма. Тобто надмірне планування, а ggplot2 пропонує чотири стандартні засоби вирішення проблеми.

1. Зменште непрозорість. Найдешевше виправлення. Перекриттяping точки темніють природним чином, тому стає помітною щільність:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    theme_classic()

2. Дискретні значення джиттера. Коли змінна приймає лише кілька значень, точки потрапляють на однакові координати. Їх розділяє невелике випадкове зміщення:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
    geom_jitter(width = 0.15, height = 0) +
    theme_classic()

Встановіть висоту = 0, щоб значення y, які несуть реальну інформацію, ніколи не змінювалися.

3. Викиньте літак. Для великих наборів даних підраховуйте спостереження для кожної комірки та позначте кількість кольором. Шестикутні контейнери уникають візуальних артефактів, які створюють квадратні контейнери:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_hex(bins = 40) +
    theme_classic()

4. Намалюйте контури щільності. Контурні лінії окреслюють області, де зосереджені спостереження, і вони акуратно нашаровуються на збляклі точки:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    geom_density_2d(color = "#C42126") +
    theme_classic()

Як правило, альфа обробляє кілька тисяч точок, гексагональне бінінгування — десятки тисяч, а вибірка даних за допомогою dplyr::slice_sample() є прагматичним варіантом після цього.

Точкова діаграма в R: Code Посилання

У таблиці нижче наведено виклик ggplot2 для кожного з описаних вище параметрів:

Мета Code
Основна діаграма розсіювання
ggplot(df, aes(x = x1, y = y)) + geom_point()
Точкова діаграма з групою кольорів
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
Додайте відповідні значення
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
Додайте заголовок
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
Додайте субтитри
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
Перейменувати x
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
Перейменувати y
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
Контролюйте масштаб
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1))
Створення журналів
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
тема
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
Аспект групою
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
Обробка перекреслення
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
Зберегти
ggsave("my_fantastic_plot.png")

Поширені запитання

geom_point() відображає кожне спостереження в його точних координатах. geom_jitter() додає невелике випадкове зміщення, щоб точки з однаковим значенням стали помітними, що важливо, коли одна вісь містить дискретні значення.

Всередині aes() колір відображає змінну, тому ggplot2 призначає один відтінок для кожного рівня та будує легенду. Зовні aes() колір є фіксованою константою, що застосовується до кожної точки, і легенда не відображається.

Додайте stat_smooth(method = “lm”) або geom_smooth(method = “lm”) після geom_point(). Встановіть se = FALSE, щоб приховати довірчу зону, та використовуйте method = “loess” для нелінійного згладжування.

Діаграми розсіювання показують кореляцію ознак та викиди до навчання, і вони є стандартним способом відображення передбачуваних значень відносно фактичних або візуалізації кластерів після зменшення розмірності за допомогою PCA або t-SNE.

Так. Помічники ШІ можуть створювати шари, пропонувати виправлення надмірного нанесення та пояснювати помилки, такі як відсутня обгортка aes(). Запустіть згенерований код на власних даних, оскільки назви стовпців та типи факторів легко помилитися.

Підсумуйте цей пост за допомогою: