2014-09-19 79 views
1

我有一個data.frame xy,我正在繪製像下面的代碼。R:固定的x軸縮放和轉換圖()xy參數到點()

有沒有一種方法,我可以怎樣我xx和在xy走向(yy)轉換爲points()命令,這樣我可以設置type='n'並添加points()段,以便命令來控制它更完善?

xy <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME2","NAME2","NAME2"),ID=c(87,87,87,199,199,199), X_START_YEAR=c(1984,1986,1984,1899,1909,1924),Y_START_VALUE=c(75,25,-90,-8,-55,-10),X_END_YEAR=c(1986,1994,1999,1909,1924,1927), Y_END_VALUE=c(20,50,-15,-70,-80,-100)) 
xy 
    NAME ID X_START_YEAR Y_START_VALUE X_END_YEAR Y_END_VALUE 
1 NAME1 87   1984   75  1986   20 
2 NAME1 87   1986   25  1994   50 
3 NAME1 87   1984   -90  1999   -15 
4 NAME2 199   1899   -8  1909   -70 
5 NAME2 199   1909   -55  1924   -80 
6 NAME2 199   1924   -10  1927  -100 

ind <- split(xy,xy$ID) 

for (x in ind){ 
    xx = unlist(x[,grep('X_',colnames(x))]) 
    yy = unlist(x[,grep('Y_',colnames(x))])  
    fname <- paste0(x[1, 'ID'], '.png') 
    png(fname, width=1679, height=1165, res=150) 
    par(mar=c(6,8,6,5)) 
    plot(xx, 
     yy, 
     main=unique(x[,1]), 
     xlab="Time [Years]", 
     ylab="Value [m]") 
    axis(1, at = seq(1000, 2050, 5), cex.axis=1, labels=FALSE, tcl=-0.3) 
    axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3) 
    x <- x[,-1] 
    segments(x[,2],x[,3],x[,4],x[,5],lwd=2) 
    dev.off() 
    } 

如果有可能這將是巨大的,如果x軸可以是在一個固定的範圍內(例如2040至14年),如果1940年之前的值是存在於x軸應該是自動的。 y軸的範圍始終不同。我怎樣才能將其納入我的代碼?

回答

1
xy <- data.frame(NAME = c("NAME1", "NAME1", "NAME1", "NAME2", "NAME2", "NAME2"), 
       ID = c(87, 87, 87, 199, 199, 199), 
       X_START_YEAR = c(1984, 1986, 1984, 1899, 1909, 1924), 
       Y_START_VALUE = c(75, 25, -90, -8, -55, -10), 
       X_END_YEAR = c(1986, 1994, 1999, 1909, 1924, 1927), 
       Y_END_VALUE = c(20, 50, -15, -70, -80, -100)) 
xy 

ind <- split(xy, xy$ID) 

for (i in ind){ 

    xx = unlist(i[, grep('X_', colnames(i))]) 

    yy = unlist(i[, grep('Y_', colnames(i))])  

    fname <- paste0(i[1, 'ID'], '.png') 

    png(fname, width = 1679, height = 1165, res = 150) 

    # test for xx smaller than 1940 
    if(any(xx < 1940)) { 

    my_x_lim <- c(min(xx), max(xx)) 

    } else { 

    my_x_lim <- c(1940, 2014)} 

    # plot the data using pch at your choice and color them as you like 
    # plot your x limits 
    par(mar = c(6, 8, 6, 5)) 

    plot(xx, 
     yy, 
     main = unique(i[, 1]), 
     xlab = "Time [Years]", 
     ylab = "Value [m]", 
     pch = 21, col = "black", 
     xlim = my_x_lim) 

    axis(2, at = seq(-100000, 100000, 500), cex.axis = 1, labels = FALSE, tcl = -0.3) 

    i <- i[, -1] 

    segments(i[, 2], i[, 3], i[, 4], i[, 5],lwd = 2) 

    points(xx, yy, pch = 21, col = "black") 

    dev.off() 
} 
+0

感謝您的回答!這是做我想做的,完美!一個小細節我遇到了問題,也許你有一個解決方案:我想用'pch = 21'和'bg ='white''來繪製點,從而產生一個帶有黑邊的白色圓點。然而,現在繪製的點被稱爲第一個,然後段被繪製在點上。這看起來不如在具有黑色邊緣的白色點繪製在線段上時更好。這就是爲什麼我最初正在尋找一個帶有「()」的解決方案,以便我可以定義要繪製的特徵的順序... – kurdtc 2014-09-22 14:12:22

+0

我添加了帶點的行......我希望它適用於您。 – 2014-09-22 14:57:03

+0

謝謝!沒有看到它是如此容易納入。你幫了我很多! – kurdtc 2014-09-22 15:04:52

1

的GGPLOT2庫有一個段設施,這使得繪製這樣的數據非常緊湊,因此既易於維護和適應以供將來參考。這裏是。

它基本上是七行,但可以進一步壓縮。請注意修改x軸的額外靈感。

dat = xy 

# Adapted from the other solution 
if(any(dat$X_START_YEAR < 1940)) { 
    my_x_lim <- c(min(dat$X_START_YEAR), max(dat$X_END_YEAR)) 
    } else { 
    my_x_lim <- c(1940, 2014) 
    } 

# plot based on Hadley Wickham's ggplot2 
library(ggplot2) 
p = ggplot(dat) 
p = p + geom_segment(aes(x = X_START_YEAR, xend = X_END_YEAR, y = Y_START_VALUE, yend = Y_END_VALUE)) 
# p = p + facet_wrap(~ID) 
# proposal to uncomment if y-axis should not be equivalent over multiple facets (makes the plot harder to read, though): 
p = p + facet_wrap(~ID, scales = "free") 
# Alternatively, only let the x-axis scale vary freely (this gets you ride of the initial procedure to determine the x-axis limits) 
# p = p + facet_wrap(~ID, scales = "free_x") 
p = p + xlab("Time [Years]") + ylab("Value [m]") 
p = p + xlim(my_x_lim) 
print(p) 

enter image description here

相關問題