T. BruceLee T. BruceLee - 8 days ago 6
R Question

fdcu ylim doesn't work in plot package: hydroTSM - logaritmic y-axis

I am trying to plot a flow duration curve with the package hydroTSM, using the fdcu.matrix function. Unfortunatelly I cannot manage to increase or decrease the y-axis length. I tried it with ylim=c(lownumber,highnumber).

When this didn't work I tried to copy paste the package in R, so that I could run it as a function and adjust it... but the fdcu.matrix unfortunately doesn't run without the require(hydroTSM).

(available at https://github.com/cran/hydroTSM/blob/master/R/fdcu.R)

how can I manually or automatically adjust the ylim to the datarange..?

This a part of my data matrix:


dput(m.fdc01[1:20,1:5])

structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 6.45, 6.45, 6.45, 6.45, 6.372, 6.372, 6.529,
7.09, 3.8, 8.015, 8.277, 9.361, 10.41, 10.705, 9.548, 8.811,
9.176, 8.631, 8.542, 8.365, 8.189, 8.102, 7.588, 7.42, 7.254,
7.09, 7.008, 6.927, 6.847, 6.767, 6.687, 6.687, 6.687, 6.687,
6.847, 6.927, 1.008, 6.927, 7.09, 7.758, 8.277, 7.929, 7.843,
7.673, 7.588, 7.588, 7.588, 7.588, 7.588, 7.42, 7.42, 8.811,
9.927, 8.631, 8.189, 7.673, 7.42, 7.254, 7.008, 7.008, 17.397,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 16.782, 15.82), .Dim = c(20L, 5L), .Dimnames = list(NULL,
c("DayOfYear", "1970", "1971", "1972", "1973")))


# Plot with multiple flow duration curves & legend:

require(hydroTSM)
fdcu.matrix(m.fdc01[,-1], lband=m.fdc01[,-1], uband=m.fdc01[,-1], sim=m.fdc[,-1], plot=TRUE,
main ="FDC station 1LA04:1970-1978", xlab="% Time flow equalled or exceeded",
ylab="Q, [m3/s]", ylim=c(1,50),yat=c(0.01,0.02,0.05, 0.1,0.2,0.5, 1,2,5,10,20,50,100),
bands.col = "white", col=col_matsel, lwd=mat_lwd,leg.txt="",
leg.cex=0.5,leg.pos="auto",cex.axis=1,thr.shw=FALSE)
legend("bottomleft",legendtextsel,col=col_matsel, lwd=4, y.intersp=1,bty="n",cex=1)


enter image description here

Answer

I feel this is a bug. I would recommend that you contact the developer. When fdcu.matrix() uses fdcu() in the algorithm, fdcu.matrix() doesn't give the information of ylim to fdcu(). You can make the modifid fdcu.matrix() easily by copying the original code and deleting only one term.

Preparation
Run fdcu.matrix and copy the output (i.e., the original code).

Make your function (almost all is pasted)
fdcu.matrix2 <- ""paste"" and delete the argument,ylim.

for reference
fdcu.matrix2 <- 
function (x, lband, uband, sim, lQ.thr = 0.7, hQ.thr = 0.2, plot = TRUE, 
    log = "y", main = "Flow Duration Curve", xlab = "% Time flow equalled or exceeded", 
    ylab = "Q, [m3/s]", ylim, yat = c(0.01, 0.1, 1), xat = c(0.01, ...
                        ^^^^^ delete!!
example
require(hydroTSM)

fdcu.matrix2(m.fdc01[,-1], lband=m.fdc01[,-1], uband=m.fdc01[,-1], sim=m.fdc01[,-1], 
      plot=TRUE, main ="fdcu.matrix2_test", xlab="xlab", ylab="Q, [m3/s]", 
      ylim=c(1,50), yat=c(0.01,0.02,0.05, 0.1,0.2,0.5, 1,2,5,10,20,50),
      bands.col="white", leg.txt="", leg.cex=0.5, leg.pos="auto", 
      cex.axis=0.7, thr.shw=FALSE)

  # [note] yat and pretty(ylim) are ylabels

  # [note2 (edited)]
  # when log = "y", ylim[1] is disregarded and 0.01 is used instead of it.

enter image description here

Comments