我遇到了一些小段长度出现在我的情节中的问题。
假设以下样本数据:
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
在这些段下绘制。
答案 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)
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)
答案 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 ,
表示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"))