Как построить данные, сгруппированные по фактору, но не как блокпост - PullRequest
12 голосов
/ 02 апреля 2010

В R, заданный вектор

casp6 <- c(0.9478638, 0.7477657, 0.9742675, 0.9008372, 0.4873001, 0.5097587, 0.6476510, 0.4552577, 0.5578296, 0.5728478, 0.1927945, 0.2624068, 0.2732615)

и фактор:

trans.factor <- factor (rep (c("t0", "t12", "t24", "t72"), c(4,3,3,3)))

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

Простое выполнение plot(trans.factor, casp6) делает почти то, что я хочу, он создает блокпост, но я хочу видеть отдельные точки данных.

Ответы [ 6 ]

13 голосов
/ 02 апреля 2010
require(ggplot2)
qplot(trans.factor, casp6)
4 голосов
/ 30 июня 2011

Я считаю следующее решение:

stripchart(casp6~trans.factor,data.frame(casp6,trans.factor),pch=1,vertical=T)

простым и прямым.

(см., Например, http://www.mail-archive.com/r-help@r-project.org / msg34176.html )

4 голосов
/ 03 апреля 2010

Вы можете сделать это с помощью ggplot2, используя facets. Когда я читаю «Я хочу создать график, в котором точки данных группируются, как определено фактором» , первое, что мне пришло в голову, было facets.

Но в данном конкретном случае более быстрая альтернатива должна быть:

plot(as.numeric(trans.factor), casp6)

А потом вы можете поиграть с опциями заговора (type, fg, bg ...), но я рекомендую придерживаться ggplot2, так как в нем гораздо более чистый код, отличная функциональность, вы можете избежать перплотинг ... и т. д. и т. д.

Узнайте, как бороться с факторами. Вы получили барплот при оценке plot(trans.factor, casp6), потому что trans.factor был классом factor (по иронии судьбы, вы даже назвали его в таком поместье) ... и trans.factor, как таковой, был объявлен до непрерывная (числовая) переменная в функции plot() ... следовательно, plot() "чувствует" необходимость поднабора данных и построения блокпоста на основе каждой части (если вы сначала объявите непрерывную переменную, вы получите обычный график, верно ?). ggplot2, с другой стороны, интерпретирует фактор по-другому ... как "обычная" , числовая переменная (это означает синтаксис, предоставленный Jonathan Chang , вы должны укажите geom при выполнении чего-то более сложного в ggplot2).

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

# create dummy data
> set.seed(23)
> x <- rnorm(200, 23, 2.3)
> g <- factor(round(runif(200, 1, 4)))

Используя базовые графики (package:graphics):

par(mfrow = c(1, 4))
tapply(x, g, hist)

ggplot2 way:

qplot(x, facets = . ~ g)

Попробуйте сделать это с graphics в одной строке кода (точки с запятой и пользовательские функции считаются обманом!):

qplot(x, log(x), facets = . ~ g)

Будем надеяться, что я не скучал до смерти, но помог вам!

С уважением,
aL3xa

3 голосов
/ 02 января 2017

Дополнительный пакет не требуется

Я немного опоздал на вечеринку, но я обнаружил, что вы можете очень легко получить желаемый результат с помощью стандартной функции построения графика - просто конвертируйте коэффициент в числовое значение:

plot(as.numeric(trans.factor), casp6)
3 голосов
/ 26 ноября 2010

Я думаю, что есть лучшее решение (я написал его для семинара несколько дней назад), но оно ускользнуло от меня. Вот уродливая замена с базовой графикой. Не стесняйтесь комментировать оси х ad libitum . Лично мне нравится решение Грега.

plot(0, 0, xlim = c(1, 4), ylim = range(casp6), type = "n")
points(casp6 ~ trans.factor)
3 голосов
/ 06 апреля 2010

Вы можете приблизиться к тому, что хотите, используя решетчатую графику, выполнив:

library(lattice)    
xyplot(casp6 ~ trans.factor, 
       scales = list(x = list(at = 1:4, labels = levels(trans.factor))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...