2013-02-08 3 views
2

аргумент типа xyplot() может принимать «s» для «шагов». От help(plot):r xyplot «шаги» с центрами точек данных

Два шага типа отличаются по их ху предпочтения: Переход от (x1, y1) до (x2, y2) с x1 < x2, 'Тип = "S"' движется первый горизонтальный, затем вертикальный, тогда как 'type = "S"' перемещает другой путь .

т.е. при использовании type="s", горизонтальная часть шага имеет свой левый конец прикреплен к точке данных, в то время как type="S" имеет правый конец, прикрепленный к точке данных.

library(lattice) 
set.seed(12345) 
num.points <- 10 
my.df <- data.frame(x=sort(sample(1:100, num.points)), 
        y=sample(1:40, num.points, replace=TRUE)) 

xyplot(y~x, data=my.df, type=c("p","s"), col="blue", main='type="s"') 
xyplot(y~x, data=my.df, type=c("p","S"), col="red", main='type="S"') 

type='s'

type='S'

Как можно достичь «шаг» сюжет, где вертикальное движение происходит между данными точками точек, то есть в x1 + (x2-x1)/2, так что горизонтальная часть шага с центром в точке данных?

Отредактировано, чтобы включить пример кода. лучше поздно, чем я полагаю.

+0

ли вам обязательно нужно 'lattice' или будет строить R работать? – nico

+0

Я глубоко погружаюсь во что-то, что использует «решетку», поэтому он очень предпочтителен, но базовый план резервного копирования графики не так уж плох. – mac

+1

Я бы подумал о построении с помощью 'panel.xyplot', используя col =" white ", если вы не хотите, чтобы окружные точки (которые установили систему координат), а затем построили с помощью' panel.lines', используя type = "s" с подходящим смещением. (Я бойкотирую вопросы, у которых нет примера кода, поэтому кто-то может принять эту стратегию, если у нее есть заслуга.) –

ответ

2

Я использую отличный @nico ответ дать свою версию решетки. Даже я в порядке с @Dwin, потому что вопрос не дает воспроизводимого примера, но настраивать панель решетки иногда сложно. Идея состоит в том, чтобы использовать panel.segments, что эквивалентно базовой графике segments.

library(lattice) 
xyplot(y~x, 
     panel =function(...){ 
     ll <- list(...) 
     x <- ll$x 
     y <- ll$y 
     x.start <- x - (c(0, diff(x)/2)) 
     x.end <- x + (c(diff(x)/2, 0)) 
     panel.segments(x.start, y, x.end, y, col="orange", lwd=2) 
     panel.segments(x.end[-length(x.end)], y[1:(length(y)-1)], 
         x.end[-length(x.end)], y[-1], col="orange", lwd=2) 
     ## this is optional just to compare with type s 
     panel.xyplot(...,type='s') 
     ## and type S 
     panel.xyplot(...,type='S') 
     }) 

enter image description here

2

Это базовое графическое решение, так как я не слишком эксперт в lattice.

По существу вы можете использовать segments, чтобы нарисовать сначала горизонтальный, затем вертикальные шаги, передавая сдвинутые координаты в виде вектора.

Вот пример:

set.seed(12345) 

# Generate some data 
num.points <- 10 
x <- sort(sample(1:100, num.points)) 
y <- sample(1:40, num.points, replace=T) 


# Plot the data with style = "s" and "S" 
par(mfrow=c(1,3)) 

plot(x, y, "s", col="red", lwd=2, las=1, 
    main="Style: 's'", xlim=c(0, 100)) 
points(x, y, pch=19, col="red", cex=0.8) 

plot(x, y, "S", col="blue", lwd=2, las=1, 
    main="Style: 'S'", xlim=c(0, 100)) 
points(x, y, pch=19, col="blue", cex=0.8) 

# Now plot our points 
plot(x, y, pch=19, col="orange", cex=0.8, las=1, 
    main="Centered steps", xlim=c(0, 100)) 

# Calculate the starting and ending points of the 
# horizontal segments, by shifting the x coordinates 
# by half the difference with the next point 
# Note we leave the first and last point as starting and 
# ending points 
x.start <- x - (c(0, diff(x)/2)) 
x.end <- x + (c(diff(x)/2, 0)) 

# Now draw the horizontal segments 
segments(x.start, y, x.end, y, col="orange", lwd=2) 
# and the vertical ones (no need to draw the last one) 
segments(x.end[-length(x.end)], y[1:(length(y)-1)], 
     x.end[-length(x.end)], y[-1], col="orange", lwd=2) 

Вот результат: Step plots

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