2015-11-13 1 views
0

Моя первоначальная цель состояла в том, чтобы установить ylim для данных, нанесенных по рисунку barplot. Когда я начал копать глубже, я нашел несколько вещей, которые я не понимаю. Позвольте мне объяснить мое исследование:Правильный тип данных, переданный в barplot

У меня есть 1D вектор:

> str(vectorName) 
num [1:999] 1 1 1 1 1 1 1 1 1 1 ... 

> dim(vectorName) 
NULL 

> length(vectorName) 
[1] 999 

Если я хочу, чтобы подсчитать отдельные элементы этого вектора Я:

> vectorNameTable = table(vectorName) 
> vectorNameTable 
vectorName 
    0 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 0.275 0.3 0.325 0.35 0.375 0.4 
    563 72 35 22 14 21 14 10  5  3  7  3  6  5  3  1  3 
0.425 0.45 0.475 0.5 0.525 0.55 0.575 0.6 0.625 0.65 0.675 0.7 0.725 0.75 0.775 0.8 0.825 
    1  3  3  5  7 11  3  4  3 11  5  9  5  7  8  5  3 
0.85 0.875 0.9 0.925 0.975  1 
    3  4  2  1  1 108 

Это как отобразить эти данные более элегантный способ (в R-студии):

> View(vectorNameTable) 

Что дает мне такой вывод:

vectorName Freq 
1 0  563 
2 0.025 72 
3 0.05 35 
4 0.075 22 
5 0.1  14 
6 0.125 21 
7 0.15 14 
8 0.175 10 
9 0.2  5 
10 0.225 3 
11 0.25 7 
12 0.275 3 
13 0.3  6 
14 0.325 5 
15 0.35 3 
16 0.375 1 
17 0.4  3 
18 0.425 1 
19 0.45 3 
20 0.475 3 
21 0.5  5 
22 0.525 7 
23 0.55 11 
24 0.575 3 
25 0.6  4 
26 0.625 3 
27 0.65 11 
28 0.675 5 
29 0.7  9 
30 0.725 5 
31 0.75 7 
32 0.775 8 
33 0.8  5 
34 0.825 3 
35 0.85 3 
36 0.875 4 
37 0.9  2 
38 0.925 1 
39 0.975 1 
40 1  108 

Если я хочу, чтобы построить эти данные я:

> barplot(vectorNameTable) 

Что дает мне этот сюжет:

enter image description here

Как вы можете видеть 0 происходит несколько раз, чем размер оси y. Так что я хочу, чтобы установить размер у-оси с помощью:

barplot(table(vectorNameTable), ylim=c(0,MAX_VALUE_IN_FREQ_COLUMN))

Проблема заключается в том, что я не могу найти наибольшее значение в Freq колонке. Чтобы быть более точным, я даже не могу получить доступ к столбцу Freq. Я пробовал:

> vectorNameTable[,1] 
Error in vectorNameTable[, 1] : incorrect number of dimensions 

и несколько других попыток, но, кажется, что единственное, что я могу получить это целый ряд:

> vectorNameTable[1] 
    0 
563 
> vectorNameTable[2] 
0.025 
    72 

Или даже значение Freq в данной строке:

> vectorNameTable[[1]] 
[1] 563 
> vectorNameTable[[2]] 
[1] 72 

возможный обходной путь, который работает является преобразованием данных в матрицу:

vectorNameDF = data.frame(vectorNameTable) 
val = vectorNameDF[[1]] 
frq = vectorNameDF[[2]] 
val = as.numeric(levels(val)) 
vectorNameMTX = matrix(c(val, frq), nrow=length(val)) 

Тогда я сделать что-то канд так:

barplot(vectorNameTable, ylim=c(0,max(vectorNameMTX[,2])+50)) 

который будет возвращать: enter image description here

Но как вы можете видеть, что это крайнее излишество.Еще одна загадочная вещь, которую я обнаружил, что построение графа таким образом (такой же, как barplot(vectorNameMTX, beside=FALSE)):

> barplot(vectorNameMTX) 

Вернется это:

enter image description here

Эта команда > barplot(vectorNameMTX, beside=TRUE) возвратит это: enter image description here

Почему это происходит? Я имею в виду, что это за «линия» слева? А где ось х? Если я делаю View(vectorNameMTX), он возвращает очень похожую таблицу в View(vectorNameTable). Документация barplot говорит (только важные вещи):

Bar Plots 

Description 

Creates a bar plot with vertical or horizontal bars. 

Usage 

barplot(height, ...) 

height 
either a vector or matrix of values describing the bars which make up the plot. If height is a vector, the plot consists of a sequence of rectangular bars with heights given by the values in the vector. If height is a matrix and beside is FALSE then each bar of the plot corresponds to a column of height, with the values in the column giving the heights of stacked sub-bars making up the bar. If height is a matrix and beside is TRUE, then the values in each column are juxtaposed rather than stacked. 

Я передаю матрицу, но она не работает, как ожидалось:

> class(vectorNameMTX) 
[1] "matrix" 

С другой стороны, это один не упоминается поддерживается типа, но он работает:

> class(vectorNameTable) 
[1] "table" 

Почему я не могу получить доступ к столбцам vectorNameTable? Почему передача объекта таблицы работает при передаче матрицы? Что мне здесь не хватает и как лучше всего достичь моей цели?

Спасибо

+0

Это очень длинный вопрос. Есть ли вероятность, что вы можете сконденсировать его до минимально жизнеспособного примера? Когда вы говорите «почему это происходит», я даже не понимаю, что это за ** ** ** – C8H10N4O2

+0

Я бы разделил это на два вопроса: a) максимальное значение таблицы; b) barplot misbehaving –

+0

Таблицы R имеют значения и часто (как в данном случае здесь) атрибут, называемый «имена». Функция «Просмотр» показывает эти «имена» как самый левый «столбец». Чтобы использовать столбец «names», вы должны применить .... ждать его ... 'names'-function. Если вы конвертируете в один кадр данных данных, эти имена больше не будут находиться в атрибуте, называемом «имена», а теперь будут «именами ростов» в dataframe, которые также сохраняются как атрибут. –

ответ

0

Таблица из 1d вектора является 1d вектор, поэтому нет колонн. Вы можете сделать что-то вроде

> a <- rbinom(1000, 25, 0.5) 
> tb <- table(a) 
> tb 
a 
    6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    8 20 31 71 96 155 141 146 136 94 46 33 15 7 1 
> dim(tb) 
[1] 15 # 1 dimension of 15 
> tb[which.max(tb)] 
11 
155 

Таким образом, вы можете подать это максимальное значение на баррель.

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