chartcartesian — u_pbt_chartcartesian #
← Referencia de componentes · Índice de la guía
Gráfico cartesiano: columnas, barras, líneas, áreas y nubes de puntos, sobre un eje de categorías y uno o dos ejes de valores. El tipo se fija por serie.
▶ Verlo en vivo — Aplicación de demostración, mosaico Cartesian chart : la vista previa, el código que lo produce y esta página, lado a lado.
En resumen #
| Userobject | u_pbt_chartcartesian |
| Clase de elementos | n_pbt_chartcartesian_series (of_item(key)) · n_pbt_chartcartesian_axis (of_axis(axis)) |
| Sirve para | Comparar valores a lo largo de un eje — meses, productos, regiones |
| Principio | Usted pone las categorías y luego las series; las escalas, la rejilla y la animación son cosa nuestra |
Inicio rápido #
// Local variables
string ls_months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun"}
double ld_sales[] = {420, 510, 480, 620, 700, 660}
// The categories FIRST : they fix how many values a series carries
uo_chart.of_set_categories(/*labels*/ ls_months)
uo_chart.of_add_series(/*key*/ "sales", /*label*/ "Revenue", /*type*/ u_pbt_chartcartesian.TYPE_BAR, /*values*/ ld_sales)
El tipo pertenece a la SERIE, no al componente #
Es la decisión de la que se sigue todo lo demás. Un componente por tipo — uno para barras, otro para líneas — nunca puede producir un combinado: barras con una línea de objetivo encima, sobre un segundo eje. Y esa es la forma más pedida en un cuadro de mando.
Aquí hay un solo componente, y cada serie lleva su is_type (TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER, TYPE_STEPLINE). Cambiar el tipo de una serie no toca las demás.
ib_secondary coloca una serie en el segundo eje de valores. Es lo que permite que un número de pedidos y una facturación convivan: sin él, uno de los dos es una línea plana al ras del eje.
of_set_categoriesva antes que las series: su número fija cuántos valores debe llevar cada serie.
// Local variables
double ld_target[] = {400, 500, 550, 600, 680, 720}
// Bars and a line in the SAME chart : the type belongs to the series
uo_chart.of_add_series(/*key*/ "target", /*label*/ "Target", /*type*/ u_pbt_chartcartesian.TYPE_LINE, /*values*/ ld_target)
// And its own scale, when the two do not share a unit
uo_chart.of_item(/*key*/ "target").ib_secondary = true
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_title | string | "" | Título del gráfico, mostrado encima |
ib_show_legend | boolean | true | Muestra la leyenda. Hacer clic en una entrada oculta su serie — la forma más barata de comparar dos series de cinco |
is_legend_location | string | bottom | Dónde va la leyenda (constantes LEGEND_*): encima o debajo del trazado, o al lado — START/END la colocan en columna a un lado, y el trazado le cede el sitio. START/END son lógicas: siguen el sentido de lectura. Una posición desconocida vale abajo, y se relee así |
ib_show_grid | boolean | true | Las líneas de fondo, en cada valor redondo. Sin ellas solo la forma sigue siendo legible, nunca un valor |
ib_value_tooltip | boolean | true | El panel de valores: cuando el ratón pasa sobre una categoría, todas las series y su valor ahí, de una vez, y una retícula marca la columna. No es is_tooltip (heredado), que es el tooltip del componente entero — éste sigue al puntero y dice de qué está hecho el gráfico. Cada serie escribe su línea con su propio is_label_format; un valor ausente no tiene línea. La información de una serie (su is_tooltip) se escribe en este panel, bajo la línea de la serie señalada, incluso en false |
is_orientation | string | vertical | Columnas o barras (constantes ORIENTATION_*). Gira todo el sistema de referencia, líneas y áreas incluidas |
ib_stacked | boolean | false | Apila las series de barras en vez de ponerlas una al lado de otra; las series de áreas se apilan entre sí — nunca barras con áreas. Una línea nunca se apila: dice un nivel. Las barras del segundo eje forman su propia pila, junto a la del eje principal |
is_stack_mode | string | value | Suma o parte (constantes STACK_*). En percentage cada pila se lleva a 100: el eje lee entonces partes, no totales — hasta -100 cuando hay partes negativas. No significa nada fuera del apilado |
ib_enabled | boolean | true | Atenuado: el componente sigue mostrando lo que muestra — un gráfico sin datos no es lo mismo que un gráfico que la aplicación ha apagado — pero deja de responder: ni clic, ni tecla, ni entrada de leyenda, y sale del orden de tabulación. true por defecto |
ib_animated | boolean | true | El gráfico llega animado: las formas suben desde el eje — todo el gráfico cuando pasa de vacío a dibujado y cuando se añade una serie. Los nuevos valores se deslizan a su sitio, y una forma que un gráfico en directo añade (of_append_values) sube sola: un cuadro de mando que se refresca puede conservar la animación. Un puesto configurado para reducir el movimiento no anima, salvo que la aplicación insista (PBT_SetAnimationPolicy, sección 4.8) |
ii_anim_duration | integer | 450 | Duración de esa llegada, en milisegundos (0 a 5000) |
is_anim_easing | string | ease-out | Curva de la aparición (constantes EASING_*): linear, ease-out, back-out que se pasa y vuelve, bounce-out que rebota, elastic-out que chasquea. Es la que da su carácter a la animación |
ii_anim_delay | integer | 0 | Desfase entre dos series a la llegada, en milisegundos (0 a 1000). Entran entonces una tras otra en vez de surgir juntas, lo que da al gráfico su sentido de lectura. 0 = todas a la vez |
is_format | string | "" | El formato de todos los números que escribe el gráfico — ejes de valores, etiquetas y panel de valores — en la sintaxis de un formato de DataWindow: #,##0.00, $#,##0, #,##0 "unidades", secciones positivo;negativo;cero. Los separadores son los del idioma de visualización. Un eje puede llevar el suyo (of_axis(AXIS_VALUE2).is_format), que prevalece sobre este. Vacío (o un formato que no es numérico) = el número tal cual, a la milésima |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento del tema) |
is_tooltip | string | "" | Información sobre herramientas simple al pasar por encima del componente |
is_super_tooltip_title | string | "" | Título de la información enriquecida (tiene prioridad sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto de la información enriquecida (se acepta marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen de la información enriquecida |
Métodos #
| Método | Función | |
|---|---|---|
of_set_categories ( string as_labels[] ) | Las etiquetas del eje de categorías — texto: una etiqueta de marcado que contengan se quita, y el eje, el panel y #x# dicen lo mismo. Llámelo antes que las series. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_set_value_labels ( string as_labels[] ) | Etiquetas en el eje de valores. Vacío — el caso normal — ese eje lleva números. Relleno, lleva bandas como el eje de categorías: el marco de dos categorías en el que se dibuja un mapa de calor. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_get_value_labels ( ref string as_labels[] ) | Rellena as_labels[] con lo que el eje de valores lleva ahora y devuelve el número. Cero = lleva números; una etiqueta que contiene ` | ` se relee entera |
of_get_categories ( ref string as_labels[] ) | Rellena as_labels[] con las categorías que el gráfico lleva ahora — después de que of_append_categories quitara las más antiguas, después de que of_from_datastore las leyera — y devuelve su número | |
of_get_last_error ( ) | Por qué se rechazó la última llamada (un rol de of_map que las filas no tienen, un límite NULL, una posición fuera de una serie…), o cuántas filas descartó el último of_from_datastore y por qué; si no, el último error de la DLL, como para todo componente | |
of_add_heat_series ( string as_key, string as_label, long al_x[], long al_y[], double ad_weight[] ) | Un mapa de calor: una celda por par (categoría, etiqueta de valor), coloreada por su peso. al_x es el rango de la categoría y al_y el de la etiqueta, ambos desde 1 — los rangos de un arreglo PowerScript, que un doble bucle escribe sin cálculo. Ponga antes las dos listas. Un peso NULL es una celda vacía: allí no se dibuja, etiqueta ni pulsa nada. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene / o ` | , o ya está tomada, -2` si el componente no está creado |
of_add_ohlc_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Una serie OHLC: el rango de mínimo a máximo, una marca a la izquierda para la apertura y otra a la derecha para el cierre. Cuatro números por punto, y el eje se lee sobre el máximo y el mínimo — los otros dos están dentro por construcción. Los cuatro arreglos se truncan al más corto. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene / o ` | , o ya está tomada, -2` si el componente no está creado |
of_add_candle_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Los mismos cuatro números, dibujados como velas: una mecha de mínimo a máximo y un cuerpo relleno entre apertura y cierre. Un doji — apertura igual al cierre — conserva un píxel de cuerpo, para seguir siendo una línea que el ojo encuentra. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene / o ` | , o ya está tomada, -2` si el componente no está creado |
of_set_series_ohlc ( string as_key, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Nuevas cotizaciones para una serie financiera ya trazada. Lo que of_set_series_values es a una serie de valores. Devuelve 0 una vez aplicado, -5 si ninguna serie lleva esta clave o si no es financiera, -2 si el componente no está creado | |
of_get_series_ohlc ( string as_key, ref double ad_open[], ref double ad_high[], ref double ad_low[], ref double ad_close[] ) | Rellena los cuatro arreglos con lo que la serie lleva ahora y devuelve el número de puntos. Una serie no financiera devuelve 0 | |
of_add_series ( string as_key, string as_label, string as_type, double ad_values[] { , long al_color } ) | Añade una serie con su tipo — TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER o TYPE_STEPLINE; la sobrecarga toma también su color (RGB()), si no la paleta elige. Un valor NULL (SetNull) es un hueco: ahí no se dibuja, ni se etiqueta ni se hace clic en nada, y una línea se corta. Una clave ya tomada se rechaza, nunca se reemplaza: of_set_series_values y el handle of_item cambian una serie que existe. Devuelve 0 una vez añadida, -5 si el tipo no es uno de esos cinco (un mapa de calor y las series financieras tienen su método), o si la clave está vacía, contiene / o ` | , o ya está tomada, -2` si el componente no está creado |
of_set_series_values ( string as_key, double ad_values[] ) | Nuevos valores para una serie ya trazada, lo demás intacto. Es la llamada de un panel vivo: la serie conserva su identidad, así que las formas se deslizan en vez de saltar. Un valor NULL es un hueco. Devuelve 0 una vez aplicado, -5 si ninguna serie lleva esta clave o si lleva puntos o cotizaciones (of_set_series_points, of_set_series_ohlc los reemplazan), -2 si el componente no está creado | |
of_set_point_color ( string as_key, long al_position, long al_color ) | El color de un punto — el mes que superó su límite, en rojo. al_position cuenta desde 1; -1 (o NULL) devuelve al punto el color de su serie. Barras, marcadores de línea y puntos de nube lo toman, y se desliza con su punto en un gráfico en directo. Devuelve 0 una vez aplicado, -5 si ninguna serie lleva esta clave, si la posición está fuera de la serie, o para un mapa de calor o una serie financiera (sus colores son su escala y su sentido), -2 si el componente no está creado | |
of_get_point_color ( string as_key, long al_position ) | Devuelve el color (un long RGB()) que of_set_point_color — o una columna ROLE_COLOR — dio al punto al_position, contado desde 1, o -1 cuando no tiene (toma el color de su serie), y para una clave o una posición desconocida | |
of_append_values ( string as_key, double ad_values[], long al_max_points ) | Un gráfico en directo: añade nuevos valores al final de una serie y quita los más antiguos en cuanto lleva más de al_max_points (0 = sin límite). Solo viajan los valores nuevos — la serie no se reenvía en cada tic. Combínelo con of_append_categories. Las nuevas formas suben solas, las demás se deslizan. Añada cada serie, con el mismo máximo que of_append_categories: una serie olvidada se desfasa de sus categorías. Devuelve 0 una vez aplicado, -5 si ninguna serie lleva esta clave o si lleva puntos o cotizaciones, -2 si el componente no está creado | |
of_append_categories ( string as_labels[], long al_max_count ) | Nuevas categorías al final del eje, las más antiguas quitadas más allá de al_max_count (0 = sin límite): las etiquetas de un gráfico en directo se deslizan con sus valores. Añada cada serie con of_append_values y el mismo máximo. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_add_point_series ( string as_key, string as_label, double ad_x[], double ad_y[] { , double ad_weight[] } ) | Una serie situada por valor en los dos ejes: x dice dónde a lo largo del eje de categorías, y a qué altura. Ese eje deja entonces de ser un eje de categorías — pasa a ser un segundo eje de valores, con sus propias graduaciones. Una sobrecarga toma un peso por punto, que dimensiona la burbuja. Un peso NULL conserva el tamaño predeterminado, fuera de la escala de las demás. No mezcle estas series con series de valores en un gráfico de categorías: las etiquetas de las categorías dejan paso a las graduaciones. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene / o ` | , o ya está tomada, -2` si el componente no está creado |
of_set_series_points ( string as_key, double ad_x[], double ad_y[], double ad_weight[] ) | Nuevos puntos para una serie que ya lleva algunos. Lo que of_set_series_values es a una serie de valores. Devuelve 0 una vez aplicado, -5 si ninguna serie lleva esta clave o si lleva valores o cotizaciones, -2 si el componente no está creado | |
of_get_series_points ( string as_key, ref double ad_x[], ref double ad_y[], ref double ad_weight[] ) | Rellena los tres arreglos con lo que la serie lleva ahora y devuelve el número de puntos. Una serie de valores no devuelve nada en ad_x: no tiene abscisa propia | |
of_get_series_values ( string as_key, ref double ad_values[] ) | Rellena ad_values[] con lo que la serie lleva ahora y devuelve el número. Lectura viva : pregunta al gráfico, no al último envío | |
of_remove_series ( string as_key ) | Quita una serie; las demás conservan su color — tomado al añadirlas — y su visibilidad; su tooltip y sus colores de elemento se van con ella. Su handle (of_item) se destruye con ella: un of_item posterior sobre la misma clave crea uno nuevo. Devuelve 0 una vez quitada, -5 si ninguna serie lleva esta clave, -2 si el componente no está creado | |
of_clear ( ) | Vacía el gráfico — series y categorías; los handles de serie se van con ellas. Los ejes conservan sus ajustes y sus secciones. Devuelve 0 una vez vaciado, -2 si el componente no está creado | |
of_from_datastore ( datastore ads ) | Alimenta el gráfico desde un DataStore (un DataWindow, un DataWindowChild: sobrecargas), como el gráfico de un DataWindow: una columna de categorías, una columna de valores y, si la hay, una columna de series — una serie por cada valor encontrado, una serie con el nombre de la columna de valores sin ella. Las filas que comparten una categoría y una serie se suman; las categorías llegan en el orden de las filas (ordene el DataStore); una categoría sin fila es un hueco. Una columna de color colorea su punto. Una columna desempeña un papel cuando lleva su nombre (category, series, value, color) o cuando of_map lo dice; números y fechas del puesto se leen bien. Dado de nuevo, el gráfico cambia en su sitio: una serie conserva su tipo, su color y su eje, una serie añadida a mano nunca se toca; una nueva serie es una barra. Devuelve 0 una vez cargado (las filas cuya serie no puede ser una clave se saltan: of_get_last_error dice cuántas), -5 si el DataStore no es válido o ninguna columna desempeña ROLE_CATEGORY o ROLE_VALUE (of_get_last_error dice cuál), -2 si el componente no está creado | |
of_map ( string as_role, string as_column ) | Da un papel a una columna del DataStore (ROLE_CATEGORY, ROLE_SERIES, ROLE_VALUE, ROLE_COLOR) cuando su nombre no lo dice. Antes de of_from_datastore, o después: las filas se vuelven a leer. Una columna vacía devuelve el papel a la columna que lleva su nombre. Devuelve 0 una vez puesto, -5 si el papel no es una constante ROLE_ o la columna no es una del último DataStore, -2 si el componente no está creado | |
of_reload ( ) | Vuelve a leer las filas del DataStore (o del DataWindow) dado a of_from_datastore — tras un Retrieve, una edición, un filtro — y cambia el gráfico en su sitio: las formas se deslizan hacia sus nuevos valores. Devuelve 0 una vez leído, -5 si no se dio ningún DataStore o ya no es válido, -2 si el componente no está creado | |
of_item ( string as_key ) | Devuelve el asa de una serie, para modificarla después | |
of_axis ( string as_axis ) | Devuelve el asa de un eje (AXIS_CATEGORY, AXIS_VALUE, AXIS_VALUE2), para ajustarlo después. Cualquier otro papel no devuelve ninguna asa (IsValid() es falso) | |
of_add_axis_section ( string as_axis, string as_key, double ad_from, double ad_to, long al_color ) | Una banda a través del trazado, detrás de los datos: « por debajo de 200 es malo ». Dibujada bajo las formas, nunca compite con ellas. En el eje de categorías, ad_from y ad_to son posiciones contadas a partir de 1 (de 2 a 3 cubre la segunda y la tercera categoría). Un color -1 (o NULL) es una veladura pálida del acento del tema. Devuelve 0 una vez añadida, -5 si el eje no es uno de los AXIS_*, si un límite es NULL o si la clave está vacía, contiene / o ` | , o ya está tomada en ese eje, -2` si el componente no está creado |
of_add_axis_threshold ( string as_axis, string as_key, double ad_at, long al_color, integer ai_thickness ) | Una línea a través del trazado en un valor — un objetivo, un límite. El mismo registro que las bandas, pero dibujada para verse. Un color -1 (o NULL) la dibuja en el acento del tema. Devuelve 0 una vez añadida, -5 si el eje no es uno de los AXIS_*, si un límite es NULL o si la clave está vacía, contiene / o ` | , o ya está tomada en ese eje, -2` si el componente no está creado |
of_clear_axis_sections ( string as_axis ) | Retira todas las bandas y todos los umbrales de un eje. Devuelve 0 una vez vaciado, -5 si el eje no es uno de los AXIS_*, -2 si el componente no está creado | |
of_remove_axis_section ( string as_axis, string as_key ) | Quita una banda o un umbral de un eje: los demás se quedan. Devuelve 0 una vez quitado, -5 si el eje no es uno de los AXIS_* o no lleva ninguna sección con esta clave, -2 si el componente no está creado | |
of_reset ( ) | Vacía el gráfico — handles de serie y de eje incluidos — y devuelve todas las propiedades a su valor de origen. Devuelve 0 una vez hecho, -2 si el componente no está creado |
Sin clave (modo demo), el gráfico solo dibuja sus 3 primeras series, leyenda incluida. Las demás se quedan en el modelo —
of_count,of_get_series_valuesy sus handles las ven — y la clave puesta las muestra sin que tenga que volver a enviar nada.
Eventos #
| Evento | Se dispara cuando |
|---|---|
ue_point_clicked (string as_key, long al_index, double ad_value) | Se ha hecho clic en una barra, un punto, una celda o una cotización — o se ha confirmado con Intro: la clave de la serie, la posición del punto en la serie, a partir de 1, y su valor — el del punto sea cual sea la forma de la serie: la y de una nube, el peso de una celda de calor, el cierre de una cotización. Con el teclado, Izquierda/Derecha recorren las categorías y Arriba/Abajo eligen la serie que el panel subraya; una serie de puntos o un mapa de calor elegido se recorre punto por punto. Un hueco no tiene nada que pulsar; el punto en el que está el teclado se rodea, y se anuncia al lector de pantalla |
ue_point_rclicked (string as_key, long al_index, double ad_value, long al_x, long al_y) | Un clic derecho en una barra, un punto, una celda o una cotización — o la tecla Menú (Mayús+F10) en el punto en el que está el teclado: la clave de la serie, la posición desde 1 y el valor, como los da ue_point_clicked. Ahí se abre su menú; al_x, al_y: dónde abrir el menú, en píxeles de pantalla — el puntero, o con el teclado (tecla Menú, Mayús+F10) el centro de la forma del punto; un contextmenu se abre allí tal cual (uo_menu.of_show(al_x, al_y)) |
ue_rclicked ( ) | Un clic derecho en el gráfico donde no se dibuja ningún punto — los ejes, el trazado vacío, la leyenda. Un clic derecho en un punto lanza ue_point_rclicked en su lugar, nunca los dos |
ue_series_toggled (string as_key, boolean ab_visible) | El usuario ha ocultado o vuelto a mostrar una serie con un clic en la leyenda. Lo que el gráfico muestra ya no es entonces lo que la aplicación envió. Poner ib_visible es un valor, como marcar una casilla: este evento informa del gesto del usuario |
La animación es una entrada, no un cálculo: la geometría final se escribe de inmediato y solo se reproduce la llegada. Un gráfico nunca mostrado — nacido fuera de pantalla, en una pestaña que nadie abre — enseña por tanto las barras correctas, en silencio.
Propiedades de elemento #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_label | string | "" | El nombre de la serie, tal como lo muestra la leyenda |
is_type | string | bar | bar · line · area · scatter · stepline (constantes TYPE_*). Cambia el dibujo de esta serie sola — es lo que hace un gráfico combinado. Solo se acepta un tipo de la misma familia: una serie de valores entre bar, line, area, scatter y stepline, una serie financiera entre ohlc y candle; cualquier otro se ignora e is_type relee el tipo conservado |
il_color | long | -1 | Color de la serie (RGB()). -1 mientras no se pone ninguno: la paleta elige, al añadirla, y la serie lo conserva: quitar otra serie nunca la vuelve a colorear. Un punto puede tomar el suyo (of_set_point_color). Los colores de elemento heredados (il_accent, il_back_color, il_text_color y sus variantes al pasar el ratón) no tienen efecto sobre una serie: decide il_color |
ib_visible | boolean | true | false oculta una serie sin quitarla — la leyenda guarda el camino de vuelta. Como una casilla de verificación, es un valor que se pone: ue_series_toggled informa del clic del usuario en la leyenda |
ib_secondary | boolean | false | Traza la serie en el segundo eje. Así conviven un número y un importe en el mismo gráfico |
ib_data_labels | boolean | false | Escribe el valor de cada punto a su lado. Apagado por defecto: con cincuenta puntos, las etiquetas tapan el dibujo que explican |
is_label_format | string | "" | Lo que dice cada etiqueta y cada línea del panel: #y# el valor, #x# la categoría (la x de una serie de puntos, la columna de una celda de calor), #v# la fila de una celda de calor, #label# el nombre de la serie, #open# #high# #low# #close# las cotizaciones; el resto se escribe tal cual — "$#y#K". Vacío = el valor solo. Una etiqueta escrita dentro de una barra apilada toma el negro o el blanco que su barra soporta |
id_smoothness | double | 1 | Solo líneas y áreas: cuán redondeada se dibuja la línea, 0 = segmentos rectos, 1 = plenamente curva, como la dibuja LiveCharts. Una línea escalonada lo ignora — dice que el nivel se MANTUVO hasta la categoría siguiente, una curva diría que derivó. Una curva puede pasar más allá de sus puntos; se recorta al marco del trazado y nunca pinta sobre las etiquetas de los ejes |
ib_fill | boolean | true | Líneas y áreas: el lavado bajo el trazo, hasta el eje, en el tono de la serie. Es la retirada la que es el acto deliberado — para una línea puesta sobre otra cosa (columnas, bandas de eje coloreadas) que el lavado ocultaría |
il_fill_color | long | -1 | El color de ese lavado. -1 = el de la línea misma |
is_marker | string | "circle" | Líneas, escalones y nubes de puntos: la FORMA del marcador en cada punto (constantes MARKER_*: none, circle, square, triangle, diamond). No es decoración — dos líneas que se cruzan, impresas en gris, se distinguen por su marcador y por nada más |
ii_thickness | integer | 2 | Líneas y áreas: el grosor del trazo, en píxeles |
il_point_count | long | 0 | Cuántos puntos lleva esta serie — valores, pares (x, y) o cotizaciones (sólo lectura). Un long: una serie en directo puede guardar más de 32 767 |
il_cold_color | long | -1 | Solo mapas de calor: el extremo FRÍO de la escala, la lectura más ligera. -1 = la escala propia del componente, un solo azul, del muy pálido al intenso |
il_mid_color | long | -1 | El punto MEDIO. Tres puntos y no dos: interpolar de un extremo a otro desvaída el centro de la escala, donde se sitúan la mayoría de las lecturas. -1 = el azul medio del componente |
il_hot_color | long | -1 | El extremo CALIENTE, la lectura más pesada. Es el que muestra la leyenda. -1 = el azul intenso del componente |
il_up_color | long | -1 | Solo series financieras: el color de un punto que cierra por encima de su apertura. -1 = el verde del componente |
il_down_color | long | -1 | Y el de un punto que cierra por debajo. Dos colores porque el sentido es lo que se lee en un gráfico así — uno solo lo ocultaría. -1 = el rojo del componente |
is_tooltip | string | "" | Su información, escrita en el panel de valores, justo bajo la línea de la serie — solo cuando es la serie señalada (su barra, su punto o su línea bajo el ratón, o la serie elegida con el teclado por Arriba / Abajo), nunca para las otras series de la columna, nunca como segunda burbuja. Una columna recorrida donde no hay ninguna forma dibujada no señala ninguna serie. Con ib_value_tooltip en false, el panel se abre igualmente para ella, sin las cifras. Una serie de puntos o un mapa de calor la muestra en el panel que el teclado abre sobre su punto. Se admite marcado |
is_super_tooltip_title | string | "" | El título en negrita de su información, escrito en el panel bajo su línea |
is_super_tooltip_text | string | "" | El texto de su información, en el panel. Se admite marcado |
is_super_tooltip_image | string | "" | Una imagen en la cabecera de su información, en el panel (ruta del bundle, ruta absoluta o resources.dll:nombre) |
Propiedades de eje #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_title | string | "" | Título escrito a lo largo del eje. Vacío = sin título, y sin sitio reservado para uno. La información y los colores de elemento que hereda un manejador de eje (is_tooltip, is_super_tooltip_*, il_accent, il_back_color, il_text_color…) no tienen efecto sobre un eje |
id_min | double | NULL | Límite inferior impuesto. Gana a los datos y no se redondea: quien escribe 0 quiere 0. NULL (SetNull) no impone nada: el eje vuelve a seguir sus datos, y un límite libre se relee NULL (IsNull), nunca 0. Libre, un eje de valores solo incluye el cero si una barra o un área se apoya en él: cotizaciones y líneas se leen en su propio rango |
id_max | double | NULL | Límite superior impuesto, misma regla. Lo que lo supera se corta en el borde del trazado |
id_step | double | 0 | Distancia entre dos líneas de rejilla, en valores. 0 = un paso redondo leído del rango |
ii_label_rotation | integer | 0 | Rotación de las etiquetas de este eje, en grados (-90 a 90) — nombres de categoría o graduaciones de valores. Doce nombres de meses solo caben bajo un gráfico inclinados; cuando aún no caben, el gráfico escribe uno de cada N, siempre el primero y el último |
ib_separator | boolean | true | Sus líneas de rejilla. Un eje de categorías rara vez las necesita, uno de valores casi siempre |
ii_section_count | integer | 0 | Cuántas bandas y umbrales lleva este eje (sólo lectura) |
ib_logarithmic | boolean | false | Solo ejes de valores: una escala logarítmica, graduada por décadas (1, 10, 100…), cada década de la misma altura — para cifras que abarcan varios órdenes de magnitud. El cero y los valores negativos no tienen sitio en ella y no se dibujan |
is_format | string | "" | El formato de este eje — sus graduaciones, y las etiquetas y el panel de las series trazadas sobre él — por encima del is_format del gráfico: un importe de un lado, un número de pedidos del otro. Misma sintaxis (#,##0, 0.0 "u"…). Vacío = el formato del gráfico |
Ejemplos #
Ajustar la animación según la pantalla #
// A dashboard that refreshes every few seconds : no arrival animation
uo_chart.ib_animated = false
// Elsewhere, a slower arrival that is actually seen
uo_chart.ii_anim_duration = 1200
Abrir las filas detrás de un punto #
// Event ue_point_clicked of uo_chart : the series key, the position of the
// point (from 1) and its value - enough to open the rows behind it
// Local variables
string ls_month
// On a series of values, the position IS the rank of the category
ls_month = is_months[al_index]
wf_open_orders(/*series*/ as_key, /*month*/ ls_month, /*amount*/ ad_value)
Un cuadro de mando vivo #
// Timer event of the window : new values for the same series, so the bars
// SLIDE to their new height instead of replaying their arrival
// Local variables
double ld_sales[]
// Read the figures, then hand them to the series already on the chart
ld_sales = wf_read_sales()
uo_chart.of_set_series_values(/*key*/ "sales", /*values*/ ld_sales)
Un gráfico en directo que se desliza #
// Timer event of the window, every second : ONE new reading. Only that value
// travels ; past sixty, the oldest leaves on both the axis and the series
// Local variables
string ls_time[]
double ld_cpu[]
// The time of the reading on the axis, the reading itself in the series
ls_time[1] = String(Now(), "hh:mm:ss")
ld_cpu[1] = wf_read_cpu()
uo_chart.of_append_categories(/*labels*/ ls_time, /*max_count*/ 60)
uo_chart.of_append_values(/*key*/ "cpu", /*values*/ ld_cpu, /*max_points*/ 60)
Una medida que falta, y el gráfico como imagen #
// March was not measured : a NULL value is a gap, the line is cut there
// Local variables
double ld_temp[] = {18.5, 19.2, 0, 21.4}
// The third reading is missing : NULL, not zero
SetNull(ld_temp[3])
uo_chart.of_add_series(/*key*/ "temp", /*label*/ "Temperature", /*type*/ u_pbt_chartcartesian.TYPE_LINE, /*values*/ ld_temp)
// The chart as it is on screen, title and legend included, to a PNG file
uo_chart.of_save_as_png(/*path*/ "C:\Reports\temperature.png")
Una banda y un objetivo en el eje de valores #
// A pale red band below 200 and a target line at 600, behind the bars
uo_chart.of_add_axis_section(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE, /*key*/ "low", /*from*/ 0, /*to*/ 200, /*color*/ RGB(/*red*/ 255, /*green*/ 220, /*blue*/ 220))
uo_chart.of_add_axis_threshold(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE, /*key*/ "target", /*at*/ 600, /*color*/ RGB(/*red*/ 200, /*green*/ 70, /*blue*/ 70), /*thickness*/ 2)
// The value axis says what it measures
uo_chart.of_axis(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE).is_title = "Sales ($K)"
Un gráfico alimentado por un DataStore #
// The month on the category axis, one series per product category, the amounts
// of the rows summed by the chart - what the graph of a DataWindow does
// Local variables
datastore lds_sales
// Your DataStore and its Retrieve, sorted : the categories come in the order of the rows
lds_sales = create datastore
lds_sales.DataObject = "d_sales"
lds_sales.SetTransObject(SQLCA)
lds_sales.Retrieve()
lds_sales.SetSort("month A")
lds_sales.Sort()
// Which column plays which role, then ONE call reads every row
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_CATEGORY, /*column*/ "month")
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_SERIES, /*column*/ "category")
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_VALUE, /*column*/ "amount")
uo_chart.of_from_datastore(/*ads*/ lds_sales)
// Later, the rows changed (an edit, a new Retrieve) : read again IN PLACE, the
// bars slide and every series keeps what you set on it
lds_sales.Retrieve()
uo_chart.of_reload()
El color de un punto, un menú en otro #
// May passed its limit : ONE bar of the series in red, the others keep their colour
uo_chart.of_set_point_color(/*key*/ "sales", /*position*/ 5, /*color*/ RGB(/*red*/ 200, /*green*/ 40, /*blue*/ 40))
// Event ue_point_rclicked of uo_chart : a menu about the point under the mouse
// Local variables
m_point lm_menu
// Remember which point the menu is about, then open it where the pointer is
is_menu_series = as_key
il_menu_position = al_index
lm_menu = create m_point
lm_menu.m_popup.PopMenu(w_main.PointerX(), w_main.PointerY())
destroy lm_menu
Buenas prácticas #
- Ponga las categorías antes que las series. Su número dice lo que debe contener una serie; al revés no puede funcionar.
- Un segundo eje se justifica, no se padece. Dos escalas en un mismo dibujo engañan al ojo: sáquelo solo cuando las unidades sean realmente distintas.
- Corte la animación en un cuadro de mando que se refresca. Una llegada que vuelve a empezar cada cinco segundos no termina nunca, y cansa en vez de ayudar.
- Las barras parten de cero, y el componente se atiene a ello: el cero entra en el eje en cuanto una barra o un área se apoya en él. Un gráfico de barras truncado exagera cada diferencia. Líneas, nubes y cotizaciones se leen en su propio rango.
- El gráfico conserva el sentido matemático en una aplicación de derecha a izquierda: categorías de izquierda a derecha, eje de valores a la izquierda. Solo la leyenda
START/ENDsigue el sentido de lectura. - Apile para leer un total, yuxtaponga para comparar. No son dos estilos, son dos preguntas distintas.
- Añada cada serie en un gráfico en directo:
of_append_categoriesy luegoof_append_valuespara cada una, con el mismo máximo — una serie olvidada se desliza bajo la categoría de al lado. - Un hueco no es un cero. Un valor NULL no se dibuja, ni se etiqueta, ni se puede pulsar; un peso NULL deja vacía la celda de un mapa de calor.
ue_point_clickedda el rango: úselo para abrir la lista exacta detrás de ese punto, no la pantalla de búsqueda.
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |
Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.