不能得到小长度的线条出现在情节中

时间:2012-03-21 14:35:37

标签: r

我遇到了一些小段长度出现在我的情节中的问题。

假设以下样本数据:

x=c(11,22,33,44,55)
y=c(15,23,33,45,57)
z=strptime(20120101:20120105,'%Y%m%d')

如果我要从这些数据中创建片段,如果我想要正方形或对接线末端,则我的第三条记录的片段不会显示。如果我允许我的行结束为lend=0,则会显示。

plot(z,x,type='n')
segments(as.numeric(z),x,as.numeric(z),y,lwd=5,lend=2)

如果我试试这个:

segments(as.numeric(z),x,as.numeric(z),y,lwd=5,lend=0)

它在33处显示一个圆圈。有没有办法至少得到一条出现在33的平线(希望是在底部)?

我会使用我的实际数据,当范围很小时,例如33.0005到33.0010也会这样做,但是数据很大,我希望解决它们相同的时候也能解决小范围。

ETA:如果lwd=15圈子看起来更加荒谬。

也许段不是解决这个问题的正确方法?

这是烛台图表,因此这些数字代表开盘价和收盘价。我也有高低数字,超出此范围,并使用lwd=1在这些段下绘制。

4 个答案:

答案 0 :(得分:4)

@Joran指出,这可能是“正确”行为。

但是一个麻烦的解决方法是简单地在值中添加一个任意小的数字。该值应足够小,不会“扭曲”数据,但要足够大,以便在绘图设备分辨率下显示在绘图中。

delta <- pmax(0.2, y - x)

plot(z,x,type='n')
segments(as.numeric(z),x ,y1 = y + delta, lwd=10, lend=1)

enter image description here


PS。我建议不要这样做。你被警告了。

答案 1 :(得分:3)

基础图形确实提供了rect。事实上,它做到了你想要的。使用上面的定义。

xdiff <- max(as.numeric(z)) - min(as.numeric(z))
segwidth <- xdiff/50

plot(z,x,type='n')
rect(z-segwidth/2, x, z+segwidth/2, y, col="black")

答案 2 :(得分:2)

鉴于对你的问题的编辑,我怀疑这样做的方法是绘制点以指示你的打开和关闭,以及一个段来指示范围。

这样,如果你的开点和闭点相同(或接近),你就会在正确的位置得到一个符号。

x <- strptime(20120101:20120105,'%Y%m%d')
y1 <- c(11,22,33,44,55)
y2 <- c(15,23,33,45,57)

r <- range(c(y1, y2)) 

plot(c(x, x), c(y1, y2), type="n", xlab="Date", ylab="y")
points(x, y1, pch=18)
points(x, y2, pch=18)
segments(as.numeric(x), y0=y1, y1=y2)

enter image description here

答案 3 :(得分:2)

“square”lineend有点奇怪

library(grid)
epsilon <- 1e-4
grid.newpage()
grid.points(x=c(0.5-epsilon,0.5+epsilon), y=c(0.5,0.5), pch="+", gp=gpar(cex=2), def="npc")
grid.segments(0.5-epsilon, 0.5, 0.5+epsilon, 0.5, gp=gpar(lineend="square",lwd=50, alpha=0.2))
grid.segments(0.5-epsilon, 0.5, 0.5+epsilon, 0.5, gp=gpar(lineend="round",lwd=50, alpha=0.2))
grid.segments(0.5-epsilon, 0.5, 0.5+epsilon, 0.5, gp=gpar(lineend="butt",lwd=50, alpha=0.2))

行为在epsilon = 0时跳转,

对于epsilon = 1e-4 vs

enter image description here

enter image description here表示epsilon = 0

作为一种解决方法,我会绘制矩形而不是线条;它们总是至少有一个线宽。

grid.newpage()
grid.rect(x=0.5, y=0.5, width=0.01, height=0, gp=gpar(fill="black", col="red", lwd=10, linejoin="mitre"))