R размер этикетки барплота для каждого образца - PullRequest
2 голосов
/ 19 января 2012

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

например, если первая переменная имеет 3 уровня, а вторая переменная имеет 4 уровня, я бы хотел 12 меток.

(Также возможно ли контролировать размер или положение этих меток)

Спасибо за любую помощь.

1 Ответ

5 голосов
/ 19 января 2012

Вот один из способов сделать это, используя в качестве примера данные 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)

Этовыглядит следующим образом:

enter image description here

Чтобы изменить размер шрифта, вы можете использовать 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...