Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Series con distinta escala con TChart (https://www.clubdelphi.com/foros/showthread.php?t=90151)

sowei 18-04-2016 19:53:21

Series con distinta escala con TChart
 
Hola a todos
No sé si me sabré explicar bien, per lo voy a intentar:

Lo que quiero es mostrar en un TChart dos o más series y que cada una de estas tenga una escala (eje Y) diferente a las demás. La cuestión es que no sé si se puede hacer.

Para poner un ejemplo, la serie 1 muestra los importes de ventas de los diferentes meses. Esto me crea 12 barras con diferentes alturas según el importe de cada mes. Vamos a suponer que el importe mínimo es ZERO y el máximo es 10000 (diez mil). Las barras tendrán la altura conforme a los importes que rondarán entre 0 y 10000.

La serie 2, que también son barras, muestra la cantidad de ventas realizadas en cada mes, por ejemplo cantidad de facturas. Vamos a suponer que se hacen entre 0 y 100 facturas por mes.

Con esto tenemos que en el eje X mostraremos los meses, enero, febrero, marzo, ...

Pero en el eje Y tenemos DOS ESCALAS DIFERENTES. La que va de 0 a 10.000 y la que va de 0 100

(Los valores del eje Y los escondo, no es necesario que se vean. Ya me vale con mostrar sólo la etiqueta encima de cada barra con su valor)

En este ejemplo pretendo mostrar dos barras en cada mes. La de la izquierda hace referencia a la serie 1 (ventas) y la de la derecha a la serie 2 (cantidad facturas).
Por ejemplo en enero se han hecho 5.000 € de venta y 60 facturas.

El problema que me encuentro es que la serie 2 utiliza la escala de la serie 1 y muestra unas barras muy pequeñas, al utilizar el rango 0 - 10.000 en lugar de 0 - 100.

Lo que quiero poder hacer es que cada serie utilice su escala (su mínimo y su máximo), como si fueran dos gráficas diferentes pero en un mismo escenario.


Estooooo ... me he explicado bien ? :p


Me haríais muuuuy feliz si me ayudáis a resolverlo.
Y como no, tanto si lo sabéis como si no, muchísimas gracias

Saludos

Casimiro Notevi 18-04-2016 20:01:02

Puedes multiplicar por 100 la segunda escala, así tendrías también de cero a 10000.

kapcomx 18-04-2016 21:06:47

acabo de hacer algo asi, lo que hago es definir por codigo el valores de los axis.left y axis.right.
a grandez rasgos tengo en una tabla llamada anualdonde tengo tres columnas productos activados, pagados y comision. adicionalmente el campo fk_cliente, anho, tipo_prod y otros...

dentro del formulario escogo el cliente, el tipo de producto y el año con eso hago una consulta. esa consulta la ingreso en un data set
"dm.dsanual", uso este data set para ligarlo al dbchart.

a grandez rasgos hago esto

1. hago la consulta en base al cliente y los otros datos (dm.dsanual) los ordeno de menor a mayor
2. defino primero los valores del axis de la izquierda:
Código Delphi [-]


//aca defino el maximo
dm.mydataset.last;
dbchart1.axes.left.maximuim := ((dm.dsanualactivos.asinteger) * 1.30 ); //el 1.30 es para tener un margen y la grafica no se desborde
maximoleft := dm.dsanualactivos.asinteger;

//aca defino el mimino
dm.mydataset.first;
dbchart1.axes.left.minimum := 0; 
minimoleft := 0;


convesion:=0; //esta variable la ocupo para hacer la conversion de los valores de la derecha 

dm.mydataset.first;

mayor := dm.mydatasetcomision.value;

while not (dm.mydataset.oef) do 
begin 

if (dm.mydatasetcomision.value > valor) then 
  begin 
     mayor := dm.dsanualcomision.value;
     conversion:= mayor / dm.dsanualactivos.value;   //esto lo hago para dividir la mayor cantidad pagada entre el numero de equipos activados.
   end;


dm.dsanual.next;
end;

//hago una especie de factor de escala

conversion := conversion * 0.8;

factor := round (conversion);


if factor:= 0 then 
factor:= 1;

//aca defino las rotulos de la derecha

dbchart1.axes.right.maximum := ((maximo_left * factor) * 1.30);
dbchart1.axes.right.minimum := (1 * factor);
dbchart1.axes.right.visible:= true;


//aca hago un update de la tabla dondce cambio el campo factor 

dm.cambia(dm.ds1, 'update anual set factor = (comision /'+floattostr(factor) + ')'); //cambia es un procedimiento donde atrapo el data set y ejecuto la consulta enviada....

// refresco la consulta de la tabla anual 
dm.filtra(dm.dsanual, dm.con_anual + ' fk_cliente= ' + inttostr(dblckclientes.keyvalue)); //filtra es un procedimiento que uso para hacer consultas

//una vez actualizado mando llamar el grafico
dbchart1.visible:= true;



con ese codigo puedo generar el grafico con dos factores diferentes la izquierda el numero de productos comprados, activados y a la derecha el total en $$$ de sus comisiones generadas.

Espero te pueda servir mi ejemplo..


Saludos...

sowei 19-04-2016 16:53:10

Gracias por las respuestas.

Provaré


La franja horaria es GMT +2. Ahora son las 09:47:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi