【问题标题】:R: Unite multiple segments() and points() in base R plotR:在基本 R 图中联合多个段()和点()
【发布时间】:2014-12-15 11:16:26
【问题描述】:

我正在按以下方式将由 ID 定义的多个图形绘制到不同的文件中。

xy <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME2","NAME2","NAME2","NAME3","NAME3"),ID=c(87,87,87,199,199,199,233,233), X_START_YEAR=c(1950,1988,1994,1899,1909,1924,1945,1948),Y_START_VALUE=c(75,25,-90,-8,-55,-10,-9,12),X_END_YEAR=c(1985,1994,1999,1904,1924,1987,1946,1949), Y_END_VALUE=c(20,50,-15,-70,-80,-100,24,59))

  NAME  ID X_START_YEAR Y_START_VALUE X_END_YEAR Y_END_VALUE
1 NAME1  87         1950            75       1985          20
2 NAME1  87         1988            25       1994          50
3 NAME1  87         1994           -90       1999         -15
4 NAME2 199         1899            -8       1904         -70
5 NAME2 199         1909           -55       1924         -80
6 NAME2 199         1924           -10       1987        -100
7 NAME3 233         1945            -9       1946          24
8 NAME3 233         1948            12       1949          59

# Split glacier names by ID
ind <- split(x = xy,f = xy[,'ID'])

# Plot
for (i in ind){
  xx = unlist(i[,grep('X_',colnames(i))])
  yy = unlist(i[,grep('Y_',colnames(i))])    
  filename <- paste0(i[1, 'ID'], '.png') 
  png(filename, width=1679, height=1165, res=150)
  if(any(xx < 1946)) {my_x_lim <- c(min(xx), 2014)} else {my_x_lim <- c(1946, 2014)} 
  par(mar=c(6,8,6,5))
  plot(xx, yy)
  i <- i[,-1]
  segments(i[,2],i[,3],i[,4],i[,5],lwd=2)
  points(xx, yy, pch=21,cex=1, bg='white') 
  dev.off()
} 

我的问题:我正在寻找的是一个基本的 R 解决方案,将xy 的整个数据包含在一个图中(而不是像上面的代码那样的几个图)并且有多行图例中的点(由 ID 定义的组)。我想出了一个非常简单的方法来使用ggplot 来做到这一点,但我对如何在基础 R 中做到这一点很感兴趣。有什么想法吗?

这是ggplot 代码,它可能会让您了解我正在尝试做什么:

library(ggplot2)
p = ggplot(xy)
p = p + geom_segment(aes(x = X_START_YEAR, xend = X_END_YEAR, y = Y_START_VALUE, yend = Y_END_VALUE,linetype=NAME))
print(p)

【问题讨论】:

    标签: r plot ggplot2 points segments


    【解决方案1】:
    noms<-levels(xy$NAME)
    nblev<-nlevels(xy$NAME)
    linetype<-(1:9)[1:nblev]
    
    par(mar=c(5,4,4,10),xpd=TRUE)
    plot(c(xy[,3],xy[,5]),c(xy[,4],xy[,6]),type="p",pch=21,xlab="YEAR",ylab="VALUE",las=1)
    segments(xy[,3],xy[,4],xy[,5],xy[,6],lty=linetype[as.numeric(xy$NAME)])
    coord<-par("usr")
    legend(coord[2]+10,sum(coord[3:4])/2,lty=linetype,legend=noms,bty="n")
    

    【讨论】:

    • 谢谢@CathG。我唯一还在苦苦挣扎的是传说它会自动从xy 中获取每个NAME 而不仅仅是粘贴它。有没有一种方法我不需要手动粘贴它?跨度>
    • 例如,如果我将我的数据按不同的名称分组,这些名称的标题为示例 1,然后是下一组测试,然后是示例 3,依此类推。这样我就不必手动粘贴了。
    • 可能有级别(xy$NAME)
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2014-05-16
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多