2013-02-22 2 views
2

Я искал часы, но я не могу найти функцию, которая делает это.Участок с блоками

Как создать сюжет как

http://i.imgur.com/C2BXYPc.png

Допустим, у меня есть массив x1 = c(2,13,4) и y2=c(5,23,43). Я хочу создать 3 блока высотой от 2-5,13-23 ...

Как бы я подошел к этой проблеме? Я надеюсь, что я могу указать в правильном направлении относительно того, какую встроенную функцию посмотреть?

+2

Я не знаю, функции, которые могут сделать это (хотя это трудно для меня, чтобы увидеть что-нибудь на 'png'), но вы можете написать свою собственную функцию, используя' прямоугольник () 'функция. –

ответ

3

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

На основании небольшого изображения, которое вы предоставили, у вас есть три диапазона, которые вы хотите построить для каждого человека или даты. Используя временные ряды, мы обычно видим это, чтобы построить график min/max, стандартное отклонение и текущие данные.

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

#Create data.frame 
n=100 
df <-data.frame(1:n,runif(n)*10,60+runif(n)*10,25+runif(n)*10,40+runif(n)*10,35-runif(n)*10,35+runif(n)*10) 
colnames(df) <-c("id","beige.min","beige.max","gray.min","gray.max","red.min","red.max") 

#Create chart 
plot(x=df$id,y=NULL,ylim=range(df[,-1]), type="n") #blank chart, ylim is the range of the data 
rect(df$id-0.5,df[,2],df$id+0.5,df[,3],col="beige", border=FALSE) #first layer 
rect(df$id-0.5,df[,4],df$id+0.5,df[,5],col="gray", border=FALSE) #second layer 
rect(df$id-0.5,df[,6],df$id+0.5,df[,7],col="darkred", border=FALSE) #third layer 

layers

+0

Я заметил, что на левой стороне и в правой части графика есть пустое пространство, так как угол окна сразу не начинается с 0, есть ли параметр, который может избавиться от этого пробела? – Andy

+0

R автоматически добавляет 4% пробела на каждой стороне диаграммы. Вы можете удалить его по оси x с помощью команды 'xaxs =" i "' в команде plot. Затем ваша команда становится «plot» (x = df $ id, y = NULL, ylim = range (df [, - 1]), type = "n", xaxs = "i", bty = "l") 'Обратите внимание на 'bty =" l "', который удаляет строку сверху и снизу. Вы заметите, что прямоугольники теперь построены по левой оси. Вы можете перерисовать ось, написав 'axis (2)' после последнего вызова 'rect'. –

+0

Слишком поздно для редактирования. Я имел в виду 'bty =" l "' удаляет ось сверху и вправо и сохраняет только L-образную ось. –

2

Это не совсем понятно, что вы хотите на основе PNG, но, основываясь на том, что вы написали:

x1 <- c(2,13,4) 
y2 <- c(5,23,43) 
foo <- data.frame(id=1:3, x1, y2) 

library(ggplot2) 
ggplot(data=foo) + geom_rect(aes(ymin=x1, ymax=y2, xmin=id-0.4, xmax=id+0.4)) 

enter image description here

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