Page 1 of 2

RANGO DE VALORES DE Y EN TGRAH

Posted: Sun Jul 21, 2019 11:02 pm
by joseluisysturiz
Saludos, he buscado en la clase y por todo el foro, pero de verdad no consigo como colocar los RANGOS de los valores de Y en TGraph, estoy haciendo grafica de barras y necesito que los valores de Y sean de 500 en 500, ya que veo que lo que haces es colocar los valores de la DATA hasta el de valor maximo, probe con nMax y no hace nada, alguna idea.? saludos...gracias... :shock:

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Tue Jul 23, 2019 3:27 pm
by joseluisysturiz
Saludos, por lo visto a nadie le ha importado lo de los rangos de valores de Y con la TGRAPH.? o es que no se pueden cambiar.? me gustaria por lo menos un comentario para ver que hago, si cambio de clase o que...saludos... :shock:

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Tue Jul 23, 2019 4:20 pm
by cnavarro
Creo recordar que es la data aYVals, pero nunca la he tocado

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Tue Jul 23, 2019 8:08 pm
by AngelSalom
No creo que la clase lo permita. Revisa el método XYmax_min de la clase. Si te fijas calcula los valores a partir del máximo y mínimo de los datos pasados y establece el rango de la Y , deberías jugar con ese método para lo que necesitas.

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Tue Jul 23, 2019 9:04 pm
by joseluisysturiz
cnavarro wrote:Creo recordar que es la data aYVals, pero nunca la he tocado
Saludos Navarro, la aYVals lo que veo qe maneja son los nombre de los valores a graficar, lo que necesito es que los valores que se muestran en el EJE Y (verticalmente), inicien en 0 y de 500 en 500 hasta el valor maximo de la data.

Ya consegui quien manipula esa informacion, nMin y nMax, nMin toma el valor minimo de la DATA mas alta y nMax el valor mas alto, y entonces crea los rangos de Y, haciendo nMin++ hasta nMax, yo necesito que inicie nMin en 500 y vata de 500 en 500 hasta nMax, ya lo cambie en mi sistema haciendo esto oGraph:nMinVal := 500 y no lo respeta, consegui en TGraph una funcion DetMinVal(nNum) que parece es la que hace dicho calculo (Nueva funcion, para cuando TODOS los valores de la grafica sean mayores a cero (>0)), pero hice cambios y nada, cualquier ayuda seria muy agradecida...saludos... :shock:

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 12:36 am
by joseluisysturiz
Creo que esta imagen sera mas clara que lo que explico...gracias...saludos... :shock:

Image
[/img]

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 2:17 pm
by armando.lagunas
mi resultado:

imagen original

Image

revisé la clase y según veo el valor minino y máximo, solo ve la coordenada de donde empieza a graficar y no la escala y que siempre parte de 0, y mueve el eje si los números son Positivos y negativos.

fijé a un valor entero y la grafica solo se movió, yo lo fije a 5000 para el ejemplo,

Codigo:

Code: Select all

       
                oGraph:aData   := { aPrecX }        <-- array con los valores
                oGraph:nMaxVal := 5000            <-- fijo el valor a este
                oGraph:Refresh()
 

Imagen del resultado

Image


la escala es calculada segun los valores que obtenga la clase, y eso es logico para mi, ya que no tengo certeza alguna que los valores que grafico son positivos o negativos, valores grandes o pequeños.

si lo que realmente quieres que sea una escala fija, 50 en 50, 100 en 100, 500 en 500, etc... deberías de modificar la clase a tu necesidad, en el método paint() esta el calculo de la escala, tendrias que revisar los valores de las variables y realizar el calculo necesario.

Code: Select all

...
...
...

   // Max, Min values
   nMax := IF( ::nMaxVal <> 0 , ::nMaxVal , 0 )
   FOR nJ := 1 TO Len( ::aSeries )
      FOR nI :=1 TO Len( ::aData[nJ] )
         nMax := Max( ::aData[nJ][nI], nMax )
      NEXT nI
   NEXT nJ
   nMin := IF( ::nMinVal <> 0 , ::nMinVal , 0 )
   FOR nJ := 1 TO Len( ::aSeries )
      FOR nI :=1 TO Len( ::aData[nJ] )
         nMin := Min( ::aData[nJ][nI], nMin )
      NEXT nI
   NEXT nJ

   nXMax := IF( nMax > 0, DetMaxVal( nMax ), 0 )
   nXMin := IF( nMin < 0, DetMaxVal( nMin ), 0 )
   nHigh := nXMax + nXMin
   nMax  := Max( nXMax, nXMin )

   nRel:= IF( nHigh>0, nMaxBar / nHigh , 1 )
   nMaxBar := nMax * nRel

   // Zero pos
   //
   nZero:=Max(nBottom+(nXMin*-1*nRel),IF(nXMax>0,nTop+(nXMax*nRel)+nDeep,0))
   IF l3D
      FOR nI := 1 TO nDeep+1
         ::DrawLine(nZero-nI+1, nLeft-nDeep+nI, nZero-nI+1, nRight-nDeep+nI, CLR_HGRAY)
      NEXT nI
   ENDIF

   aPoint := Array( Len( ::aSeries ), Len( ::aData[1] ), 2 )
   nRange := IF( ::nXRanges>0, nMax / ::nXRanges, 1)

   // Calculate data ranges
   FOR nI = 1 TO ::nXRanges
      AAdd( aRange, nRange * nI )
   NEXT nI

   AAdd( aRange, nMax ) 

   // xValues
   //
   nRPos := nRNeg := nZero - nDeep
   FOR nI := 0 TO ::nXRanges
      IF lxVal
         IF nXMax >= nRange*nI
            ::Say( nRPos+nDeep-5, nLeft-nDeep-10, Tran( nRange* nI, ::cPicture ), ;
            ::aFont[2], ::nClrX, ::nTRight )
         ENDIF
         IF nXMin*-1 <= nRange*-nI
            ::Say( nRNeg+nDeep-5, nLeft-nDeep-10, Tran( nRange*-nI, ::cPicture ), ;
            ::aFont[2], ::nClrX, ::nTRight )
         ENDIF
      ENDIF
      IF ::lxGrid
         IF nXMax > nRange*nI
            ::DrawLine( nRPos+nDeep, nLeft-nDeep, nRPos, nLeft, ::nClrGrid, ::lDotted )
            ::DrawLine( nRPos, nLeft, nRPos, nRight, ::nClrGrid, ::lDotted )
         ENDIF
         IF nXMin*-1 <  nRange*-nI
            ::DrawLine( nRNeg+nDeep, nLeft-nDeep, nRNeg, nLeft, ::nClrGrid, ::lDotted )
            ::DrawLine( nRNeg, nLeft, nRNeg, nRight, ::nClrGrid, ::lDotted )
         ENDIF
      ENDIF
      nRPos -= ( nMaxBar / ::nXRanges )
      nRNeg += ( nMaxBar / ::nXRanges )
   NEXT nI

   IF !lxVal
      ::Say( nZero-5, nLeft-nDeep-3, "0", ::aFont[8], ::nClrV, ::nTRight)
   ENDIF
...
...

 


saludos

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 2:53 pm
by joseluisysturiz
Saludos, Angel, Armando Laguna, en ese methodo es que estoy haciendo las pruebas, funciones DetMaxVal y DetMinVal, aunque tiene logica lo que dices Armando, yo deberia poder decir simplemente como quiero mis rangos de Y, es como ver una inyectadora, tiene separadores de 1CC en 1CC y tambien 0.5CC, no importa la cantidad que contenga, uno le carga guiandose por los valores prederterminados, o el ejemplo de un METRO para medir, dividio en pulgadas o centimetros dependiendo de la forma de medir deseada, el punto es que no veo viable que se creen los valores Z dependiendo de Min y Max ya que cuando igual hay un valor a graficar por debajo de min no muestra en Z ese valor y solo tengo la linea horizontal que me hace calcular al ojo porciento el presunto valor, tampoco veo como colocar los valores graficados sobre las barras, eso tambien por los momentos ayudaria un poco, ya que el cliente quiere saber con exactitud el valor graficado y no tener que estar adivinando o presumiendo el valor por ser muy algo o muy bajo los rangos, igual vere si puedo mdificar el methodo que dices, no conozco mucho el manejo de clases en su interior, pero creo que solo debo es modificar la forma de calcular Min y Max, gracias por sus aporte, saludos... :shock:

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 3:37 pm
by cnavarro
joseluisysturiz wrote:Creo que esta imagen sera mas clara que lo que explico...gracias...saludos... :shock:

Image
[/img]
En este mismo gráfico, sin modificar la clase, al final de la definición del gráfico, pon esto y vamos afinando el tema

Code: Select all

oGraph:nXRanges  := 6
 
Pero lo que me tienes que explicar bien es el por qué necesitas modificar los valores min y max calculados por la propia clase

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 5:37 pm
by joseluisysturiz
Navarro, el valor exacto para esta grafica es oGraph:nXRanges := 5.4, alli esta la muestra, me doy cuenta que para que haya este resultado o una aproximacion al valor requerido(500) en los rangos de Y se divive el valor maximo de la data mas alta entre el valor deseado(500) y Ej. 2660/500 = 5.32, redondeando hacia arriba 5.4, el detalle es saber quien contiene el valor maximo de la data mas alta, pero por alli como dices, va el tiro.

Si por mi fuese lo dejase como esta, pero EL CLIENTE requiere que sea rangos de 500, como comente anteriormente para poder divisar mejor el valor graficado, tambien comente que si hubiece alguna forma que no la he conseguio de colocar sobre la barra el monto graficado, en el ejemplo mostrado, laminados(225, 450, 675) y el vinil(950, 285, 950, 475, 2660), creo que seria una buena idea y el cliente estaria algo satisfecho.

Revisando en el foro vi una grafica de un colega que sus valores Y van de 250 en 250, aunque sus valores graficados son mas altos y mas bajos, pero ahora no consigo cual fue, por eso asumi que seria algo relativamente facil, seguire buscando a ver si puede comentar como lo hizo, espero tus comentarios y sugerencias...gracias...saludos.. :shock:

[img]
https://i.ibb.co/wpL8m5g/grafica-500.jpg
[/img]

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 5:55 pm
by cnavarro
Bien, como te he dicho, intentemos ir solucionando temas paso a paso
Ahora, a continuación de la definición del gráfico, pon esto

Code: Select all

   @ nT, nL GRAPH oGraph SIZE Int( nW / 2 ) - 2, nH PIXEL OF oP ;
      TITLE "Sales and Costs" ;
      XVALUES YVALUES LEGENDS

   // pon esto nada más definir el gráfico
   // si lo pones después de definir las series no te va a funcionar
   oGraph:lViewVal := .T.

 
Prueba y dime

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 6:07 pm
by cnavarro
Por cierto, si al final de la definición de todos los parámetros, datas, etc del gráfico, asigno el max value, me respeta dicho valor y en la gráfica me aparece ese valor máximo en el eje Y.
Para implementarlo, si quieres que los intervalos sean siempre con un valor fijo ( creo que has dicho 500 ), es hacer la operacion que has indicado antes para calcular el numero de nXRanges, coger su valor entero, sumarle 1 y ese valor multiplicarlo por 500, tendría el mismo efecto me parece a mi.

Code: Select all


      oGraph:nXRanges  := 8
      // Esto
      oGraph:nMaxVal   := 3000

 

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 6:49 pm
by joseluisysturiz
cnavarro wrote:Bien, como te he dicho, intentemos ir solucionando temas paso a paso
Ahora, a continuación de la definición del gráfico, pon esto

Code: Select all

   @ nT, nL GRAPH oGraph SIZE Int( nW / 2 ) - 2, nH PIXEL OF oP ;
      TITLE "Sales and Costs" ;
      XVALUES YVALUES LEGENDS

   // pon esto nada más definir el gráfico
   // si lo pones después de definir las series no te va a funcionar
   oGraph:lViewVal := .T.

 
Prueba y dime
Navarro, haciendo lo que sugieres da este error

Code: Select all

   Error occurred at: 24/07/2019, 14:40:10
   Error description: Error BASE/1066  Error de argumento: condicional
   Args:
     [   1] = U   

Stack Calls
===========
   Called from: .\source\classes\TGRAPH.PRG => TGRAPH:PAINT( 1289 )
   Called from: .\source\classes\TGRAPH.PRG => (b)TGRAPH( 135 )
   Called from: .\source\classes\TGRAPH.PRG => TGRAPH:DISPLAY( 0 )
   Called from: .\source\classes\CONTROL.PRG => TGRAPH:HANDLEEVENT( 1767 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3541 )
 
coloque la linea en diferentes partes y siempre el mismo error, es mas esa DATA es usada aca
AAdd( ::aSeries, { cLegend, nColor, nType, l3D, lViewVal, lDrawPoint, lDrawLine, cSRLegend } )

la puse en .t. y no dio error pero tampoco coloco los valores sobre las barras que imagino era la idea, voy probar lo que sugieres en tu otra respuesta, saludos... :shock:

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 6:55 pm
by cnavarro
Qué versión de Fw utilizas?, porque a mi me funciona correctamente y no entiendo por qué te da error
Precisamente porque es utilizada como parámetro en el ADDSeries es por lo que hay que darle ese valor antes que nada

Re: RANGO DE VALORES DE Y EN TGRAH

Posted: Wed Jul 24, 2019 7:09 pm
by joseluisysturiz
cnavarro wrote:Qué versión de Fw utilizas?, porque a mi me funciona correctamente y no entiendo por qué te da error
Precisamente porque es utilizada como parámetro en el ADDSeries es por lo que hay que darle ese valor antes que nada
Version en uso es 19.01, a menos que sea algo nuevo que tengas en tu clase TGraph y yo no tenga, si puedes enviame tu TGraph a joseluisysturiz@yahoo.com, gracias

Asi lo tengo apenas defino

Code: Select all

oGraph:lViewVal := .t. // SUGERIDO X NAVARRO - 24/07/2019
   oGraph:cTitle   := "METROS VENTAS MENSUALES " + cValToChar( Year( Date() ) ) // 19/06/2019
   oGraph:cTitX    := "Montos Metros" // TITULO VER. - 19/06/2019
   oGraph:cTitY    := "Meses" // TITULO HOR. - 19/06/2019
   oGraph:nBarSep  := 10 // Separador entre barras 1 - 19/06/2019
   oGraph:lxGrid   := .t. // Rejilla en X .t. - 19/06/2019
   oGraph:lyGrid   := .t. // Rejilla en Y .t. - 19/06/2019
   oGraph:nClrX    := CLR_GREEN // COLOR TEXTO X
   oGraph:nClrY    := CLR_RED // COLOR TEXTO Y
   oGraph:lLegends := .t. // MOSTRAR O NO LEYENDA - 19/06/2019
   oGraph:lxVal    := .t. // Mostrar valores en X .t. - 21/06/2019
   oGraph:lyVal    := .t. // Mostrar etiquetas en Y .t. - 19/06/2019
   oGraph:lBorders := .f. // Bordes en gráfico de barras .f. - 19/06/2019
   oGraph:lSelView := .f. // Seleccionar opción 'Ver' .t. - EN EL MENU POPUOP - 19/06/2019
   oGraph:lSelBack := .f. // Seleccionar opción 'Fondo' .t.