2012-05-07 16 views
5

Tôi có cốt truyện với một số điểm thời gian khó phân biệt bằng màu một mình và do đó tôi muốn gắn nhãn các điểm thời gian trên ô, nhưng các nhãn chồng lên nhau (xem đồ thị bên dưới) theo cách khó đọc nhãn.sắp xếp văn bản trên geom_point bằng cách sử dụng geom_text

Cốt truyện hiện trông như thế này,

current plot

Tôi tự hỏi nếu có một cách để 'chồng' các nhãn hoặc cách nào đó (script) có thể đảm bảo chúng không chồng lên nhau. Một cái gì đó như thế này,

 - - >

Mọi trợ giúp sẽ được đánh giá cao.

Đây là mã tôi đã sử dụng để sản xuất cốt truyện,

require(ggplot2) 
require(plyr) 
require(reshape) 

# create sample data 
set.seed(666) 
dfn <- data.frame(
Referral = seq(as.Date("2007-01-15"), len= 26, by="23 day"), 
VISIT01 = seq(as.Date("2008-06-15"), len= 24, by="15 day")[sample(30, 26)], 
VISIT02 = seq(as.Date("2008-12-15"), len= 24, by="15 day")[sample(30, 26)], 
VISIT03 = seq(as.Date("2009-01-01"), len= 24, by="15 day")[sample(30, 26)], 
VISIT04 = seq(as.Date("2009-03-30"), len= 24, by="60 day")[sample(30, 26)], 
VISIT05 = seq(as.Date("2010-11-30"), len= 24, by="6 day")[sample(30, 26)], 
VISIT06 = seq(as.Date("2011-01-30"), len= 24, by="6 day")[sample(30, 26)], 
Discharge = seq(as.Date("2012-03-30"), len= 24, by="30 day")[sample(30, 26)], 
Patient = factor(1:26, labels = LETTERS), 
openCase = rep(0:1, 100)[sample(100, 26)]) 

# set today's data for cases that do not have an Discharge date 
dfn$Discharge[ is.na(dfn$Discharge) ] <- as.Date("2014-01-30") 

mdfn <- melt(dfn, id=c('Patient', 'openCase'), variable_name = "Visit") 
names(mdfn)[4] <- 'Year' # rename 

# order data in mdfn by 'Referral' in dfn 
mdfn$Patient <- factor(mdfn$Patient,levels = 
(dfn$Patient[order(dfn$Referral)]),ordered = TRUE) 

# subset a dataset to avoid 'Discharge' for cases that are not closed 
mdfn2 <- subset(mdfn,!(Visit=="Discharge" & Year > as.Date("2014-01-01"))) 

# the plot as it looks now 
ggplot(mdfn, aes(Year, Patient)) + 
    geom_blank() + 
    geom_line(data = mdfn[mdfn$openCase == 0,], colour = "black") + 
    geom_line(data = mdfn[mdfn$openCase == 1,], colour = "grey") + 
    geom_point(data = mdfn2, aes(colour = Visit), size = 4, shape = 124) + 
    geom_text(data=mdfn2, mapping=aes(x=Year, y=Patient, 
    label=substr(Visit, 1, 7), colour=Visit), size=2, 
    vjust=-.4, hjust=-.1, angle = 00) 
+1

Thiếu chức năng, thiếu dữ liệu, không thể lặp lại. –

+0

Tôi không biết làm thế nào để làm điều đó, nhưng bạn có thực sự cần nhãn? Đã có một huyền thoại cung cấp thông tin đó. –

+1

có thể trùng lặp của [Vị trí nhãn điểm thông minh trong R] (http://stackoverflow.com/questions/7611169/intelligent-point-label-placement-in-r) – joran

Trả lời

11

Bạn có thể thay đổi vị trí thẳng đứng của nhãn theo giá trị số của người truy cập.

Điều quan trọng là:

y=(as.numeric(Patient)+0.25*as.numeric(Visit)%%3)-0.12 

này hiện sản xuất:
3 cấp độ khác nhau tùy theo giá trị của lượt truy cập (%% 3), mà bạn có thể tăng hoặc giảm
mỗi cấp được phân cách bằng một phần tư của khoảng cách giữa nhãn y (0,25)
nhãn đầu tiên là 0.12 dưới đường ngang
thứ hai là 0,12 trên

enter image description here enter image description here

require(ggplot2) 
require(plyr) 
require(reshape) 
# create sample data 
set.seed(666) 
dfn <- data.frame(
    Referral = seq(as.Date("2007-01-15"), len= 26, by="23 day"), 
    VISIT01 = seq(as.Date("2008-06-15"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT02 = seq(as.Date("2008-12-15"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT03 = seq(as.Date("2009-01-01"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT04 = seq(as.Date("2009-03-30"), len= 24, by="60 day")[sample(30, 26)], 
    VISIT05 = seq(as.Date("2010-11-30"), len= 24, by="6 day")[sample(30, 26)], 
    VISIT06 = seq(as.Date("2011-01-30"), len= 24, by="6 day")[sample(30, 26)], 
    Discharge = seq(as.Date("2012-03-30"), len= 24, by="30 day")[sample(30, 26)], 
    Patient = factor(1:26, labels = LETTERS), 
    openCase = rep(0:1, 100)[sample(100, 26)]) 

# set today's data for cases that do not have an Discharge date 
dfn$Discharge[ is.na(dfn$Discharge) ] <- as.Date("2014-01-30") 

mdfn <- melt(dfn, id=c('Patient', 'openCase'), variable_name = "Visit") 
names(mdfn)[4] <- 'Year' # rename 

# order data in mdfn by 'Referral' in dfn 
mdfn$Patient <- factor(mdfn$Patient,levels = 
    (dfn$Patient[order(dfn$Referral)]),ordered = TRUE) 

# subset a dataset to avoid 'Discharge' for cases that are not closed 
mdfn2 <- subset(mdfn,!(Visit=="Discharge" & Year > as.Date("2014-01-01"))) 

# the plot as it looks now 
ggplot(mdfn, aes(Year, Patient)) + 
    geom_blank() + 
    geom_line(data = mdfn[mdfn$openCase == 0,], colour = "black") + 
    geom_line(data = mdfn[mdfn$openCase == 1,], colour = "grey") + 
    geom_point(data = mdfn2, aes(colour = Visit), size = 4, shape = 124) + 
    geom_text(data=mdfn2, mapping=aes(x=Year, y=(as.numeric(Patient)+0.25*as.numeric(Visit)%%3)-0.12, 
            label=substr(Visit, 1, 7), colour=Visit), size=2, 
      hjust=-.1, angle = 00) 
+0

Thanh lịch, ấn tượng. Bây giờ tôi chỉ cần tìm ra điều cần làm khi ba điểm thời gian ở gần nhau và để tránh các nhãn được đặt trên hàng. Cảm ơn. –

+0

Văn bản không còn trực tuyến. Nếu bạn cần các cấp độ cao khác nhau, hãy tăng số sau %% và giảm kích thước của ca làm việc (hiện tại là 0,25), có thể yêu cầu văn bản nhỏ hơn. –

+0

Nếu đây không phải là dữ liệu thực tế và điều này không hoạt động với dữ liệu thực tế, hãy nghĩ đến việc cung cấp dữ liệu thực tế sau khi ẩn danh với: http://stackoverflow.com/a/10458688/742447 –

Các vấn đề liên quan