簡體   English   中英

自動調整自定義繪圖字符的大小?

[英]Automatically resizing a custom plotting character?

嘿,我希望每個人都可以幫助我在R中繪制定制的pch。就我而言,我試圖創建與水質有關的圖形。 監測水質的一種方法是使用secchi圓盤,該圓盤基本上是金屬圓盤,四分之一圓盤塗有黑色和白色(請參見下圖)。

到目前為止,我已經能夠成功創建光盤並將其放置在繪圖上,但是我的問題來自於取決於繪圖尺寸的拉伸效果。

到目前為止,這是我用來創建光盤的功能:

# A circle function to draw a circle (pulled form another stackoverflow page)

circleFun <- function(center=c(0,0), diameter=1, npoints=100, start=0, end=2, filled=TRUE){
  tt <- seq(start*pi, end*pi, length.out=npoints)
  df <- data.frame(
    x = center[1] + diameter / 2 * cos(tt),
    y = center[2] + diameter / 2 * sin(tt)
  )
  if(filled==TRUE) { #add a point at the center so the whole 'pie slice' is filled
    df <- rbind(df, center)
  }
  return(df)
}

# and my function to create a secchi disc
secchiDisc = function(x,y,diameter = 1){
  quarterCircle1 = circleFun(c(x,y),diameter = diameter, start=0, end=0.5)
  quarterCircle3 = circleFun(c(x,y),diameter = diameter, start=1, end=1.5)
  fullCircle = circleFun(c(x, y), diameter, start=0, end=2)
  polygon(quarterCircle1$x,quarterCircle1$y,col="black")
  polygon(quarterCircle3$x,quarterCircle3$y,col="black")
  polygon(fullCircle$x,fullCircle$y)
}

# make a plot to show what it looks like
par(mar = c(5, 4, 4, 2) + 0.1)
plot(0,0,pch = "")
secchiDisc(0,0)

在此處輸入圖片說明

# create data frame 
data = as.data.frame(list(Year = 1970:2015,
                          Depth = rnorm(46,3,1)))

# and create a time series plot showing changes in depth over time
plot(data$Year,data$Depth,pch="",ylim = c(7,0))
for(i in 1:nrow(data)){
  secchiDisc(data$Year[i],data$Depth[i])
}



因此,這是按時間序列進行繪制時的外觀: 在此處輸入圖片說明

顯然,我可以水平拉伸圖直到清理干凈,但是我想知道是否有人對如何根據圖自動調整光盤大小有任何建議? 在此處輸入圖片說明

我嘗試自定義圓形功能以允許拉伸效果,但無濟於事。 我認為“拉伸效果”方法的問題之一是,我仍然希望光盤顯示圓形,但是我無法使圓的直徑獨立於x或y尺寸而變化。

我的另一個想法是將secchi光盤的空白圖另存為png文件,然后嘗試繪制導入的文件。 對這種方法有何想法?

謝謝你的幫助。

我想我有解決辦法。 如果沒有,我一定很親近。 問題在於,在您的函數中,x軸和y軸的直徑相同,而與數據范圍無關。 換句話說,“年”軸的范圍是45,而“深度”軸的范圍是〜5。 當您嘗試將相同的直徑單位應用到兩個軸時,圓的形狀會變形。 我的解決方案是計算x軸和y軸范圍的比率。 然后將該比率應用於circleFunsin線。 我不確定該比率是否應除以sqrt(2)但它可以工作。 另外,在繪制圖表之后,您不應該手動調整打印窗口的大小。 在繪圖前在Windows中使用win.graph或在Mac中使用quartz()

    # A circle function to draw a circle (pulled form another stackoverflow page)

circleFun <- function(center=c(0,0), diameter=1, npoints=100, start=0, end=1, filled=TRUE,ratio=1){
  tt <- seq(start*pi, end*pi, length.out=npoints)
  df <- data.frame(
    x = center[1] + diameter / 2 * cos(tt),
    y = center[2] + diameter/ratio / 2 * sin(tt)
  )
  if(filled==TRUE) { #add a point at the center so the whole 'pie slice' is filled
    df <- rbind(df, center)
  }
  return(df)
}

# and my function to create a secchi disc
secchiDisc = function(x,y,diameter = 1,ratio=1){
  quarterCircle1 = circleFun(c(x,y),diameter = diameter, start=0, end=0.5,ratio=ratio)
  quarterCircle3 = circleFun(c(x,y),diameter = diameter, start=1, end=1.5,ratio=ratio)
  fullCircle = circleFun(c(x, y), diameter, start=0, end=2,ratio=ratio)
  polygon(quarterCircle1$x,quarterCircle1$y,col="black")
  polygon(quarterCircle3$x,quarterCircle3$y,col="black")
  polygon(fullCircle$x,fullCircle$y)
}

data = as.data.frame(list(Year = 1970:2015,
                          Depth = rnorm(46,3,1)))

xx <-diff(range(data$Year))
yy <-diff(range(data$Depth))
ratio=(xx/yy)/sqrt(2)
plot(data$Year,data$Depth,pch="")
for(i in 1:nrow(data)){
  secchiDisc(data$Year[i],data$Depth[i],diameter = 1.5,ratio=ratio)
}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM