08 октября 2011

Базовые графические возможности R: функция plot()



Как сказано в известной книге Джона Чемберса и соавт. (Chambers J.M. et al. (1983) Graphical Methods for Data Analysis), "...нет статистического метода более мощного, чем хорошо подобранный график". Действительно, графическое представление данных играет очень важную роль в статистике. Например, графики являются неотъемлемой частью разведочного анализа данных, позволяют выявлять паттерны и тренды в сложных наборах данных, а также могут непосредственно быть результатом статистического анализа (см., например, деревья классификации).

Этим сообщением я запускаю серию статей, посвященных базовым графическим возможностям R. Начнем с функции plot() - главной "рабочей лошадки", используемой для построения графиков в R. Поведение этой функции высокого уровня определяется классом объектов, указываемых в качестве ее аргументов. Соответственно, с помощью plot() можно создать очень большой набор разнотипных графиков.

В качестве примера используем данные по скорости выведения индометацина из организма человека (Kwan K.C. et al. (1976) Kinetics of Indomethacin absorption, elimination, and enterohepatic circulation in man. Journal of Pharmacokinetics and Biopharmaceutics 4, 255–280). Индометацин представляет собой один из наиболее активных противовоспалительных препаратов (подробнее см. здесь). В эксперименте приняли участие шесть испытуемых. Результаты этого исследования входят в базовый набор данных R и доступны по команде


Применив команду

names(Indometh)
[1] "Subject"   "time"   "conc"

видим, что в состав таблицы Indometh входят переменные Subject (испытуемый), time (время с момента введения препарата) и conc (концентрация препарата в крови). Чтобы облегчить дальнейшую работу, прикрепим таблицу Indometh к поисковому пути R:


Благодаря этой команде, теперь мы  можем напрямую обращаться к переменным таблицы Indometh (т.е. использовать их имена непосредственно, например, time вместо Indometh$time; подробнее об обращении к отдельным элементам таблиц с данными см. здесь).

Зависимость концентрации индометацина в крови от времени можно легко изобразить при помощи следующей команды:

plot(time, conc)


Предположим, что перед нами стоит задача отобразить на графике не все исходные данные, а только средние значения концентрации индометацина для каждой временной точки. Рассчитать средние значения (или любые другие количественные величины) для отдельных групп данных позволяет функция tapply() (от table - таблица, и apply - применять; подробнее см. ?tapply):

means <- tapply(conc, time, mean)
means
      0.25        0.5       0.75          1       1.25          2          3 
2.07666667 1.32166667 0.91833333 0.68333333 0.55666667 0.33166667 0.19833333 
         4          5          6          8 
0.13666667 0.12500000 0.09000000 0.07166667

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

names(means)
[1] "0.25" "0.5"  "0.75" "1"  "1.25" "2"  "3"  "4"  "5"  "6"  "8" 

Мы можем воспользоваться этим обстоятельством при построении графика следующим образом:

# создаем числовой вектор со значениями времени учета концентрации препарата:
indo.times <- as.numeric(names(means))
 
# строим график:
plot(indo.times, means)


Управляющие параметры функции plot()

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

1. Параметры  xlab и ylab

Параметры xlab и ylab служат для изменения названий осей X и Y соответственно:
plot(indo.times, means, xlab = "Время", ylab = "Концентрация")


2. Параметр type

Параметр type позволяет изменять внешний вид точек на графике. Он принимает одно из следующих текстовых значений:
  • "p" - точки (points; используется по умолчанию)
  • "l" - линии (lines)
  • "b" - изображаются и точки, и линии (both points and lines)
  • "o" - точки изображаются поверх линий (points over lines)
  • "h" - гистограмма (histogram)
  • "s" - ступенчатая кривая (steps)
  • "n" - данные не отображаются (no points)

Примеры использования перечисленных значений аргумента type приведены ниже:



3. Параметры xlim и ylim

Эти два параметра контролирут размах значений на каждой из осей графика. По умолчанию они оба принимают значение NULL - в этом случае размах выбирается программой автоматически. Для отмены автоматических настроек соответствующему параметру необходимо присвоить значение в виде числового вектора, содержащего минимальное и максимальное значения, которые должны отображаться на оси. Например:
plot(indo.times, means, xlab="Время", ylab="Концентрация", xlim=c(0, 15))
plot(indo.times, means, xlab="Время", ylab="Концентрация", ylim=c(0, 5))


4. Параметры axes и ann

Эти два параметра контролируют отображение осей и их названий соответственно. Каждый из них может принимать два значения - TRUE или FALSE:

plot(indo.times, means, xlab = "Время", ylab = "Концентрация",
       axes = TRUE, ann = TRUE)
plot(indo.times, means, xlab = "Время", ylab = "Концентрация",
       axes = FALSE, ann = TRUE)
plot(indo.times, means, xlab = "Время", ylab = "Концентрация",
       axes = TRUE, ann = FALSE)




5. Параметр log

При помощи аргумента log можно перевести одну или обе оси графика на логарифмическую шкалу, например:
plot(indo.times, means, xlab = "Время", ylab = "Концентрация", log = "x")
plot(indo.times, means, xlab = "Время", ylab = "Концентрация", log = "y")
plot(indo.times, means, xlab = "Время", ylab = "Концентрация", log = "xy")



6. Параметр main

Аргумент main служит для создания названия графика. По умолчанию название размещается в верхней части рисунка:

plot(indo.times, means, xlab = "Время", ylab = "Концентрация",
       main = "Скорость выведения индометацина", type = "o")


В последующих сообщениях будут рассмотрены многие другие графические параметры функции plot(), контролирущие внешний вид графиков (например, тип, размер и цвет маркеров и линий, тип и размер шрифта в названиях графика и его осей, использование математических символов в названиях, размещение легенды, и т.п.). Интересующиеся графическими возможностями R могут посетить сайт R Graph Gallery, где представлены не только примеры всевозможных графиков, но и исходный R-код, использованный для их построения.

4 комментария :

Анонимный комментирует...

Добрый день, я уже отчаялась найти простое нормальное объяснение, как просто присвоить всем точкам на графике их значения, от 1 до 79, которые собственно и выводятся на моем графике. Для интерпритации графика мне это необходимо, а как это сделать, простая команда в RStudio - нигде не найти, может вы подскажете? Заранее огромное спасибо!

Sergey Mastitsky комментирует...

Не понятно, почему Вы путаете R с RStudio... В RStudio такой команды действительно нет, а в R есть простая функция text() - сложно представить, что в ходе Ваших поисков Вы на нее не наткнулись - где искали?

Анонимный комментирует...

Подскажите, пожалуйста, можно ли соединить несколько графиков в один? Никак не могу найти, как это можно сделать. Заранее спасибо!

Анонимный комментирует...

Здравствуйте. Скажите пожалуйста, можно ли в R подписать координаты точек на самом графике? То есть грубо говоря, есть 5 точек, они соединены линией (при помощи geom_line) и я хочу, чтобы на графике возле каждой точки стояла её координата. Это вообще возможно?

Отправить комментарий