Как добавить вторую ось y в seqfplot с частотой последовательности?

Я работаю с TraMineR над последовательным анализом образовательных данных. Я могу заставить R построить график 10 наиболее часто встречающихся последовательностей данных, используя код, подобный следующему:

library(TraMineR)

##Loading the data
data(actcal)

##Creating the labels and defining the sequence object
actcal.lab <- c("> 37 hours", "19-36 hours", "1-18 hours", "no work")
actcal.seq <- seqdef(actcal, 13:24, labels=actcal.lab)

## 10 most frequent sequences in the data
actcal.freq <- seqtab(actcal.seq)
actcal.freq

## Plotting the object
seqfplot(actcal.seq, pbarw=FALSE, yaxis="pct", tlim=10:1, cex.legend=.75, withlegend="right")

Однако я также хотел бы иметь частоты каждой последовательности (которые находятся в объекте actcal.freq) вдоль правой стороны графика. Например, первая последовательность на графике, созданная с помощью приведенного выше кода, представляет 37,9% данных (как показано на графике в настоящее время). Согласно seqtab, это 757 субъектов. Я бы хотел, чтобы число 757 отображалось на правой оси Y (и так далее для других последовательностей).

Это возможно? Я играл с axis(side=4, ...), но так и не смог воспроизвести интервал левой оси Y.


person Andrew Wallace    schedule 28.05.2014    source источник


Ответы (1)


OK. Это немного беспорядок, но функция сбрасывает настройку par, если вы включаете легенду по умолчанию, поэтому вам нужно отключить это. Затем вы можете немного упростить настройку оси, а затем мы можем вернуться к легенде. Это должно работать с вашими тестовыми данными выше.

#add padding to the right for axis and legend
par("mar"=c(5,4,4,8)+.1)

#plot w/o axis
seqfplot(actcal.seq, pbarw=FALSE, yaxis="pct", tlim=10:1, withlegend=F)

#plot right axis with freqs
axis(4, at = seq(.7, by=1.2, length.out=length(attr(actcal.freq,"freq")$Freq)), 
    labels = rev(attr(actcal.freq,"freq")$Freq), 
    mgp = c(1.5, 0.5, 0), las = 1, tick = FALSE)

#now put the legend on        
legend("right", legend=attr(actcal.seq, "labels"), 
    fill=attr(actcal.seq, "cpal"), 
    inset=-.3, bty="o", xpd=NA, cex=.75)

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

График TraMineR с правой осью Y

person MrFlick    schedule 29.05.2014
comment
Спасибо за ваш ответ MrFlick! Мне пришлось немного изменить его, чтобы он работал с моими данными (поместить легенду внизу и т. д.). Кроме того, R выдал мне ошибку Error in seq.default(0.7, by = 1.2, length.out = length(pcts)) : объект 'pcts' not found Поэтому я просто указал length.out = 10 вместо этого. - person Andrew Wallace; 03.06.2014
comment
@ user3684695 Извините за ошибку. Я уже не помню, откуда взялся pcts, но я обновил код, используя длину меток, так что это всегда должно работать. - person MrFlick; 03.06.2014