Вот один из способов сделать это, используя данные 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
Теперь, чтобы сделать текст на barplot, мы в основном рисовать barplot и затем нарисуйте текст сверху с помощью команды 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 для каждой строки графика штрихов.
Давайте сохраним этот для дальнейшего, Y. использования:
> yvals <- as.vector(apply(VADeaths,2,cumsum))
Причины я использую as.vector
только для выравнивания матрицы в вектор значений - это делает черчение проще.
Последнее значение - мои значения x (которые я сохранил в 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)
Большого спасибо – jinni