#6222 closed defect (fixed)
Very bad vertical axis scale with log Y
| Reported by: | massimo ceraolo | Owned by: | Adeel Asghar | 
|---|---|---|---|
| Priority: | high | Milestone: | |
| Component: | OMEdit | Version: | 1.16.0 | 
| Keywords: | Cc: | 
Description (last modified by )
Consider the enclosed Filter.mo model. Run it and plot Rl.abs_v against time on a linear scale: we see that the span of abs_v is between 0.00026 and 4. When we switch to logY scale therefore we expect the y axis span to be between 10-4 and 101.
Instead, it goes from 1e-100 to 1e-20, which is very bad.
Attachments (3)
Change History (10)
by , 5 years ago
comment:1 by , 5 years ago
| Description: | modified (diff) | 
|---|
comment:2 by , 5 years ago
comment:3 by , 5 years ago
| Milestone: | 1.17.0 → 1.18.0 | 
|---|
Retargeted to 1.18.0 because of 1.17.0 timed release.
comment:5 by , 4 years ago
I remember discussing the "difficulty" of creating good log scales, in which I read that even Dymola is not good at this. This discussion was on a different ticket, which I cannot find now.
I want to share here my code that is compact, simple, and works well, as you can see from the pictures pict1.png and pict2.png. I hope it may help to find fast a solution to this ticket.
In the code below I added some additional lines of comment to make it clearer what the data structures contain.
  /* Before this code I must have determined minimum and maximum values of the variable that should be
   *  represented by the axis: minVal and maxVal.   */
  if(myAxis.scaleType!=stLin){  //This is to select casesw iwhen I have decibel o true log scale
    if(maxVal<=0 || minVal<=0){ //minVal and maxVal are minimum and maximum values to be included in axis range
      if(myAxis.type==atX)
        msg="Cannot create a log scale on the x-axis\n"
            "because the range contains null or negative values\n\n"
            "Please change the variable to be plot, or the x-axis range or choose a linear scale";
      else
        msg="Cannot create a log scale on the y-axis\n"
            "because the range contains null or negative values\n\n"
            "Please change the variable to be plot, or the y-axis range or choose a linear scale";
      QMessageBox::critical(this, "MC's PlotXWin",msg,QMessageBox::Ok);
      return 1;
    }
    sprintf(buffer,"%+10.3e",double(minVal));
    sscanf(buffer+7, "%u", &myAxis.eMin);
    sprintf(buffer,"%+10.3e",double(maxVal));
    sscanf(buffer+7, "%u", &aux);
    /* If maxVal is not a power-of-ten, eMax=Aux+1, otherwise eMax=Aux*/
    buffer[6]=0;
    if(strcmp(buffer,"+1.000")==0)
      myAxis.eMax=aux;
    else
      myAxis.eMax=aux+1;
    myAxis.scaleFactor=1.;
    // *** The following two rows are the core of my technique to determine axis extrema ***
    myAxis.scaleMin=powf(10.,myAxis.eMin);
    myAxis.scaleMax=powf(10.,myAxis.eMax);
    // ***
    
    if(myAxis.scaleType==stDB){  //scale in DB: decibels
      sprintf(buffer,"%d",20*myAxis.eMin);
      myAxis.maxTextWidth=myPainter->fontMetrics().width(buffer);
      sprintf(buffer,"%d",20*myAxis.eMax);
      myAxis.maxTextWidth=qMax(myAxis.maxTextWidth, myPainter->fontMetrics().width(buffer));
      sprintf(buffer,"dB");
      if(useBrackets)
        sprintf(buffer,"(dB)");
      myAxis.maxTextWidth=qMax(myAxis.maxTextWidth, myPainter->fontMetrics().width(buffer));
    }else{// myAxis.ScaleType=stLog, and true logarithmic scale
        aux=myPainter->fontMetrics().width("10");
      sprintf(buffer,"%d",myAxis.eMin);
      myPainter->setFont(expFont);
      myAxis.maxTextWidth=aux+myPainter->fontMetrics().width(buffer);
      sprintf(buffer,"%d",myAxis.eMax);
      aux+=myPainter->fontMetrics().width(buffer);
      myAxis.maxTextWidth=qMax(myAxis.maxTextWidth,aux);
      myPainter->setFont(numFont);
    }
  }


I can confirm this, it was also the case in 1.14.x
Furthermore, the user-settings for min/max value of the log scale are ignored/ lead to display errors