Гистограмма явлется важным инструментом статистики, позволяющим наглядно представить распределение значений анализируемой переменной. В системе R для построения гистограмм служит функция hist(). Ее основным аргументом выступает имя анализируемой переменной. В качестве примера создадим нармально распределенную совокупность X из 100 наблюдений со средним значением 15 и стандартным отклонением 5:

X <- rnorm(n = 100, mean = 15, sd  = 5)

Для создания переменной X использована функция rnorm() (от random - случайный, и norm - нормальный). Используя генератор случайных чисел, эта функция формирует нормально распределенные совокупности с заданными размером (n), средним значением (mean) и стандартным отклонением (sd).

Изобразить значения переменной X в виде гистограммы очень просто:

hist(X)


Как видно из приведенного рисунка, функция hist() автоматически выбирает количество столбцов для отображения на графике, а также создает названия осей и заголовок графика. Такого рисунка, получаемого с использованием автоматических настроек, может оказаться вполне достаточно (например, при проведении быстрого разведочного анализа данных). Однако часто требуется его дополнительная доработка.

Прежде всего, важно обратить внимание на размер шага, используемого для разбиения данных на классы при построении гистограммы. В приведенном выше примере программа автоматически разбила значения переменной X на классы с шагом 5. Однако такое грубое разбиение может замаскировать истинные свойства анализируемой совокупности. Для более детального изучения этих свойств следует выбрать более дробное деление данных на классы (т.е. использовать меньший шаг). Сделать это позволяет аргумент breaks (разломы) функции hist():

hist(X, breaks = 20)


Как видим, результатом выполнения предыдущей команды стала гистограмма с двадцатью столбцами, позволяющая более детально проанализировать распределение значений переменной X.

По умолчанию функция hist() отображает по оси ординат частоты встречаемости для каждого класса значений X. Такое поведение функции можно изменить, придав аргументу freq (от frequency - частота) значение FALSE. В этом случае ось ординат будет отражать плотность вероятности каждого класса так, что суммарна площадь под гистограммой составит 1:

hist(X, breaks = 20, freq = FALSE)


При необходимости, столбцы гистограммы можно закрасить желаемым цветом. Для этого следует воспользоваться аргументом col (от color - цвет) - это тот же аргумент, который мы использовали при рассмотрении настроек функции plot()  (см. здесь и здесь):

hist(X, breaks = 20, freq = FALSE, col = "lightblue")


В приведенном примере выбран светло-голубой цвет столбцов ("lightblue").

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

X <- rnorm(n = 50, mean = 15, sd  = 5)
hist(X, breaks = 20, freq = FALSE, col = "lightblue")


Вместо гистограммы (или в добавок к ней) в таких случаях стоит воспользоваться кривой плотности вероятности. Оценка плотности вероятности выполняется при помощи функции density(), которую можно применить в качестве аргумента функции plot() для графического изображения результата:



Гладкость получаемой кривой контролируется при помощи аргумента bw (от bandwidth - полоса пропускания), например:

plot(density(X, bw = 0.8))


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

hist(X, breaks = 20, freq = FALSE, col = "lightblue",
      xlab = "Переменная X",
      ylab = "Плотность вероятности",
      main = "Гистограмма, совмещенная с кривой плотности")
lines(density(X), col = "red", lwd = 2)


Обратите внимание на дополнительные аргументы, использованные вместе с функцией hist()xlab и ylab - для создания названий осей, и main - для создания заголовка рисунка. Аналогично, в качестве управляющих аргументов функции lines() были применены аргументы col (для установки цвета линии) и lwd (для установки толщины линии). Эти же аргументы мы использовали ранее при построении графиков c помощью функции plot() (см. здесь и здесь). Приведенные примеры показывают универсальность этих и целого ряда других аргументов, управляющих поведением plot(), hist() и других графических функций R высокого уровня.

13 Комментарии

Анонимный написал(а)…
А возможно нарисовать в одних осях несколько графиков?
Sergey Mastitsky написал(а)…
Каких именно графиков? Какова задача?
Миша написал(а)…
Ну, например, графики синуса и косинуса нарисовать в одних координатных осях.
Sergey Mastitsky написал(а)…
Например, так:

f1 <- function(x) 5*cos(x)
f2 <- function(x) 2*sin(x)
x<-seq(0, 2*pi, 0.01)
matplot(x,cbind(f1(x),f2(x)),type="l",col=c("red","blue"))
Миша написал(а)…
Спасибо!
Анонимный написал(а)…
Добрый день. Столкнулся с такой проблемой, запускаю скрипт, который рисует несколько графиков, а отображается только последний. Как реализовать возможность открытия каждого графика в новом окне ?
Анонимный написал(а)…
Добрый день,как нарисовать plot относительной частоты ( точки - это вершины гистограммы). Она не является кривой плотности.
Sergey Mastitsky написал(а)…
Ваш вопрос мне непонятен. Кто "она", которая "не является кривой плотности"?
Возможно, Вы имеете в виду это?: http://r-analytics.blogspot.de/2011/11/r_11.html#.UnZQ_8jf-Hs
Unknown написал(а)…
Этот комментарий был удален автором.
Sergey Mastitsky написал(а)…
Ольга, см. http://r-analytics.blogspot.co.uk/2011/10/r-plot.html
... а также ?axis
Ivan написал(а)…
Здравствуйте, подскажите как нарисовать график, имеется таблица типа |ФИО пациента|Данные до лечения|Данные после лечения|, необходимо на графике отразить как поменялись данные после лечения. Пробовал построить через plot(Данные до лечения, type ='l', col='red',lwd=2, main='График') и добавлением к этому графику линии lines(Данные после лечения, col='green', lwd=2), но особо ничего не получилось. Подскажите как лучше это сделать. Заранее спасибо.
Айжан написал(а)…
Объяснили очень доступно! Спасибо!
Новые Старые