Заменить метку оси x на графике объекта MarkovChain

#r #plot #clickstream

#r #график #clickstream

Вопрос:

Вот некоторый код для генерации графика цепочки Маркова 0-го порядка. Я хотел бы заменить метки оси x графика (c, d, h, i, o, p) повернутыми на 45 градусов метками, показывающими первые шесть месяцев года. Однако использование xaxt="n" в plot вызове, похоже, не работает. Этот код просто записывает существующие метки, а не заменяет их. Как я могу заменить метки на те, которые я хочу?

 library(clickstream)
clickstreams <- c("User1,h,c,c,p,c,h,c,p,p,c,p,p,o",
                   "User2,i,c,i,c,c,c,d",
                   "User3,h,i,c,i,c,p,c,c,p,c,c,i,d",
                   "User4,c,c,p,c,d",
                   "User5,h,c,c,p,p,c,p,p,p,i,p,o",
                   "User6,i,h,c,c,p,p,c,p,c,d")
csf <- tempfile()
writeLines(clickstreams, csf)
cls <- readClickstreams(csf, header = TRUE)
mc <- fitMarkovChain(cls, order=0)
plot(mc, xaxt="n")
text(x=1:6, y=par()$usr[3], labels = month.name[1:6], srt=45, adj = c(1.1,1.1), xpd = TRUE, cex=.9)
  

график потока кликов с неправильными метками оси x

Ответ №1:

str(mc) раскрывает структуру объекта S4. Переход к plot только координатам xy, а не ко всему "MarkovChain" объекту, восстанавливает xaxt функциональность опции. Использование with делает это наиболее удобным.

Более того, это позволяет нам использовать реализованный plot метод S4 для подписи 'MarkovChain' clickstream пакета.

 library(clickstream)
with(mc@transitions[[1]], plot(states, probability, xaxt="n"))
text(x=1:6, y=par()$usr[3], labels=month.name[1:6], srt=45, adj=rep(1.1, 2), xpd=TRUE, cex=.9)
  

Результат

введите описание изображения здесь

Данные

 library(clickstream)
mc <- new("MarkovChain", states = c("h", "c", "p", "o", "i", "d"), 
    order = 0, transitions = list(structure(list(states = structure(1:6, .Label = c("c", 
    "d", "h", "i", "o", "p"), class = "factor"), frequency = c(25L, 
    4L, 5L, 7L, 2L, 17L), probability = c(0.416666666666667, 
    0.0666666666666667, 0.0833333333333333, 0.116666666666667, 
    0.0333333333333333, 0.283333333333333)), class = "data.frame", row.names = c(NA, 
    -6L))), lambda = 0, logLikelihood = -88.4241188515082, observations = 60, 
    start = structure(c(c = 0.166666666666667, h = 0.5, i = 0.333333333333333
    ), class = "table", .Dim = 3L, .Dimnames = structure(list(
        c("c", "h", "i")), .Names = "")), end = structure(c(d = 0.666666666666667, 
    o = 0.333333333333333), class = "table", .Dim = 2L, .Dimnames = structure(list(
        c("d", "o")), .Names = "")), transientStates = c("c", 
    "h", "i", "p"), absorbingStates = c("d", "o"), absorbingProbabilities = structure(list(
        state = structure(1:4, .Label = c("c", "h", "i", "p"), class = "factor"), 
        d = c(0.792201957232916, 0.864224245314581, 0.903842865008182, 
        0.517925028202586), o = c(0.207798042767084, 0.13577575468542, 
        0.0961571349918185, 0.482074971797414)), class = "data.frame", row.names = c(c = 1L, 
    h = 3L, i = 4L, p = 6L)))
  

Ответ №2:

Использование plot.default вместо plot предоставляет графическую plot функцию, которая позволяет использовать xaxt параметр функции для удаления существующих меток оси x. Поскольку plot.default объект MarkovChain не будет принят, значения x и y для графика необходимо извлечь из объекта.

 plot.default(
   x=mc@transitions[[1]]$states, 
   y=mc@transitions[[1]]$probability,
   xaxt="n", 
   ann=FALSE, 
   pch="-", 
   cex=3
)

text(
    x = 1:6, 
    y = par()$usr[3], 
    labels = month.name[1:6], 
    srt = 45, 
    adj = c(1.1,1.1), 
    xpd = TRUE, 
    cex = .9
)
  

введите описание изображения здесь

Комментарии:

1. with(mc@transitions[[1]], plot(states, probability, xaxt="n")) также будет работать.

2. Спасибо, ваш ответ лучше моего, поскольку он использует оригинальный стиль для функции clickstream plot. Если вы хотите отправить это в качестве ответа, я приму это.

3. Сделано, рад помочь!