Невозможно получить линии небольшой длины, чтобы показать их в сюжете - PullRequest
0 голосов
/ 21 марта 2012

У меня проблемы с отображением сегментов небольшой длины на моем графике.

Предполагая следующие данные образца:

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 ]

4 голосов
/ 21 марта 2012

Как указывает @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.Я советую против этого.Вы были предупреждены.

3 голосов
/ 27 марта 2012

Базовая графика предоставляет прямоугольник. И на самом деле, он делает то, что вы хотите. Используя ваши определения выше.

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 голосов
/ 26 марта 2012

Есть что-то немного странное в "квадратном" линейном конце

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,

enter image description here для epsilon = 1e-4 против

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"))
2 голосов
/ 26 марта 2012

Учитывая изменения в вашем вопросе, я подозреваю, что способ сделать это состоит в том, чтобы построить точки, чтобы указать ваше открытие и закрытие, и сегмент, чтобы указать диапазон.и точки закрытия идентичны (или близки), вы получите символ в правильной точке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...