среда, 24 февраля 2016 г.

Строим простые графики в R


Линейные графики

Сначала создадим простой график, используя значения вектора car:

# Определяем вектор cars с 5 значениями
cars <- 3="" 4="" 6="" 9="" br="" c="" clear="none"># Строим график вектора cars с настройками по умолчанию
plot(cars)

Добавим название графика, линию, соединяющую точки, и раскрасим его:

> # Строим график cars, используя точки синего цвета, соединенные линией
> plot(cars, type="o", col="blue")

> # Добавим название красного цвета жирным курсивом
> title(main="Autos", col.main="red", font.main=4)

Теперь давайте добавим красную линию для грузовиков и зададим диапазон оси y, чтобы вместить данные по грузовикам:

> # Определяем 2 вектора
> cars <- 3="" 4="" 6="" 9="" c="" span="">> trucks <- 12="" 4="" 5="" c="" span="">> # Диапазон оси y для графика cars  от 0 до 12
> plot(cars, type="o", col="blue", ylim=c(0,12))
> # Строим график trucks пунктирной красной линией с квадратными маркерами
> lines(trucks, type="o", pch=22, lty=2, col="red")
> # Добавляем название красным жирным курсивом
> title(main="Autos", col.main="red", font.main=4)

Далее изменим подписи осей, чтобы они соответствовали данным, и добавим легенду. Также мы рассчитаем значения диапазона для оси y c помощью функции max, чтобы любые изменения в наших данных автоматически отражались бы на нашем графике.

> # Рассчитываем диапазон от 0 до максимального значения cars и trucks
> g_range <- br="" cars="" clear="none" range="" trucks="">
> # График autos использует ось y и диапазон от 0 до максимального значения
> # в векторах cars или trucks.  Отключаем оси и подписи
> # чтобы добавить их отдельно
> plot(cars, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)

> # Добавим ось x, размеченную днями недели
> axis(1, at=1:5, lab=c("Mon","Tue","Wed","Thu","Fri"))

> # Добавляем ось y с горизонтальными подписями
> # и ценой деления 4. 4*0:g_range[2] эквивалентно c(0,4,8,12).
> axis(2, las=1, at=4*0:g_range[2])

> # Создаем рамку вокруг графика
> box()

> # Строим график trucks пунктирной красной линией с квадратными маркерами
> lines(trucks, type="o", pch=22, lty=2, col="red")

> # Добавляем название красным жирным курсивом
> title(main="Autos", col.main="red", font.main=4)

> # Создаем подписи осей x и y темно-зеленого цвета
> title(xlab="Days", col.lab=rgb(0,0.5,0))
> title(ylab="Total", col.lab=rgb(0,0.5,0))

> # Создаем легенду на (1, g_range[2]), немного меньшего размера (cex)
> # с использованием тех же цветов линий и точек, что и графики
> legend(1, g_range[2], c("cars","trucks"), cex=0.8, col=c("blue","red"), pch=21:22, lty=1:2);

Теперь давайте загрузим данные для графика напрямую из файла. В файле будут дополнительные данные для нашего набора, разделенные табуляцией, и он будет лежать в директории C:/R.

autos.dat

cars    trucks    suvs

1    2    4
3    5    4
6    4    6
4    5    6
9    12    16

Также для хранения цветов, использующихся в нашем графике, мы будем использовать вектор, поэтому если позже вы захотите поменять цвета, для этого необходимо будет отредактировать только одну строку. В конце мы сохраним график в файле PNG.

> # Читаем значения car и truck из файла autos.dat
> autos_data <- autos.dat="" br="" clear="none" header="T," read.table="" sep="\t">
> # находим в данных максимальное значение для y
> max_y <- autos_data="" br="" clear="none" max="">
> # задаем цвета для cars, trucks, suvs
> plot_colors <- blue="" br="" c="" clear="none" forestgreen="" red="">
> # указываем файл для сохранения графика в PNG
> png(filename="C:/R/figure.png", height=295, width=300, bg="white")

> # график autos использует ось y с диапазоном от 0 до max_y.
> # Отключаем оси и подписи, чтобы добавить их отдельно
> plot(autos_data$cars, type="o", col=plot_colors[1], ylim=c(0,max_y), axes=FALSE, ann=FALSE)

> # Добавим ось x, размеченную днями недели
> axis(1, at=1:5, lab=c("Mon", "Tue", "Wed", "Thu", "Fri"))

> # Добавляем ось y с горизонтальными подписями
> # и ценой деления 4. 4*0:max_y эквивалентно c(0,4,8,12).
> axis(2, las=1, at=4*0:max_y)

> # Создаем рамку вокруг графика
> box()

> # Строим график trucks пунктирной красной линией с квадратными маркерами
> lines(autos_data$trucks, type="o", pch=22, lty=2, col=plot_colors[2])

> # Строим график suvs зеленым точечным пунктиром с ромбовидными маркерами
> lines(autos_data$suvs, type="o", pch=23, lty=3, col=plot_colors[3])

> # Добавляем название красным жирным курсивом
> title(main="Autos", col.main="red", font.main=4)

> # Создаем подписи осей x и y темно-зеленого цвета
> title(xlab= "Days", col.lab=rgb(0,0.5,0))
> title(ylab= "Total", col.lab=rgb(0,0.5,0))

> # Создаем легенду на (1, max_y) немного меньшего размера (cex)
> # с использованием тех же цветов линий и точек, что и графики
> legend(1, max_y, names(autos_data), cex=0.8, col=plot_colors, pch=21:23, lty=1:3);

> # Отключаем драйвер устройства (чтобы избавиться от вывода в png)
> dev.off()
null device 
          1 
В следующем примере мы сохраним файл в формате PDF и обрежем лишнее пространство вокруг графика, это полезно, если позже мы будем использовать его в документах LaTeX. Мы также увеличим толщину линий, уменьшим шрифт для подписей оси и наклоним подписи оси x под углом 45 градусов.

> # задаем цвета для cars, trucks, suvs
> plot_colors <- br="" c="" clear="none" forestgreen="" r="0.0,g=0.0,b=0.9)," red="" rgb="">
> # Запускаем драйвер устройства PDF для сохранения вывода в figure.pdf
> pdf(file="C:/R/figure.pdf", height=3.5, width=5)

> # Убираем лишнее пустое пространство (снизу, слева, сверху, справа)
> par(mar=c(4.2, 3.8, 0.2, 0.2))

> # График autos использует ось y с полным диапазоном значений данных  в autos
> # В подписях осей используются линии большей толщины и шрифт меньшего размера
> plot(autos_data$cars, type="l", col=plot_colors[1], ylim=range(autos_data), axes=F, ann=T, xlab="Days",ylab="Total", cex.lab=0.8, lwd=2)

> # Уберем подписи с делений оси x
> axis(1, lab=F)

> # Добавим к делениям оси x подписи под углом 45 градусов
> text(axTicks(1), par("usr")[3] - 2, srt=45, adj=1, labels=c("Mon", "Tue", "Wed", "Thu", "Fri"),xpd=T, cex=0.8)

> # Добавим ось y с уменьшенными горизонтальными подписями
> axis(2, las=1, cex.axis=0.8)

> # Создаем рамку вокруг графика
> box()

> # График trucks с более толстой красной пунктирной линией
> lines(autos_data$trucks, type="l", lty=2, lwd=2,
+ col=plot_colors[2])

> # График suvs с более толстой зеленой точечной пунктирной линией
> lines(autos_data$suvs, type="l", lty=3, lwd=2, col=plot_colors[3])

> # Добавляем легенду в левом верхнем углу
> # немного меньшего размера и без рамки
> legend("topleft", names(autos_data), cex=0.8, col=plot_colors, lty=1:3, lwd=2, bty="n");

> # Отключаем драйвер устройства (чтобы избавиться от вывода в PDF)
> dev.off()
RStudioGD 
        2 
> # Восстанавливаем поля по умолчанию
> par(mar=c(5, 4, 4, 2) + 0.1)


Гистограммы

Давайте начнем с простой гистораммы вектора cars:

> # Постоим график
> barplot(cars)
Теперь возьмем данные из файла autos.dat, добавим подписи, синюю окантовку баров и штриховку переменной плотности:

> # Строим график cars с заданными подписями осей.
> # Используем синюю окантовку баров и диагональную штриховку.
> barplot(autos_data$cars, main="Cars", xlab="Days",  ylab="Total", names.arg=c("Mon","Tue","Wed","Thu","Fri"), border="blue", density=c(10,20,30,40,50))

Теперь построим график количества машин в день, используя разные цвета, и добавим легенду:

> # Строим график с соседними барами, раскрашенными в цвета радуги
> barplot(as.matrix(autos_data), main="Autos", ylab= "Total",beside=TRUE, col=rainbow(5))

> # Помещаем легенду в левый верхний угол без рамок, используя цвета радуги
> legend("topleft", c("Mon","Tue","Wed","Thu","Fri"), cex=0.6, bty="n", fill=rainbow(5));

Давайте построим график общего количества машин в день, используя гистограмму с накоплением, и разместим легенду за пределами области графика:

> # Расширяем правую сторону прямоугольника, чтобы освободить там место для легенды
> par(xpd=T, mar=par()$mar+c(0,0,0,4))

> # Строим график autos (транспонированная матрица), используя тепловые цвета,
> # с расстоянием10% между соседними барами,  и добавляем  уменьшенные подписи  оси y
> barplot(t(autos_data), main="Autos", ylab="Total", col=heat.colors(3), space=0.1, cex.axis=0.8, las=1,names.arg=c("Mon","Tue","Wed","Thu","Fri"), cex=0.8)

> # Помещаем легенду на (6,30), используя тепловые цвета
> legend(6, 30, names(autos_data), cex=0.8, fill=heat.colors(3));

> # Восстанавливаем размеры прямоугольника по умолчанию
> par(mar=c(5, 4, 4, 2) + 0.1)
Гистограммы распределений

Давайте построим простую гистограмму, отражающую распределение значений вектора suvs:

> # Создаем гистограмму для suvs
> hist(suvs)

Теперь возьмем данные из файла autos.dat и построим комбинированную цветную гистограмму для car, truck и suv:

> # Объединяем три вектора
> autos <- autos_data="" br="" c="" cars="" clear="none" suvs="" trucks="">
> # Создаем гистограмму голубого цвета для autos с осью y
> # ranging from 0-10
> hist(autos, col="lightblue", ylim=c(0,10))
Теперь изменим разрывы, чтобы значения не группировались вместе, и развернем подписи оси y горизонтально.   

> # Рассчитываем наибольшее значение y, используемое в autos
> max_num <- autos="" br="" clear="none" max="">
> # Создаем гистограмму для autos в тепловых цветах, устанавливаем разрывы
> # чтобы каждое число было в собственной группе, зададим диапазон оси x 0-max_num
> # добавим заголовок и сделаем подписи для оси y горизонтальными
> # а также отключаем закрытость справа интервалов гистограммы
> hist(autos, col=heat.colors(max_num), breaks=max_num, xlim=c(0,max_num), right=F, main="Autos Histogram", las=1)

Далее создадим гистограмму распределения плотности вероятности с неравными интервалами.

> # Создадим неравные интервалы
> brk <- br="" c="" clear="none">
> # Создаем гистограмму для autos в тепловых цветах, устанавливаем неравные интервалы
> # чтобы каждое число было в собственной группе, зададим диапазон оси x 0-max_num
> # добавим заголовок и сделаем подписи для оси y горизонтальными
> # а также отключаем закрытость справа интервалов гистограммы
> # Уменьшим размер подписей осей, сделаем площадь каждого столбца
> # пропорциональной числу
> hist(autos, col=heat.colors(length(brk)), breaks=brk, xlim=c(0,max_num), right=F, main="Probability Density", las=1, cex.axis=0.8, freq=F)

В этом примере мы построим гистограмму распределения 1000 случайных чисел, подчиняющихся логнормальному распределению.

> # Создадим логнормально распределенную выборку
> r <- rlnorm="" span="">> hist(r)


Так как логнормальные распределения обычно лучше выглядят в логарифмических координатах, давайте воспользуемся функцией plot для того, чтобы показать распределение в виде точечного графика.   

> # Получим распределение без его визуализации, используя фиксированные интервалы
> h <- .1="" breaks="c(seq(0,max(r)+1," hist="" plot="F," r="" span="">> # Построим точечный график распределения синего цвета в логарифмической шкале
> plot(h$counts, log="xy", pch=20, col="blue",main="Log-normal distribution", xlab="Value", ylab="Frequency")
Круговые диаграммы

Давайте начнем с простой диаграммы, отбражающей вектор cars:

> # Создаем круговую диаграмму для cars
> pie(cars)
Теперь добавим заголовок, изменим цвета и зададим собственные подписи:

> # Создаем круговую диаграмму с заголовком, выбранными цветами и подписями
> pie(cars, main="Cars", col=rainbow(length(cars)), labels=c("Mon","Tue","Wed","Thu","Fri"))

Теперь давайте изменим цвета, подписи сделаем в процентах и добавим легенду:

> # Зададим цвета, идеально подходящие для черно-белой печати
> colors <- black="" c="" grey50="" grey70="" grey90="" span="" white="">> # Рассчитаем процент для каждого дня, округленный до целого
> car_labels <- 100="" 1="" cars="" round="" span="" sum="">> # Добавим символ '%' после каждого значения
> car_labels <- car_labels="" paste="" sep="" span="">> # создадим круговую диаграмму с заданными заголовком, цветами и подписями
> pie(cars, main="Cars", col=colors, labels=car_labels,
+ cex=0.8)
> # Справа создадим легенду
> legend(1.5, 0.5, c("Mon","Tue","Wed","Thu","Fri"), cex=0.8, fill=colors)

Точечные графики

Начем с простого точечного графика, отбражающего данные autos

> # Создаем точечный график для autos
> dotchart(t(autos_data))

Сделаем точечный график более красочным:   

> # создаем цветной точечный график для autos с уменьшенными подписями
> dotchart(t(autos_data), color=c("red","blue","darkgreen"), main="Dotchart for Autos", cex=0.8)
В этом примере показывается 25 символов, которые вы можете использовать в в качестве точек в ваших графиках:

> # Создаем пустой график
> plot(1, 1, xlim=c(1,5.5), ylim=c(0,7), type="n", ann=FALSE)
> # Строим цифры 0-4 с увеличением размера и изменением цвета точек
> text(1:5, rep(6,5), labels=c(0:4), cex=1:5, col=1:5)
> # Строим символы 0-4 с увеличением размера и изменением цвета точек
> points(1:5, rep(5,5), cex=1:5, col=1:5, pch=0:4)
> text((1:5)+0.4, rep(5,5), cex=0.6, (0:4))
> #Строим символы 5-9 с подписями
> points(1:5, rep(4,5), cex=2, pch=(5:9))
> text((1:5)+0.4, rep(4,5), cex=0.6, (5:9))
> # Строим символы 10-14 с подписями
> points(1:5, rep(3,5), cex=2, pch=(10:14))
> text((1:5)+0.4, rep(3,5), cex=0.6, (10:14))
> # Строим символы 15-19 с подписями
> points(1:5, rep(2,5), cex=2, pch=(15:19))
> text((1:5)+0.4, rep(2,5), cex=0.6, (15:19))
> # Строим символы 20-25 с подписями
> points((1:6)*0.8+0.2, rep(1,6), cex=2, pch=(20:25))
> text((1:6)*0.8+0.5, rep(1,6), cex=0.6, (20:25))

Комментариев нет:

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