Вот один из способов сделать это, используя в качестве примера данные VADeaths
(по умолчанию они будут в вашем рабочем пространстве R, или, если нет, используйте library(datasets)
).
bar <- barplot(VADeaths)
text(rep(bar,each=nrow(VADeaths)), as.vector(apply(VADeaths,2,cumsum)),
labels=as.vector(apply(VADeaths,2,cumsum)),pos=3)
Этовыглядит следующим образом:
Чтобы изменить размер шрифта, вы можете использовать text(...,cex=2)
, чтобы сделать вещи в два раза больше, чем они были, например
Теперь,давайте объясним этот код, чтобы вы знали, как это сделать самостоятельно!
Сначала давайте рассмотрим VADeaths
: это подсчет смертей в каждой возрастной группе по категориям:
> VADeaths
Rural Male Rural Female Urban Male Urban Female
50-54 11.7 8.7 15.4 8.4
55-59 18.1 11.7 24.3 13.6
60-64 26.9 20.3 37.0 19.3
65-69 41.0 30.9 54.6 35.1
70-74 66.0 54.3 71.1 50.0
ТеперьЧтобы сделать текст на графике, мы в основном рисуем график, а , затем рисуем текст сверху, используя команду R text
(см. ?text
).
text
требуются координаты x, y и соответствующие фрагменты текста для рисования на линейчатой диаграмме.Мы дадим ему координаты каждой линии на линейчатой диаграмме для рисования текста.
Для этого см. Раздел «Значение» ?barplot
.Эта функция не только строит график вашего бара, но и возвращает координату x каждого бара.оценка!
> bar <- barplot(VADeaths)
> bar
[1] 0.7 1.9 3.1 4.3
Теперь все, что нам нужно, это координаты y, чтобы идти с нашими координатами x.
Ну, а столбчатая диаграмма с полосами просто подсчитывает частоты в VADeaths
, когда вы идете дальше.,Например, в группе «Сельские мужчины» первая линия отображается в 11.7
, а вторая - в 11.7 + 18.1 = 29.8
, третья - в 11.7 + 18.1 + 26.9 = 56.7
и т. Д. (См. Значения в VADeaths
)..
Итак, наши координаты y должны быть кумулятивными суммами, идущими по столбцам.
Чтобы вычислить их для каждого столбца, мы можем использовать cumsum
.Например,
> cumsum(c(1,2,3,4,5))
[1] 1 3 6 10 15
Поскольку мы хотим сделать это для каждого столбца в VADeaths
, мы должны использовать функцию apply
.
> apply(VADeaths,2,cumsum)
Rural Male Rural Female Urban Male Urban Female
50-54 11.7 8.7 15.4 8.4
55-59 29.8 20.4 39.7 22.0
60-64 56.7 40.7 76.7 41.3
65-69 97.7 71.6 131.3 76.4
70-74 163.7 125.9 202.4 126.4
apply(VADeaths,2,cumsum)
означает: «Для каждого столбца в VADeaths
вычислите cumsum
этого».Это дает нам значения у для каждой линии гистограммы.
Давайте сохраним эти значения y для дальнейшего использования:
> yvals <- as.vector(apply(VADeaths,2,cumsum))
Причина, по которой я использую as.vector
, заключается просто в том, чтобы сгладить матрицу в вектор значений - это упрощает построение графиков.
И последнее: мои значения х (которые я хранил в bar
) имеют только одно значение на бар, но мне нужно расширить его, чтобы на каждой строке было одно значение х на строку.Для этого:
> xvals <- rep(bar,each=nrow(VADeaths))
Это превратит мой предыдущий x1,x2,x3,x4
в x1,x1,x1,x1,x1, x2,x2,x2,x2,x2, ..., x4,x4,x4,x4,x4
.Теперь мои xvals
соответствуют моим yvals
.
После этого это просто случай использования text
.
> text( xvals, yvals, labels=yvals, pos=3 )
Аргументы labels
говорят text
, какой текстпоставить на х / у позиции.pos=3
означает «рисовать каждый бит текста чуть выше моего указанного значения x / y».В противном случае цифры будут нарисованы по линиям графика, которые будет трудно читать.
Теперь, есть много вариантов настройки положения и размера текста, и я предлагаю вам прочитать ?text
, чтобысм. их.
Весь этот код сокращается до двух строк, которые я дал в начале ответа, но эта версия может быть немного более понятной:
bar <- barplot(VADeaths)
xvals <- rep(bar,each=nrow(VADeaths))
yvals <- as.vector(apply(VADeaths,2,cumsum))
text( xvals, yvals, labels=yvals, pos=3 )