2

的类型参数xyplot()可以用“s”表示“步骤”。来自help(plot)

这两种步长类型在 xy 偏好上有所不同:从 (x1,y1) 到 (x2,y2) 且 x1 < x2,'type = "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"')

类型='s'

类型='S'

如何实现“阶梯”图,其中垂直运动发生在数据点之间,即在 处x1 + (x2-x1)/2,以便阶梯的水平部分以数据点为中心?

编辑以包含一些示例代码。我想迟到总比没有好。

4

2 回答 2

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)

结果如下: 阶梯图

于 2013-02-08T20:13:01.530 回答
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')
       })

在此处输入图像描述

于 2013-02-08T21:12:22.980 回答