График времени линии Ганта (в базе R)
У меня есть dataframe, который выглядит так:
person n start end
1 sam 6 0 6
2 greg 5 6 11
3 teacher 4 11 15
4 sam 4 15 19
5 greg 5 19 24
6 sally 5 24 29
7 greg 4 29 33
8 sam 3 33 36
9 sally 5 36 41
10 researcher 6 41 47
11 greg 6 47 53
Где начало и конец - это времена или длительности (sam говорил от 0 до 6, greg от 6 до 11 и т.д.). n - сколько времени (в данном случае # слов) человек говорил. Я хочу построить это как временную линию в базе R (в конечном итоге я могу задать аналогичный вопрос, используя ggplot2, но этот ответ специфичен для базы R [когда я говорю, что базовый я имею в виду пакеты, которые поставляются со стандартной установкой]).
Ось y будет индивидуальной, а ось x будет временем. Надеемся, что конечный продукт выглядит примерно так: 1/
![Timeline_Graph]()
Я хотел бы использовать базу R, чтобы сделать это. Я не уверен, как подойти к этому. Мои мысли состоят в том, чтобы использовать сюжетный участок и построить график, но не оставлять точки. Затем перейдите через это с квадратными концевыми сегментами. Я не уверен, как это будет работать, поскольку сегменты нуждаются в числовых x и y, чтобы сделать сегменты и ось y категоричными. Другая мысль состоит в том, чтобы преобразовать коэффициенты в числовые (присвойте каждому коэффициенту число) и график как пустой график рассеяния, а затем перейти с квадратными сегментами конечной линии. Это может быть мощным инструментом в моей области, рассматривающим речевые модели.
Я благодарю вас за вашу помощь.
PS аргумент для сегментов линии с квадратным концом segments(... , lend=2)
позволяет сэкономить время, просматривая эту информацию для тех, кто не знаком со всеми аргументами сегмента.
Ответы
Ответ 1
В то время как ось y является категоричной, все, что вам нужно сделать, это присвоение номеров категориям (1: 5) и отслеживание их. Использование параметра as.numeric() по умолчанию будет, как правило, в алфавитном порядке, но вы должны все равно проверить. Сделайте свой сюжет с аргументом xaxt = 'n'. Затем используйте команду axis(), чтобы поместить y-ось.
axis(2, 1:5, myLabels)
Имейте в виду, что всякий раз, когда вы планируете единственный способ разместить вещи, это число. Категориальные значения x или y всегда представляют собой числа 1: nКатегории с метками имен категорий вместо чисел на оси.
Что-то вроде следующего приближает вас достаточно (если ваш объект data.frame называется datf)...
datf$pNum <- as.numeric(datf$person)
plot(datf$pNum, xlim = c(0, 53), type = 'n', yaxt = 'n', xlab ='Duration (words)', ylab = 'person', main = 'Speech Duration')
axis(2, 1:5, sort(unique(datf$person)), las = 2, cex.axis = 0.75)
with(datf, segments(start, pNum, end, pNum, lwd = 3, lend=2))
Ответ 2
Вы говорите, что хотите базовое решение R, но вы не скажете почему. Поскольку это одна строка кода в ggplot
, я все равно показываю это.
library(ggplot2)
ggplot(dat, aes(colour=person)) +
geom_segment(aes(x=start, xend=end, y=person, yend=person), size=3) +
xlab("Duration")
![enter image description here]()
Ответ 3
Довольно похоже на подход @John, но поскольку я сделал это, я опубликую его:)
Здесь общая функция для построения gantt (без зависимостей):
plotGantt <- function(data, res.col='resources',
start.col='start', end.col='end', res.colors=rainbow(30))
{
#slightly enlarge Y axis margin to make space for labels
op <- par('mar')
par(mar = op + c(0,1.2,0,0))
minval <- min(data[,start.col],na.rm=T)
maxval <- max(data[,end.col],na.rm=T)
res.colors <- rev(res.colors)
resources <- sort(unique(data[,res.col]),decreasing=T)
plot(c(minval,maxval),
c(0.5,length(resources)+0.5),
type='n', xlab='Duration',ylab=NA,yaxt='n' )
axis(side=2,at=1:length(resources),labels=resources,las=1)
for(i in 1:length(resources))
{
yTop <- i+0.1
yBottom <- i-0.1
subset <- data[data[,res.col] == resources[i],]
for(r in 1:nrow(subset))
{
color <- res.colors[((i-1)%%length(res.colors))+1]
start <- subset[r,start.col]
end <- subset[r,end.col]
rect(start,yBottom,end,yTop,col=color)
}
}
par(mar=op) # reset the plotting margins
}
Пример использования:
data <- read.table(text=
'"person","n","start","end"
"sam",6,0,6
"greg",5,6,11
"teacher",4,11,15
"sam",4,15,19
"greg",5,19,24
"sally",5,24,29
"greg",4,29,33
"sam",3,33,36
"sally",5,36,41
"researcher",6,41,47
"greg",6,47,53',sep=',',header=T)
plotGantt(data, res.col='person',start.col='start',end.col='end',
res.colors=c('green','blue','brown','red','yellow'))
Результат:
![enter image description here]()