Clipper On Line • Ver Tópico - Gráfico XY..
Página 1 de 2

Gráfico XY..

MensagemEnviado: 21 Nov 2018 21:15
por lugab
Boa noite, pessoal..

Alguém tem um código de gráfico simples pra compartilhar, do tipo que a gente informa o "Título do gráfico", e "nomes" e "valores" da coordenada "X" ?
Pode ser circular ou cartesiano, tanto faz.
Hoje eu andei vendo aqui no fórum e não achei o que aproveitar

Eu uso Hb3.2

Grato

Gráfico XY..

MensagemEnviado: 21 Nov 2018 21:48
por JoséQuintas
Infelizmente o que tenho é dependente da GTWVG do Harbour 3.4.
No 3.2 a GTWVG é limitada em uma coisa simples: tamanhos sempre em linhas/colunas, em números inteiros.

Na LIB JoseQuintas

ze_barchartclass.prg

exemplos de uso

pbancograficomes.prg
pbancografresumo.prg

gtwvg1.png


Um mais complexo só na OOHG, usando bostaurus.
Talvez possa ser adaptado pra GTWVG, se não tiver função dependente da oohg.

Gráfico XY..

MensagemEnviado: 21 Nov 2018 21:50
por JoséQuintas
Mas só lembrando... pra que simplificar? Vai direto pra RMChart.

mesma lib, ze_rmchartclass.prg

programa teste em tests/rmchart

gtwvg2.png


gtwvg3.png

Gráfico XY..

MensagemEnviado: 22 Nov 2018 16:19
por lugab
Valeu, Mestre Quintas..

Eu fui na página https://github.com/JoseQuintas procurar
LIB JoseQuintas
ze_barchartclass.prg
exemplos de uso
pbancograficomes.prg
pbancografresumo.prg

e não achei...
Eu sei q to indo no lugar errado, então, me passe o link aí

Gráfico XY..

MensagemEnviado: 22 Nov 2018 20:16
por JoséQuintas

Gráfico XY..

MensagemEnviado: 22 Nov 2018 21:11
por lugab
Obrigado, Quintas,..

E pra terminar: como é q compila, tem um .HBP pronto ?

Grato

Gráfico XY..

MensagemEnviado: 22 Nov 2018 21:38
por JoséQuintas
Na prática esse é meu aplicativo, mas não completo.
Pra compilar tudo tá na pasta tests/
Vai abrir os módulos liberados como públicos, muuuitos.

Não criei nada independente, exceto o que está em samples/

Exceto também, por exemplo, o formatador de fontes, em drafts/prgformat.prg

Tudo em sources\ entram no meu aplicativo, então complicado deixar independente.

Mas pode compilar o tests/ e acrescentar/retirar módulos.

Gráfico XY..

MensagemEnviado: 27 Nov 2018 12:27
por lugab
Obrigado, Quintas..
Não consegui testar, Vou ver se encontro algum exemplo de geração de gráficos no excel

Gráfico XY..

MensagemEnviado: 27 Nov 2018 12:51
por JoséQuintas
#include "inkey.ch"

PROCEDURE Main

   LOCAL aBarras := { "BARRA-1", "BARRA-2", "BARRA-3" }
   LOCAL aMeses := { "JAN", "FEV", "MAR", "ABR", "MAI" }
   LOCAL aValor := { ;
      { 1000, 2000, 3000, 4000, 5000 }, ;
      { 3000, 4000, 5000, 6000, 7000 }, ;
      { 5000, 6000, 7000, 5000, 4000 } }
   LOCAL oGrafico

   SetMode( 40, 100 )
   oGrafico := BarChartClass():New()
   oGrafico:nTop := 2
   oGrafico:nLeft := 0
   oGrafico:nBottom := MaxRow() - 3
   oGrafico:nRight := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle := "COMPARATIVO"
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues := aValor
   oGrafico:Show()
   Inkey(0)

   RETURN


teste.png

Gráfico XY..

MensagemEnviado: 27 Nov 2018 12:58
por JoséQuintas
Com gtwvw

gtwvw.png


Com não sei qual, talvez console, talvez gtwvt

gtnaosei.png

Gráfico XY..

MensagemEnviado: 27 Nov 2018 13:02
por JoséQuintas
No primeiro teste indiquei a lib: hbmk2 test josequintas.hbc

Nos demais, só o test.prg e ze_barchartclass.prg
ou sem parâmetro adicional ou com gtwvw.hbc

E correção: não depende de GTWVG, é console mesmo.

Gráfico XY..

MensagemEnviado: 27 Nov 2018 20:09
por JoséQuintas
Uia....
Minha PRIMEIRA classe no FlagShip....

flagship.png


deu um trabalhinho pra descobrir a sintaxe, mas foi...
Compatível Flagship X Harbour

#include "inkey.ch"

PROCEDURE Main

   LOCAL aBarras := { "BARRA-1", "BARRA-2", "BARRA-3" }
   LOCAL aMeses := { "JAN", "FEV", "MAR", "ABR", "MAI" }
   LOCAL aValor := { ;
      { 1000, 2000, 3000, 4000, 5000 }, ;
      { 3000, 4000, 5000, 6000, 7000 }, ;
      { 5000, 6000, 7000, 5000, 4000 } }
   LOCAL oGrafico

   SetMode( 25, 80 )
#ifdef FlagShip
   oGrafico := BarChartClass{}
#else
   oGrafico := BarChartClass():New()
#endif
   ? ValType( oGrafico )
   Inkey(0)
   oGrafico:nTop := 2
   oGrafico:nLeft := 0
   oGrafico:nBottom := MaxRow() - 3
   oGrafico:nRight := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle := "COMPARATIVO"
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues := aValor
   oGrafico:Show()
   Inkey(0)

   RETURN


/*
ZE_CHART - Gráfico de barras simples
2016.05 - José Quintas
*/

#ifndef FlagShip
   #include "hbclass.ch"
#else
   #define INIT :=
   #define VAR  EXPORT
#endif

CLASS BarChartClass

   VAR    cTxtTitle            INIT ""
   VAR    aTxtBarList          INIT {}
   VAR    aTxtSubList          INIT {}
   VAR    aValues              INIT {}
   VAR    nTop                 INIT 0
   VAR    nLeft                INIT 0
   VAR    nBottom              INIT MaxRow()
   VAR    nRight               INIT MaxCol()
   VAR    nMaxValue            INIT 10
   VAR    nIncrement           INIT 1
   VAR    nGradeCount          INIT 5
#ifndef FlagShip
   METHOD Show()
   METHOD CalcMaxValue()
   METHOD ShowEmpty()
   METHOD ShowColBar()
   METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna )
   METHOD BarColor( nNumColor )

   ENDCLASS
#endif

METHOD Show() CLASS BarChartClass

   ::CalcMaxValue()
   Scroll( ::nTop, ::nLeft, ::nBottom, ::nRight, 0 )
   ::ShowEmpty()
   ::ShowColBar()

   RETURN NIL

METHOD CalcMaxValue() CLASS BarChartClass

   LOCAL nCont, nCont2

   FOR nCont = 1 TO Len( ::aValues )
      FOR nCont2 = 1 TO Len( ::aValues[ nCont ] )
         ::nMaxValue := Max( ::nMaxValue, ::aValues[ nCont, nCont2 ] )
      NEXT
   NEXT
   DO WHILE .t.
      ::nIncrement *= 10
      IF ::nIncrement * ::nGradeCount > ::nMaxValue
         EXIT
      ENDIF
   ENDDO
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   ::nMaxValue  := ::nIncrement * ::nGradeCount

   RETURN NIL

METHOD ShowEmpty()  CLASS BarChartClass

   LOCAL nCont

   // Título
   @ ::nTop, Int( ( ::nRight - ::nLeft - 1 - Len( ::cTxtTitle ) ) / 2 ) SAY " " + ::cTxtTitle + " " COLOR "N/W"

   // Linhas horizontal/vertical
   @ ::nTop + 2, ::nLeft + 12 TO ::nBottom - 3, ::nLeft + 12
   @ ::nBottom - 3, ::nLeft + 12 TO ::nBottom - 3, ::nRight - 2

   // Valores da barra vertical
   FOR nCont = 1 TO ::nGradeCount
      @ ::nBottom - 3 - ( ( ::nBottom - ::nTop - 6 ) / ::nGradeCount * nCont ), ::nLeft SAY nCont * ::nIncrement PICTURE "9999999999"
      @ Row(), ::nLeft + 13 TO Row(), ::nRight - 3
   NEXT

   // Legenda
   @ ::nBottom - 1, ::nLeft SAY ""
   FOR nCont = 1 TO Len( ::aTxtSubList )
      @ Row(), Col() + 2 SAY Space(2) COLOR ::BarColor( nCont )
      @ Row(), Col() + 2 SAY ::aTxtSubList[ nCont ]
   NEXT

   RETURN NIL

METHOD ShowColBar()  CLASS BarChartClass

   LOCAL nCont, nLarguraColuna

   nLarguraColuna := Int( ( ::nRight - ::nLeft - 11 ) / ( Len( ::aValues[ 1 ] ) + 1 ) )

   // cada grupo do gráfico
   FOR nCont = 1 TO Len( ::aTxtBarList )
      ::ShowColSub( nCont, 13 + ( ( nCont - 1 ) * nLarguraColuna ), nLarguraColuna )
   NEXT

   RETURN NIL

METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna ) CLASS BarChartClass

   LOCAL nCont, cColorOld, nRow

   cColorOld := SetColor()

   // barras de comparação
   FOR nCont = 1 TO Len( ::aTxtSubList )
      nRow := ::nBottom - ( ( ::nBottom - ::nTop - 2 ) * ::aValues[ nCont, nNumbar ] / ::nMaxValue )
      SetColor( ::BarColor( nCont ) )
      @ nRow, nColuna + nCont CLEAR TO ::nBottom - 4, nColuna + nCont
   NEXT
   SetColor( cColorOld )
   // legenda de cada coluna do gráfico
   @ ::nBottom - 2, nColuna + 1 SAY Pad( ::aTxtBarList[ nNumBar ], nLarguraColuna - 1 )

   RETURN NIL

METHOD BarColor( nNumColor ) CLASS BarChartClass

   DO CASE
   CASE nNumColor == 1 ; RETURN "9/9"
   CASE nNumColor == 2 ; RETURN "14/14"
   CASE nNumColor == 3 ; RETURN "15/15"
   CASE nNumColor == 4 ; RETURN "11/11"
   CASE nNumColor == 5 ; RETURN "12/12"
   ENDCASE

   RETURN "N/W"

Gráfico XY..

MensagemEnviado: 14 Fev 2020 23:26
por cjp
Estou começando agora a mexer com modo gráfico, bem iniciante mesmo.

Estou precisando de um gráfico nesse estilo XY, citado inicialmente neste post.

Testei os exemplos deste post, mas não consegui compilar. Talvez porque não tenho gtwvw. Estou usando hwgui.

É possível fazer um gráfico assim em hwgui?

Gráfico XY..

MensagemEnviado: 15 Fev 2020 04:06
por JoséQuintas
Esses são pra console, HWGUI não é console.
Use RMCHAR ou outro.
Talvez.... apenas talvez.... o do próprio Windows, não sei se fica liberado geral.

Gráfico XY..

MensagemEnviado: 15 Fev 2020 11:43
por cjp
Pra console? É possível fazer gráfico assim em modo console? No 3.2 também, ou só no 3.4? Precisa de alguma lib especial?

O do windows mencionado acima eu tentei, mas não consegui.

Gráfico XY..

MensagemEnviado: 15 Fev 2020 23:31
por cjp
Consegui compilar este teu último exemplo e funcionou.

Só ainda não consegui entender muito bem.

Não vi onde foi definido as linhas, onde estão 2500, 5000, 7500 etc. Preciso mudar os valores.

Também tentei incluir mais valores em aValor. Acresci valores em aValor, mas o gráfico não foi alterado.

Também precisaria incluir novos valores em aMeses, mas deu erro.

Gráfico XY..

MensagemEnviado: 17 Fev 2020 16:09
por JoséQuintas
   LOCAL aBarras := { "BARRA-1", "BARRA-2", "BARRA-3" }
   LOCAL aMeses := { "JAN", "FEV", "MAR", "ABR", "MAI" }
   LOCAL aValor := { ;
      { 1000, 2000, 3000, 4000, 5000 }, ;
      { 3000, 4000, 5000, 6000, 7000 }, ;
      { 5000, 6000, 7000, 5000, 4000 } }
oGrafico:nGradeCount := 5


Faz tanto tempo que nem lembro mais, mas olhando o fonte, se fosse só um valor:
LOCAL aBarras := { "SO-UM" }
LOCAL aMeses := { "JAN", "FEV", "MAR", "ABR", "MAI" }
aValor := { ;
   { 1000, 2000, 3000, 4000, 5000 } }
oGrafico:nGradeCount := 1


A partir daí, se aumentar a quantidade de meses, precisa ajustar o tamanho dos arrays e nGradeCount.
E se aumentar quantas colunas vai comparar, aumentar os títulos e os arrays.

Gráfico XY..

MensagemEnviado: 25 Abr 2020 18:33
por cjp
Por favor, preciso de ajuda. Estou tentando usar este gráfico, mas estou tendo problema para enquadrá-lo dentro da minha tela de consulta. Preciso colocá-lo num canto específico e pequeno da tela.

Minha função está assim:

function grafico(menorgeral,dtmenorgeral,maiorgeral,dtmaiorgeral,menor30dias,dtmenor30dias,maior30dias,dtmaior30dias,ultima,dtultima)

         LOCAL aBarras := { "SO-UM" }
         LOCAL aMeses := { dtmenorgeral, dtmaiorgeral, dtmenor30dias, dtmaior30dias, dtultima }
         LOCAL aValor := { ;
         { menorgeral, maiorgeral, menor30dias, maior30dias, ultima } }
         LOCAL oGrafico

#ifdef FlagShip
   oGrafico := BarChartClass{}
#else
   oGrafico := BarChartClass():New()
#endif
   ? ValType( oGrafico )
   Inkey(0)
   oGrafico:nTop := 20
   oGrafico:nLeft := 30
   oGrafico:nBottom := MaxRow() - 3
   oGrafico:nRight := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle := "Cotações"
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues := aValor
   oGrafico:Show()
   Inkey(0)

   RETURN
   
   /*
ZE_CHART - Gráfico de barras simples
2016.05 - José Quintas
*/

#ifndef FlagShip
   #include "hbclass.ch"
#else
   #define INIT :=
   #define VAR  EXPORT
#endif

CLASS BarChartClass

   VAR    cTxtTitle            INIT ""
   VAR    aTxtBarList          INIT {}
   VAR    aTxtSubList          INIT {}
   VAR    aValues              INIT {}
   VAR    nTop                 INIT 0
   VAR    nLeft                INIT 0
   VAR    nBottom              INIT MaxRow()
   VAR    nRight               INIT MaxCol()
   VAR    nMaxValue            INIT 10
   VAR    nIncrement           INIT 1
   VAR    nGradeCount          INIT 5
#ifndef FlagShip
   METHOD Show()
   METHOD CalcMaxValue()
   METHOD ShowEmpty()
   METHOD ShowColBar()
   METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna )
   METHOD BarColor( nNumColor )

   ENDCLASS
#endif

METHOD Show() CLASS BarChartClass

   ::CalcMaxValue()
   Scroll( ::nTop, ::nLeft, ::nBottom, ::nRight, 0 )
   ::ShowEmpty()
   ::ShowColBar()

   RETURN NIL

METHOD CalcMaxValue() CLASS BarChartClass

   LOCAL nCont, nCont2

   FOR nCont = 1 TO Len( ::aValues )
      FOR nCont2 = 1 TO Len( ::aValues[ nCont ] )
         ::nMaxValue := Max( ::nMaxValue, ::aValues[ nCont, nCont2 ] )
      NEXT
   NEXT
   DO WHILE .t.
      ::nIncrement *= 10
      IF ::nIncrement * ::nGradeCount > ::nMaxValue
         EXIT
      ENDIF
   ENDDO
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   ::nMaxValue  := ::nIncrement * ::nGradeCount

   RETURN NIL

METHOD ShowEmpty()  CLASS BarChartClass

   LOCAL nCont

   // Título
   @ ::nTop, Int( ( ::nRight - ::nLeft - 1 - Len( ::cTxtTitle ) ) / 2 ) SAY " " + ::cTxtTitle + " " COLOR "N/W"

   // Linhas horizontal/vertical
   @ ::nTop + 2, ::nLeft + 12 TO ::nBottom - 3, ::nLeft + 12
   @ ::nBottom - 3, ::nLeft + 12 TO ::nBottom - 3, ::nRight - 2

   // Valores da barra vertical
   FOR nCont = 1 TO ::nGradeCount
      @ ::nBottom - 3 - ( ( ::nBottom - ::nTop - 6 ) / ::nGradeCount * nCont ), ::nLeft SAY nCont * ::nIncrement PICTURE "9999999999"
      @ Row(), ::nLeft + 13 TO Row(), ::nRight - 3
   NEXT

   // Legenda
   @ ::nBottom - 1, ::nLeft SAY ""
   FOR nCont = 1 TO Len( ::aTxtSubList )
      @ Row(), Col() + 2 SAY Space(2) COLOR ::BarColor( nCont )
      @ Row(), Col() + 2 SAY ::aTxtSubList[ nCont ]
   NEXT

   RETURN NIL

METHOD ShowColBar()  CLASS BarChartClass

   LOCAL nCont, nLarguraColuna

   nLarguraColuna := Int( ( ::nRight - ::nLeft - 11 ) / ( Len( ::aValues[ 1 ] ) + 1 ) )

   // cada grupo do gráfico
   FOR nCont = 1 TO Len( ::aTxtBarList )
      ::ShowColSub( nCont, 13 + ( ( nCont - 1 ) * nLarguraColuna ), nLarguraColuna )
   NEXT

   RETURN NIL

METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna ) CLASS BarChartClass

   LOCAL nCont, cColorOld, nRow

   cColorOld := SetColor()

   // barras de comparação
   FOR nCont = 1 TO Len( ::aTxtSubList )
      nRow := ::nBottom - ( ( ::nBottom - ::nTop - 2 ) * ::aValues[ nCont, nNumbar ] / ::nMaxValue )
      SetColor( ::BarColor( nCont ) )
      @ nRow, nColuna + nCont CLEAR TO ::nBottom - 4, nColuna + nCont
   NEXT
   SetColor( cColorOld )
   // legenda de cada coluna do gráfico
   @ ::nBottom - 2, nColuna + 1 SAY Pad( ::aTxtBarList[ nNumBar ], nLarguraColuna - 1 )

   RETURN NIL

METHOD BarColor( nNumColor ) CLASS BarChartClass

   DO CASE
   CASE nNumColor == 1 ; RETURN "9/9"
   CASE nNumColor == 2 ; RETURN "14/14"
   CASE nNumColor == 3 ; RETURN "15/15"
   CASE nNumColor == 4 ; RETURN "11/11"
   CASE nNumColor == 5 ; RETURN "12/12"
   ENDCASE

   RETURN "N/W"


O resultado está como no print anexo.

Alguém pode me ajudar?

Gráfico XY..

MensagemEnviado: 25 Abr 2020 21:24
por JoséQuintas
Precisou corrigir aqui:

METHOD ShowColBar()  CLASS BarChartClass

   LOCAL nCont, nLarguraColuna

   nLarguraColuna := Int( ( ::nRight - ::nLeft - 11 ) / ( Len( ::aValues[ 1 ] ) + 1 ) )

   // cada grupo do gráfico
   FOR nCont = 1 TO Len( ::aTxtBarList )
      ::ShowColSub( nCont, ::nLeft + 13 + ( ( nCont - 1 ) * nLarguraColuna ), nLarguraColuna )
   NEXT

   RETURN NIL


Teste



PROCEDURE Main

   SetMode( 40, 100 )
   CLS
   Grafico( ;
      "Cotacoes", ;
      { "SOUM" }, ;
      { "01/01/80", "02/02/,80", "03/03/80", "04/04/80", "05/05/80" }, ;
      { { 5, 6, 7, 8, 9 } } )

   RETURN

FUNCTION Grafico( cTitulo, aBarras, aMeses, aValues )

   LOCAL oGrafico

   oGrafico := BarChartClass():New()
   oGrafico:nTop        := 20
   oGrafico:nLeft       := 30
   oGrafico:nBottom     := MaxRow() - 3
   oGrafico:nRight      := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle   := cTitulo
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues     := aValues
   oGrafico:Show()
   Inkey(0)

   RETURN NIL


grafico.png

Gráfico XY..

MensagemEnviado: 26 Abr 2020 01:26
por cjp
Este código está dando o seguinte erro:

Ocorreu o erro: Error BASE/1093 Erro nos parâmetros: MAX


Imagino que seja nesta linha:

         ::nMaxValue := Max( ::nMaxValue, ::aValues[ nCont, nCont2 ] )

Gráfico XY..

MensagemEnviado: 26 Abr 2020 13:22
por JoséQuintas
A mensagem é de que o parâmetro não pode ser usado na função max()
Verifique se passou texto ou outra coisa ao invés de número.

Gráfico XY..

MensagemEnviado: 26 Abr 2020 15:29
por cjp
Eu não alterei absolutamente nada do que vc postou.

Veja como está a função inteira:

        SetMode( 40, 100 )
   CLS
   Grafico( ;
      "Cotacoes", ;
      { "SOUM" }, ;
      { "01/01/80", "02/02/,80", "03/03/80", "04/04/80", "05/05/80" }, ;
      { { 5, 6, 7, 8, 9 } } )

FUNCTION Grafico( cTitulo, aBarras, aMeses, aValues )

   LOCAL oGrafico

   oGrafico := BarChartClass():New()
   oGrafico:nTop        := 20
   oGrafico:nLeft       := 30
   oGrafico:nBottom     := MaxRow() - 3
   oGrafico:nRight      := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle   := cTitulo
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues     := aValues
   oGrafico:Show()
   Inkey(0)

   RETURN NIL

#ifndef FlagShip
   #include "hbclass.ch"
#else
   #define INIT :=
   #define VAR  EXPORT
#endif

CLASS BarChartClass

   VAR    cTxtTitle            INIT ""
   VAR    aTxtBarList          INIT {}
   VAR    aTxtSubList          INIT {}
   VAR    aValues              INIT {}
   VAR    nTop                 INIT 0
   VAR    nLeft                INIT 0
   VAR    nBottom              INIT MaxRow()
   VAR    nRight               INIT MaxCol()
   VAR    nMaxValue            INIT 10
   VAR    nIncrement           INIT 0.3
   VAR    nGradeCount          INIT 3
#ifndef FlagShip
   METHOD Show()
   METHOD CalcMaxValue()
   METHOD ShowEmpty()
   METHOD ShowColBar()
   METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna )
   METHOD BarColor( nNumColor )

   ENDCLASS
#endif

METHOD Show() CLASS BarChartClass

   ::CalcMaxValue()
   Scroll( ::nTop, ::nLeft, ::nBottom, ::nRight, 0 )
   ::ShowEmpty()
   ::ShowColBar()

   RETURN NIL

METHOD CalcMaxValue() CLASS BarChartClass

   LOCAL nCont, nCont2

   FOR nCont = 1 TO Len( ::aValues )
      FOR nCont2 = 1 TO Len( ::aValues[ nCont ] )
         ::nMaxValue := Max( ::nMaxValue, ::aValues[ nCont, nCont2 ] )
      NEXT
   NEXT
   DO WHILE .t.
      ::nIncrement *= 10
      IF ::nIncrement * ::nGradeCount > ::nMaxValue
         EXIT
      ENDIF
   ENDDO
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   ::nMaxValue  := ::nIncrement * ::nGradeCount

   RETURN NIL

METHOD ShowEmpty()  CLASS BarChartClass

   LOCAL nCont

   // Título
   @ ::nTop, Int( ( ::nRight - ::nLeft - 1 - Len( ::cTxtTitle ) ) / 2 ) SAY " " + ::cTxtTitle + " " COLOR "N/W"

   // Linhas horizontal/vertical
   @ ::nTop + 2, ::nLeft + 12 TO ::nBottom - 3, ::nLeft + 12
   @ ::nBottom - 3, ::nLeft + 12 TO ::nBottom - 3, ::nRight - 2

   // Valores da barra vertical
   FOR nCont = 1 TO ::nGradeCount
      @ ::nBottom - 3 - ( ( ::nBottom - ::nTop - 6 ) / ::nGradeCount * nCont ), ::nLeft SAY nCont * ::nIncrement PICTURE "9999999999"
      @ Row(), ::nLeft + 13 TO Row(), ::nRight - 3
   NEXT

*   // Legenda
*   @ ::nBottom - 1, ::nLeft SAY ""
*   FOR nCont = 1 TO Len( ::aTxtSubList )
*      @ Row(), Col() + 2 SAY Space(2) COLOR ::BarColor( nCont )
*      @ Row(), Col() + 2 SAY ::aTxtSubList[ nCont ]
*   NEXT

   RETURN NIL

   
METHOD ShowColBar()  CLASS BarChartClass

   LOCAL nCont, nLarguraColuna

   nLarguraColuna := Int( ( ::nRight - ::nLeft - 11 ) / ( Len( ::aValues[ 1 ] ) + 1 ) )

   // cada grupo do gráfico
   FOR nCont = 1 TO Len( ::aTxtBarList )
      ::ShowColSub( nCont, 13 + ( ( nCont - 1 ) * nLarguraColuna ), nLarguraColuna )
   NEXT

   RETURN NIL

METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna ) CLASS BarChartClass

   LOCAL nCont, cColorOld, nRow

   cColorOld := SetColor()

   // barras de comparação
   FOR nCont = 1 TO Len( ::aTxtSubList )
      nRow := ::nBottom - ( ( ::nBottom - ::nTop - 2 ) * ::aValues[ nCont, nNumbar ] / ::nMaxValue )
      SetColor( ::BarColor( nCont ) )
      @ nRow, nColuna + nCont CLEAR TO ::nBottom - 4, nColuna + nCont
   NEXT
   SetColor( cColorOld )
   // legenda de cada coluna do gráfico
   @ ::nBottom - 2, nColuna + 21 SAY Pad( ::aTxtBarList[ nNumBar ], nLarguraColuna - 1 )

   RETURN NIL

METHOD BarColor( nNumColor ) CLASS BarChartClass

   DO CASE
   CASE nNumColor == 1 ; RETURN "9/9"
   CASE nNumColor == 2 ; RETURN "14/14"
   CASE nNumColor == 3 ; RETURN "15/15"
   CASE nNumColor == 4 ; RETURN "11/11"
   CASE nNumColor == 5 ; RETURN "12/12"
   ENDCASE

   RETURN "N/W"   

   

Gráfico XY..

MensagemEnviado: 26 Abr 2020 16:40
por JoséQuintas
Baixei de novo o fonte que postou, e fiz a alteração que mencionei.

PROCEDURE Main

   SetMode( 40, 100 )
   CLS
   Grafico( ;
      "Cotacoes", ;
      { "SOUM" }, ;
      { "01/01/80", "02/02/,80", "03/03/80", "04/04/80", "05/05/80" }, ;
      { { 5, 6, 7, 8, 9 } } )

   RETURN

FUNCTION Grafico( cTitulo, aBarras, aMeses, aValues )

   LOCAL oGrafico

   oGrafico := BarChartClass():New()
   oGrafico:nTop        := 20
   oGrafico:nLeft       := 30
   oGrafico:nBottom     := MaxRow() - 3
   oGrafico:nRight      := MaxCol()
   oGrafico:nGradeCount := 5
   oGrafico:cTxtTitle   := cTitulo
   oGrafico:aTxtSubList := aBarras
   oGrafico:aTxtBarList := aMeses
   oGrafico:aValues     := aValues
   oGrafico:Show()
   Inkey(0)

   RETURN NIL

#ifndef FlagShip
   #include "hbclass.ch"
#else
   #define INIT :=
   #define VAR  EXPORT
#endif

CLASS BarChartClass

   VAR    cTxtTitle            INIT ""
   VAR    aTxtBarList          INIT {}
   VAR    aTxtSubList          INIT {}
   VAR    aValues              INIT {}
   VAR    nTop                 INIT 0
   VAR    nLeft                INIT 0
   VAR    nBottom              INIT MaxRow()
   VAR    nRight               INIT MaxCol()
   VAR    nMaxValue            INIT 10
   VAR    nIncrement           INIT 0.3
   VAR    nGradeCount          INIT 3
#ifndef FlagShip
   METHOD Show()
   METHOD CalcMaxValue()
   METHOD ShowEmpty()
   METHOD ShowColBar()
   METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna )
   METHOD BarColor( nNumColor )

   ENDCLASS
#endif

METHOD Show() CLASS BarChartClass

   ::CalcMaxValue()
   Scroll( ::nTop, ::nLeft, ::nBottom, ::nRight, 0 )
   ::ShowEmpty()
   ::ShowColBar()

   RETURN NIL

METHOD CalcMaxValue() CLASS BarChartClass

   LOCAL nCont, nCont2

   FOR nCont = 1 TO Len( ::aValues )
      FOR nCont2 = 1 TO Len( ::aValues[ nCont ] )
         ::nMaxValue := Max( ::nMaxValue, ::aValues[ nCont, nCont2 ] )
      NEXT
   NEXT
   DO WHILE .t.
      ::nIncrement *= 10
      IF ::nIncrement * ::nGradeCount > ::nMaxValue
         EXIT
      ENDIF
   ENDDO
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   IF ( ::nIncrement * ::nGradeCount / 2 ) > ::nMaxValue
      ::nIncrement := ::nIncrement / 2
   ENDIF
   ::nMaxValue  := ::nIncrement * ::nGradeCount

   RETURN NIL

METHOD ShowEmpty()  CLASS BarChartClass

   LOCAL nCont

   // Título
   @ ::nTop, Int( ( ::nRight - ::nLeft - 1 - Len( ::cTxtTitle ) ) / 2 ) SAY " " + ::cTxtTitle + " " COLOR "N/W"

   // Linhas horizontal/vertical
   @ ::nTop + 2, ::nLeft + 12 TO ::nBottom - 3, ::nLeft + 12
   @ ::nBottom - 3, ::nLeft + 12 TO ::nBottom - 3, ::nRight - 2

   // Valores da barra vertical
   FOR nCont = 1 TO ::nGradeCount
      @ ::nBottom - 3 - ( ( ::nBottom - ::nTop - 6 ) / ::nGradeCount * nCont ), ::nLeft SAY nCont * ::nIncrement PICTURE "9999999999"
      @ Row(), ::nLeft + 13 TO Row(), ::nRight - 3
   NEXT

*   // Legenda
*   @ ::nBottom - 1, ::nLeft SAY ""
*   FOR nCont = 1 TO Len( ::aTxtSubList )
*      @ Row(), Col() + 2 SAY Space(2) COLOR ::BarColor( nCont )
*      @ Row(), Col() + 2 SAY ::aTxtSubList[ nCont ]
*   NEXT

   RETURN NIL

METHOD ShowColBar()  CLASS BarChartClass

   LOCAL nCont, nLarguraColuna

   nLarguraColuna := Int( ( ::nRight - ::nLeft - 11 ) / ( Len( ::aValues[ 1 ] ) + 1 ) )

   // cada grupo do gráfico
   FOR nCont = 1 TO Len( ::aTxtBarList )
      ::ShowColSub( nCont, ::nLeft + 13 + ( ( nCont - 1 ) * nLarguraColuna ), nLarguraColuna )
   NEXT

   RETURN NIL

METHOD ShowColSub( nNumBar, nColuna, nLarguraColuna ) CLASS BarChartClass

   LOCAL nCont, cColorOld, nRow

   cColorOld := SetColor()

   // barras de comparação
   FOR nCont = 1 TO Len( ::aTxtSubList )
      nRow := ::nBottom - ( ( ::nBottom - ::nTop - 2 ) * ::aValues[ nCont, nNumbar ] / ::nMaxValue )
      SetColor( ::BarColor( nCont ) )
      @ nRow, nColuna + nCont CLEAR TO ::nBottom - 4, nColuna + nCont
   NEXT
   SetColor( cColorOld )
   // legenda de cada coluna do gráfico
   @ ::nBottom - 2, nColuna + 21 SAY Pad( ::aTxtBarList[ nNumBar ], nLarguraColuna - 1 )

   RETURN NIL

METHOD BarColor( nNumColor ) CLASS BarChartClass

   DO CASE
   CASE nNumColor == 1 ; RETURN "9/9"
   CASE nNumColor == 2 ; RETURN "14/14"
   CASE nNumColor == 3 ; RETURN "15/15"
   CASE nNumColor == 4 ; RETURN "11/11"
   CASE nNumColor == 5 ; RETURN "12/12"
   ENDCASE

   RETURN "N/W"

FUNCTION AppUserName(); RETURN ""
FUNCTION AppVersaoExe(); RETURN ""


Exatamente esse fonte compilado

grafico.png

Gráfico XY..

MensagemEnviado: 27 Abr 2020 08:40
por lugab
Bom dia....

Inácio, o erro ta nesse parâmetro: "02/02/,80"

Essa vírgula ta aí de gaiata

Gráfico XY..

MensagemEnviado: 27 Abr 2020 12:38
por JoséQuintas
lugab escreveu:Inácio, o erro ta nesse parâmetro: "02/02/,80"
Essa vírgula ta aí de gaiata


Esse é um texto comum, usado como legenda.
Pode ver na imagem que saiu exatamente desse jeito.

Gráfico XY..

MensagemEnviado: 27 Abr 2020 23:34
por cjp
Este último código que vc postou funcionou.

Mas eu ainda preciso fazer ajustes para o gráfico ficar ainda menor, mais no canto inferior direito da tela.

Daí, cada mudança que eu faço, bagunça tudo na tela, e eu não sei acertar.

Por favor, me ajude: coloque o gráfico entre as seguintes coordenadas: maxrow()-10,maxcol()-30,maxrow(),maxcol().

Estou usando setmode(41,165) nesta máquina, mas em outras preciso usar diferente. Por isso preciso usar maxrow() e maxcol() como referências, sem valores fixos.

Gráfico XY..

MensagemEnviado: 29 Abr 2020 14:04
por JoséQuintas
Na prática abro uma janela com o gráfico, e nunca reparei dele não ajustar automático pra área definida.
Vou ter que fazer testes.

Mas de cara, se ele reservar o tamanho pro texto, e o texto for muito grande, não vai caber, aí entra cortar o texto da leganda também.

Gráfico XY..

MensagemEnviado: 29 Abr 2020 15:50
por cjp
Sim, a legenda é desnecessária. Se puder me fazer o favor de colocar nas medidas que te pedi, agradeceria muito.