TGraph 2 Y-axis for different's scales

User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

I need to make a graph to compare 2 graph lines on time, but values from one are too high to the other, is there any way to make 1 graph line to a 1 y-axis and the other line to a second y-axis?
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Hebert,

How about putting two graphs on the same page each with a different Y axis scale and the same X axis scale?

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

James Bott wrote:Hebert,

How about putting two graphs on the same page each with a different Y axis scale and the same X axis scale?

James
Hi James, look like a good solution but when Y-axis values overlap will be a mess, the big problem is that while Crude Oil is measured in hundreds of thousands, gas values is measured in millions, and we need to see both lines together to show how they interact each other. Searching in other's forum's I found this post http://forums.fivetechsupport.com/viewt ... 60#p105832
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Hebert,

If they are two different graphs, then they can have different ranges on the Y-axis and the increments will be different. So, for instance, the bottom graph could have a range from 300,000 to 500,000 and the top one could have a range from 400,000 to 5 million even if both graphs are physically the same height.

Another option is to just divide the gas values by 10 and plot them on the same graph. Since you are looking for interactions, the exact values seem to be of less importance.

It would also be interesting to plot the difference between the two values (measured at the same time). This would probably tell you more about the interaction than plotting them both separately.

I'm not sure what you wanted me to see in the other message thread about charts?

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

All right James, I'll give it a try, I'll show the result on this post.
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

James with this Code:

Code: Select all

#include "Fivewin.ch"
#include "TGraph.ch" 


FUNCTION MAIN() 

    LOCAL oDlg, oGraph1, oGraph2 

    DEFINE DIALOG oDlg; 
           SIZE 600, 500 

    @ 1, 1 GRAPH oGraph1; 
           SIZE 250, 200; 
           TYPE 3; 
           YVALUES 3D XGRID YGRID XVALUES LEGENDS 

    @ 1, 1 GRAPH oGraph2; 
           SIZE 250, 200; 
           TYPE 3; 
           YVALUES 3D XGRID YGRID XVALUES LEGENDS 

    oGraph1:aSeries = { { "Crude Oil MBD", CLR_GREEN ,, }}
    oGraph2:aSeries = { { "", CLR_GREEN ,, },{ "Gas MMPCD", CLR_HRED ,, }}

    oGraph1:aData = { { 14280, 20420, 12870, 25347, 7640 }} 
    oGraph2:aData = { {0,0,0,0,0 },{ 7520000, 11220760, 9745154, 10125000, 12210000 }} 

    oGraph1:nClrX = CLR_GREEN 
    oGraph1:nClrY = CLR_RED 
    oGraph2:nClrX = CLR_GREEN 
    oGraph2:nClrY = CLR_RED 
 
    @ 0, 0 BUTTON "Change" ACTION ( oGraph1:nType :=1 , oGraph1:Refresh() ) 

    ACTIVATE DIALOG oDlg; 
             CENTER 

RETURN NIL
 
I Get This:
Image
I need something like This:
Image
[/img]
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Heber,

As I suggested, try dividing all the gas values by 10 and plotting them. If that works then all you have to do is figure out how to place the Y-axis values on the right side.

But also, think of the bigger picture. Maybe there is a better way to find answers. That's why I also suggested plotting the difference between the two values. Sometimes you have to give them what they need instead of, or in addition to, what they want.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

James Bott wrote:Heber,

As I suggested, try dividing all the gas values by 10 and plotting them. If that works then all you have to do is figure out how to place the Y-axis values on the right side.

But also, think of the bigger picture. Maybe there is a better way to find answers. That's why I also suggested plotting the difference between the two values. Sometimes you have to give them what they need instead of, or in addition to, what they want.

James
Thank's James, you are right giving what they need in addition to what they want.
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Heber,

Here is an example chart. I think this is the best we can do with TChart without modifying it. TChart cannot handle putting different axis increments on the right-hand side. And, ideally you would want to give the axis itself a label (like "Gas Flow MMPCD") which would also require another modification.

You could just modify a copy of TChart and hardcode the modifications into it. Otherwise you might want to make changes to the class that would allow anyone to add the optional increments, increment labels, and the axis label. That would be much more work, I'm sure.

Image

An alternative (as I mentioned previously) is to put two separate charts on the same page (and/or screen).

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: TGraph 2 Y-axis for different's scales

Post by Marc Venken »

James,

Could you please post the sample code here ? Looks interesting for later use.
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Here's the source. Remember, don't copy it using MS Edge.

James

Code: Select all

/*
Purpose: Test charting to items with vastly different scales on the same chart
Author : James Bott
For    : Hebert Vargas
Date   : 08/07/2017 07:28:29 AM
*/

#include "Fivewin.ch"
#include "TGraph.ch" 


FUNCTION MAIN() 
                                                                                        
    LOCAL oDlg, oGraph, aData1, aData2, i
    
    // Assign the data
    aData1:= { 14280, 20420, 12870, 25347, 7640 }
    aData2:= { 7520000, 11220760, 9745154, 10125000, 12210000 }

    // Modify aData2 array values to fit chart scale
    for i = 1 to len(aData2)
       aData2[i] := aData2[i] / 1000 * 2.1
    next

    DEFINE DIALOG oDlg; 
           SIZE 600, 500 

    @ 1, 1 GRAPH oGraph; 
           SIZE 285, 220; 
           TYPE 3; 
           YVALUES 3D XGRID YGRID XVALUES LEGENDS
           
    oGraph:nPoint:=1
    
    //msgInfo( oGraph:nPenWidth)
    oGraph:nPenWidth:=5 // has no effect on pen width. (bug?)     
           
           
    oGraph:nType := 3                        // 3=line chart
    oGraph:cSubTit:= "Oil & Gas Flow Rates"

    oGraph:aSeries = { { "Crude Oil MBD", CLR_HBLUE ,, },{ "Gas MMPCD", CLR_HRED ,, }}
    oGraph:aData = { aData1 ,  aData2  }

    // Y-axis data. Note they are incorrectly labled "X"
    oGraph:nMaxVal:= 30000
    oGraph:nXRanges:= 6   // number of y-axis label increments
    oGraph:cTitX := "Oil Flow Rate MBD" 
    
    // X-Axis data. Note that they are incorrectly labled with a "Y" 
    oGraph:aYVals = { "1", "2", "3", "4", "5" }  // Should these be dates?
    oGraph:cTitY:="Days?"
 

    ACTIVATE DIALOG oDlg; 
             CENTER 
             
    //msgInfo( oGraph:nPenWidth )

RETURN NIL
 
// EOF 
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: TGraph 2 Y-axis for different's scales

Post by Marc Venken »

Thanks.
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: TGraph 2 Y-axis for different's scales

Post by hebert_j_vargas »

James Bott wrote:Here's the source. Remember, don't copy it using MS Edge.

James

Code: Select all

/*
Purpose: Test charting to items with vastly different scales on the same chart
Author : James Bott
For    : Hebert Vargas
Date   : 08/07/2017 07:28:29 AM
*/

#include "Fivewin.ch"
#include "TGraph.ch" 


FUNCTION MAIN() 
                                                                                        
    LOCAL oDlg, oGraph, aData1, aData2, i
    
    // Assign the data
    aData1:= { 14280, 20420, 12870, 25347, 7640 }
    aData2:= { 7520000, 11220760, 9745154, 10125000, 12210000 }

    // Modify aData2 array values to fit chart scale
    for i = 1 to len(aData2)
       aData2[i] := aData2[i] / 1000 * 2.1
    next

    DEFINE DIALOG oDlg; 
           SIZE 600, 500 

    @ 1, 1 GRAPH oGraph; 
           SIZE 285, 220; 
           TYPE 3; 
           YVALUES 3D XGRID YGRID XVALUES LEGENDS
           
    oGraph:nPoint:=1
    
    //msgInfo( oGraph:nPenWidth)
    oGraph:nPenWidth:=5 // has no effect on pen width. (bug?)     
           
           
    oGraph:nType := 3                        // 3=line chart
    oGraph:cSubTit:= "Oil & Gas Flow Rates"

    oGraph:aSeries = { { "Crude Oil MBD", CLR_HBLUE ,, },{ "Gas MMPCD", CLR_HRED ,, }}
    oGraph:aData = { aData1 ,  aData2  }

    // Y-axis data. Note they are incorrectly labled "X"
    oGraph:nMaxVal:= 30000
    oGraph:nXRanges:= 6   // number of y-axis label increments
    oGraph:cTitX := "Oil Flow Rate MBD" 
    
    // X-Axis data. Note that they are incorrectly labled with a "Y" 
    oGraph:aYVals = { "1", "2", "3", "4", "5" }  // Should these be dates?
    oGraph:cTitY:="Days?"
 

    ACTIVATE DIALOG oDlg; 
             CENTER 
             
    //msgInfo( oGraph:nPenWidth )

RETURN NIL
 
// EOF 
Thank's James, I already did it, I think I'll give it a try modifying the tgraph class to show 2 Y-axis, and adding some required features as placing legends on top, left,right and bottom of the graph.
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by nageswaragunupudi »

I appreciate your ingenuity in finding a nice workaround.
Now TGraph does not support 2 Y-Axis and we all agree that this is a required feature.
We shall provide this very soon.
Regards

G. N. Rao.
Hyderabad, India
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: TGraph 2 Y-axis for different's scales

Post by James Bott »

Nages,

TGraph is a great class, however, it does have it's shortcomings.

Most of the variable names are very cryptic and many are misleading which causes constant confusion. For instance, the X and Y axis variables are swapped. The X variables are really for the Y-axis and visa versa. Very confusing.

For instance, these are for the Y-axis and either do not contain a "Y" or contain an "X" instead:

nMaxVal - This is actually the maximum value of the Y-axis but is not labeled with a "Y" and there is no setting for the maximum X-axis. The variable name should be nYMaxValue.

nXRanges - number of Y-axis label increments. This would be better labeled nYIncrements

cTitX - This is for the Y-axis and would be better named cYTitle. One wonders, why was it abbreviated to save two characters in the name.

These are for the X-axis and are mistakenly labeled with a "Y" instead:

aYVals - list of X-axis values for increment labels. Should be aXIncrementValues

cTitY – This is the title for the X-axis. It should be cXTitle.

These are just some examples–there are many more.

One other issue that the X-axis can only be used as a time-series type increment (i.e. you can’t put points between the X-axis increments). This makes the class very limited.

Of course, changing variable names will break existing code, so I suggest creating a new class instead of making any changes to the existing one.

I’m sure others will have some input on this as well.

Oh, I should also note that the wiki for the TGraph class has the wrong descriptions for the variables for the X and Y axises.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Post Reply