2012-01-19 2 views
1

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

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

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

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

ответ

4

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

Теперь, чтобы сделать текст на 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) 
+0

Большого спасибо – jinni

Смежные вопросы