Моя первоначальная цель состояла в том, чтобы установить 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)
Что дает мне этот сюжет:
Как вы можете видеть 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))
Но как вы можете видеть, что это крайнее излишество.Еще одна загадочная вещь, которую я обнаружил, что построение графа таким образом (такой же, как barplot(vectorNameMTX, beside=FALSE)
):
> barplot(vectorNameMTX)
Вернется это:
Эта команда > barplot(vectorNameMTX, beside=TRUE)
возвратит это:
Почему это происходит? Я имею в виду, что это за «линия» слева? А где ось х? Если я делаю 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
? Почему передача объекта таблицы работает при передаче матрицы? Что мне здесь не хватает и как лучше всего достичь моей цели?
Спасибо
Это очень длинный вопрос. Есть ли вероятность, что вы можете сконденсировать его до минимально жизнеспособного примера? Когда вы говорите «почему это происходит», я даже не понимаю, что это за ** ** ** – C8H10N4O2
Я бы разделил это на два вопроса: a) максимальное значение таблицы; b) barplot misbehaving –
Таблицы R имеют значения и часто (как в данном случае здесь) атрибут, называемый «имена». Функция «Просмотр» показывает эти «имена» как самый левый «столбец». Чтобы использовать столбец «names», вы должны применить .... ждать его ... 'names'-function. Если вы конвертируете в один кадр данных данных, эти имена больше не будут находиться в атрибуте, называемом «имена», а теперь будут «именами ростов» в dataframe, которые также сохраняются как атрибут. –