2012-11-20 2 views
5

Я перемещаю свои участки в ggplot. Почти там для этого, кроме одного (код получил от этого previous question):Параболические опорные линии на ggplot

ggplot plot should look like this

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    lines(stax:endx, qnorm(1-perlin)*sqrt((stax:endx)-stax)) 
    lines(stax:endx, qnorm(perlin)*sqrt((stax:endx)-stax)) 
} 

#Build the plot area and draw the vertical dashed lines 
plot(betseq, rep(0, length(betseq)), type="l", ylim=c(-50, 50), main="", xlab="Trial Number", ylab="Cumulative Hits") 
abline(h=0) 
abline(v=35, lty="dashed") #Seg 1 
abline(v=185, lty="dashed") #Seg 2 
abline(v=385, lty="dashed") #Seg 3 
abline(v=485, lty="dashed") #Seg 4 
abline(v=585, lty="dashed") #Seg 5 

#Draw the % limit lines that correspond to the vertical dashed lines by calling the 
#new function dralim. 
dralim(0, 35, perlin) #Seg 1 
dralim(36, 185, perlin) #Seg 2 
dralim(186, 385, perlin) #Seg 3 
dralim(386, 485, perlin) #Seg 4 
dralim(486, 585, perlin) #Seg 5 
dralim(586, 701, perlin) #Seg 6 

Я могу показать, как далеко я получил (не далеко):

ggplot(a, aes(x=num,y=s, colour=ss)) +geom_line() +stat_smooth(method="lm", formula="y~poly(x,2)") 

my attempt

Чтобы быть ясным. Я рисую свои данные по опорным линиям (верхнее изображение). Нижнее изображение показывает мои данные и мою неудачную попытку получить контрольные строки (которые, очевидно, не сработали).

ответ

3

Что вы делали, это подгонять параболу к вашим данным, а не рисовать ранее определенную параболу. Не сложно адаптировать то, что у вас было, к ggplot.

же начал, как у вас (хотя betseq на самом деле не используются в любом месте)

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

Не вместо функции, которая рисует линию, сделать функцию, которая возвращает geom_line с (в списке), которые являются то, что вы хотеть. Существует подразумеваемый aes(x=x, y=y), который будет указан в объявлении ggplot позже, но это определяет точки данных, которые делают параболы.

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    c(geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(1-perlin)*sqrt((stax:endx)-stax))), 
    geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(perlin)*sqrt((stax:endx)-stax)))) 
} 

Чтобы сохранить повторение, определить положение вертикальных линий (edges), которые также могут быть использованы для определения левых и правых концов парабол (ranges).

edges <- data.frame(x=c(0, 35, 185, 285, 485, 585, 700)) 
ranges <- data.frame(left = edges$x[-nrow(edges)], 
        right = edges$x[-1] + 1) 

Теперь постройте ggplot. Там один geom_vline, чтобы нарисовать все вертикальные линии (поскольку мы определили позиции в одном наборе данных). Необычным шагом является цикл по строке (индексы) ranges и вызов dralim с соответствующими левым и правым значениями (и perlin). Это возвращает список списков geom_lines, но это можно просто добавить к сюжету обычным способом, и все строки будут добавлены. Последние два вызова шкалы - это просто установить метки, а в случае оси y - диапазон.

ggplot(mapping=aes(x=x, y=y)) + 
    geom_vline(data=edges, aes(xintercept = x), linetype="dashed") + 
    lapply(seq_len(nrow(ranges)), 
     function(r) {dralim(ranges$left[r], ranges$right[r], perlin)}) + 
    scale_y_continuous("Cumulative Hits", lim=c(-50,50)) + 
    scale_x_continuous("Trial Number") 

enter image description here

+0

я понял мой способ сделать это было не так. Пришлось где-то начинать. Ты выглядишь неплохо. Благодарю. Отдам! –

+0

Хорошо, что отлично выглядит. Но как я могу сделать вывод о моих данных сверху? –

+0

Не знаете формат ваших данных, но, угадывая, что вы показали, добавьте 'geom_line (data = a, aes (x = num, y = s, color = ss))'. –

Смежные вопросы