chartcartesian — u_pbt_chartcartesian #
← Référence des composants · Sommaire du guide
Graphique cartésien : colonnes, barres, lignes, aires et nuages de points, sur un axe de catégories et un ou deux axes de valeurs. Le type se règle par série.
▶ Le voir en vrai — Application de démonstration, tuile Cartesian chart : l'aperçu, le code qui le produit et cette page, côte à côte.
En bref #
| Userobject | u_pbt_chartcartesian |
| Classe d'items | n_pbt_chartcartesian_series (of_item(key)) · n_pbt_chartcartesian_axis (of_axis(axis)) |
| Sert à | Comparer des valeurs le long d'un axe — mois, produits, régions |
| Principe | Vous posez les catégories puis les séries ; les échelles, la grille et l'animation sont à nous |
Démarrage rapide #
// 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)
Le type appartient à la SÉRIE, pas au composant #
C'est la décision qui structure tout le reste. Un composant par type — un pour les barres, un pour les lignes — ne peut jamais produire un combiné : des barres surmontées d'une ligne d'objectif, avec un second axe. C'est pourtant la forme la plus demandée d'un tableau de bord.
Ici il y a un seul composant, et chaque série porte son is_type (TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER). Changer le type d'une série ne touche pas les autres.
ib_secondary place une série sur le second axe de valeurs. C'est ce qui permet à un nombre de commandes et à un chiffre d'affaires de cohabiter : sans lui, l'un des deux est une ligne plate au ras de l'axe.
of_set_categoriesvient avant les séries : leur nombre fixe combien de valeurs chaque série doit porter.
// 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
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_title | string | "" | Titre du graphique, affiché au-dessus |
ib_show_legend | boolean | true | Affiche la légende. Cliquer une entrée masque sa série — le moyen le moins cher de comparer deux séries sur cinq |
is_legend_location | string | bottom | Où va la légende (constantes LEGEND_*) : au-dessus ou au-dessous du tracé, ou à côté — START/END la posent en colonne sur un côté, et le tracé lui cède la place. START/END sont logiques : ils suivent le sens de lecture. Une position inconnue vaut le bas, et se relit telle |
ib_show_grid | boolean | true | Les traits de fond, à chaque valeur ronde. Sans eux, seule la forme reste lisible, jamais une valeur |
ib_value_tooltip | boolean | true | Le panneau des valeurs : quand la souris passe sur une catégorie, toutes les séries et leur valeur à cet endroit, d'un coup, et un réticule marque la colonne. Ce n'est pas is_tooltip (hérité), qui est l'infobulle du composant entier — celui-ci suit le pointeur et dit de quoi le graphique est fait. Chaque série écrit sa ligne avec son propre is_label_format ; une valeur absente n'a pas de ligne |
is_orientation | string | vertical | Colonnes ou barres (constantes ORIENTATION_*). Fait pivoter tout le repère, lignes et aires comprises |
ib_stacked | boolean | false | Empile les séries de barres au lieu de les mettre côte à côte. Lignes et aires ne s'empilent jamais : elles disent un niveau |
is_stack_mode | string | value | Somme ou part (constantes STACK_*). En percentage, chaque pile est ramenée à 100 : l'axe lit alors des parts et non des totaux — jusqu'à -100 quand des parts sont négatives. Ne veut rien dire hors empilement |
ib_enabled | boolean | true | Grisé : le composant continue de montrer ce qu'il montre — un graphique sans données n'est pas la même chose qu'un graphique que l'application a éteint — mais il cesse de répondre : ni clic, ni touche, ni entrée de légende, et il sort de l'ordre de tabulation. true par défaut |
ib_animated | boolean | true | Le graphique arrive animé : les formes grandissent, les rubans se fondent. Si l'arrivée se rejoue à chaque rafraîchissement d'un tableau de bord, mieux vaut la couper — une arrivée qui recommence toutes les cinq secondes ne se termine jamais. Un poste réglé sur « moins d'animations » n'anime jamais, quoi qu'en dise cette propriété |
ii_anim_duration | integer | 450 | Durée de cette arrivée, en millisecondes (0 à 5000) |
is_anim_easing | string | ease-out | Courbe de l'arrivée (constantes EASING_*) : linear, ease-out, back-out qui dépasse puis revient, bounce-out qui rebondit, elastic-out qui claque. C'est elle qui donne son caractère à l'animation |
ii_anim_delay | integer | 0 | Décalage entre deux séries à l'arrivée, en millisecondes (0 à 1000). Elles entrent alors l'une après l'autre au lieu de surgir ensemble, ce qui donne le sens de lecture du graphique. 0 = toutes en même temps |
is_theme_style | string | "" | Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement |
is_theme_mode | string | "" | Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = accent du thème) |
is_tooltip | string | "" | Info-bulle simple affichée au survol du composant |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie |
Méthodes #
| Méthode | Rôle | |
|---|---|---|
of_set_categories ( string as_labels[] ) | Les libellés de l'axe des catégories. À appeler avant les séries. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_set_value_labels ( string as_labels[] ) | Des libellés sur l'axe des valeurs. Vide — le cas normal — cet axe porte des nombres. Rempli, il porte des bandes comme l'axe des catégories : le repère à deux catégories dans lequel se dessine une carte de chaleur. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_get_value_labels ( ref string as_labels[] ) | Remplit as_labels[] avec ce que l'axe des valeurs porte maintenant et renvoie le nombre. Zéro = il porte des nombres | |
of_add_heat_series ( string as_key, string as_label, long al_x[], long al_y[], double ad_weight[] ) | Une carte de chaleur : une cellule par couple (catégorie, libellé de valeur), colorée par son poids. al_x est le rang de la catégorie et al_y celui du libellé, à partir de 1 — les rangs d'un tableau PowerScript, qu'une double boucle écrit sans calcul. Poser les deux listes de libellés avant. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou ` | , ou est déjà prise, -2` si le composant n'est pas créé |
of_add_ohlc_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Une série OHLC : l'étendue du bas au haut, un tiret à gauche pour l'ouverture et un à droite pour la clôture. Quatre nombres par point, et l'axe se lit sur le haut et le bas — les deux autres sont dedans par construction. Les quatre tableaux sont tronqués au plus court. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou ` | , ou est déjà prise, -2` si le composant n'est pas créé |
of_add_candle_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Les mêmes quatre nombres, dessinés en chandeliers : une mèche du bas au haut, et un corps plein entre l'ouverture et la clôture. Un doji — ouverture égale à clôture — garde un pixel de corps, pour rester une ligne que l'œil retrouve. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou ` | , ou est déjà prise, -2` si le composant n'est pas créé |
of_set_series_ohlc ( string as_key, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | De nouveaux cours pour une série financière déjà tracée. Ce que of_set_series_values est à une série de valeurs. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle n'est pas financière, -2 si le composant n'est pas créé | |
of_get_series_ohlc ( string as_key, ref double ad_open[], ref double ad_high[], ref double ad_low[], ref double ad_close[] ) | Remplit les quatre tableaux avec ce que la série porte maintenant et renvoie le nombre de points. Une série non financière renvoie 0 | |
of_add_series ( string as_key, string as_label, string as_type, double ad_values[] { , long al_color } ) | Ajoute une série avec son type — TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER ou TYPE_STEPLINE ; la surcharge prend aussi sa couleur (RGB()), sinon la palette choisit. Une valeur NULL (SetNull) est un trou : rien n'est dessiné, étiqueté ni cliquable à cet endroit, et une ligne s'y interrompt. Une clé déjà tenue est refusée, jamais remplacée : of_set_series_values et la poignée of_item changent une série qui existe. Renvoie 0 une fois ajoutée, -5 si le type n'est pas l'un de ces cinq (une carte de chaleur et les séries financières ont leur méthode), ou si la clé est vide, contient / ou ` | , ou est déjà prise, -2` si le composant n'est pas créé |
of_set_series_values ( string as_key, double ad_values[] ) | De nouvelles valeurs pour une série déjà tracée, le reste inchangé. C'est l'appel d'un tableau de bord qui vit : la série garde son identité, donc les formes glissent au lieu de sauter. Une valeur NULL est un trou. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des points ou des cotations (of_set_series_points, of_set_series_ohlc les remplacent), -2 si le composant n'est pas créé | |
of_append_values ( string as_key, double ad_values[], long al_max_points ) | Un graphique en direct : pousse de nouvelles valeurs à la fin d'une série et retire les plus anciennes dès qu'elle en porte plus de al_max_points (0 = sans limite). Seules les nouvelles valeurs voyagent — la série n'est pas renvoyée à chaque tic. À coupler avec of_append_categories. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des points ou des cotations, -2 si le composant n'est pas créé | |
of_append_categories ( string as_labels[], long al_max_count ) | De nouvelles catégories à la fin de l'axe, les plus anciennes retirées au-delà de al_max_count (0 = sans limite) : les libellés d'un graphique en direct glissent avec ses valeurs. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_add_point_series ( string as_key, string as_label, double ad_x[], double ad_y[] { , double ad_weight[] } ) | Une série positionnée par valeur sur les deux axes : x dit où le long de l'axe des catégories, y à quelle hauteur. Cet axe cesse alors d'être un axe de catégories — il devient un second axe de valeurs, avec ses propres graduations. Une surcharge prend un poids par point, qui donne la taille de la bulle. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou ` | , ou est déjà prise, -2` si le composant n'est pas créé |
of_set_series_points ( string as_key, double ad_x[], double ad_y[], double ad_weight[] ) | De nouveaux points pour une série qui en porte déjà. Ce que of_set_series_values est à une série de valeurs. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des valeurs ou des cotations, -2 si le composant n'est pas créé | |
of_get_series_points ( string as_key, ref double ad_x[], ref double ad_y[], ref double ad_weight[] ) | Remplit les trois tableaux avec ce que la série porte maintenant et renvoie le nombre de points. Une série de valeurs ne rend rien dans ad_x : elle n'a pas d'abscisse à elle | |
of_get_series_values ( string as_key, ref double ad_values[] ) | Remplit ad_values[] avec ce que la série porte maintenant et renvoie le nombre. Lecture vive : elle interroge le graphique, pas le dernier envoi | |
of_remove_series ( string as_key ) | Retire une série ; les autres gardent leur couleur et leur visibilité. Sa poignée (of_item) est détruite avec elle : un of_item suivant sur la même clé en crée une neuve. Renvoie 0 une fois retirée, -5 si aucune série ne porte cette clé, -2 si le composant n'est pas créé | |
of_clear ( ) | Vide le graphique — séries et catégories ; les poignées de série partent avec elles. Les axes gardent leurs réglages et leurs sections. Renvoie 0 une fois vidé, -2 si le composant n'est pas créé | |
of_set_value_format ( integer ai_decimals, string as_prefix, string as_suffix, boolean ab_thousands ) | Format des nombres de tout le graphique — axes, étiquettes et panneau des valeurs : décimales, préfixe, suffixe, séparateur de milliers. Les séparateurs décimal et de milliers sont ceux de la langue d'affichage. Efface aussi le format propre à chaque axe. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_set_value_format ( string as_axis, integer ai_decimals, string as_prefix, string as_suffix, boolean ab_thousands ) | Le format d'un axe (AXIS_VALUE, AXIS_VALUE2, ou AXIS_CATEGORY quand il porte des nombres) : ses graduations, et les étiquettes et le panneau des séries tracées dessus — un montant d'un côté, un nombre de commandes de l'autre. Renvoie 0 une fois appliqué, -5 si l'axe n'est pas l'un des AXIS_*, -2 si le composant n'est pas créé | |
of_clear_value_format ( ) | Revient au format par défaut. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_item ( string as_key ) | Renvoie la poignée d'une série, pour la modifier ensuite | |
of_axis ( string as_axis ) | Renvoie la poignée d'un axe (AXIS_CATEGORY, AXIS_VALUE, AXIS_VALUE2), pour le régler ensuite. Tout autre rôle ne rend aucune poignée (IsValid() est faux) | |
of_add_axis_section ( string as_axis, string as_key, double ad_from, double ad_to, long al_color ) | Une bande en travers du tracé, derrière les données : « sous 200 c'est mauvais ». Dessinée sous les formes, elle ne leur fait jamais concurrence. Sur l'axe des catégories, ad_from et ad_to sont des positions comptées à partir de 1 (2 à 3 couvre la deuxième et la troisième catégorie). Renvoie 0 une fois ajoutée, -5 si l'axe n'est pas l'un des AXIS_* ou si la clé est vide, contient / ou ` | , ou est déjà prise sur cet axe, -2` si le composant n'est pas créé |
of_add_axis_threshold ( string as_axis, string as_key, double ad_at, long al_color, integer ai_thickness ) | Une ligne en travers du tracé à une valeur — un objectif, une limite. Même registre que les bandes, mais dessinée pour être vue. Renvoie 0 une fois ajoutée, -5 si l'axe n'est pas l'un des AXIS_* ou si la clé est vide, contient / ou ` | , ou est déjà prise sur cet axe, -2` si le composant n'est pas créé |
of_clear_axis_sections ( string as_axis ) | Retire toutes les bandes et tous les seuils d'un axe. Renvoie 0 une fois vidé, -5 si l'axe n'est pas l'un des AXIS_*, -2 si le composant n'est pas créé | |
of_reset ( ) | Vide le graphique — poignées de série et d'axe comprises — et remet toutes les propriétés à leur valeur d'origine. Renvoie 0 une fois fait, -2 si le composant n'est pas créé |
Sans clé (mode démo), le graphique ne dessine que ses 3 premières séries, légende comprise. Les autres restent dans le modèle —
of_count,of_get_series_valueset leurs poignées les voient — et la clé posée les montre sans que vous ayez rien à renvoyer.
Événements #
| Événement | Déclenché quand |
|---|---|
ue_point_clicked (string as_key, long al_index, double ad_value) | Une barre, un point, une case ou une cotation a été cliqué — ou validé par Entrée : la clé de la série, la position du point dans la série, à partir de 1, et sa valeur — celle du point quelle que soit la forme de la série : le y d'un nuage, le poids d'une case de chaleur, la clôture d'une cotation. Au clavier, Gauche/Droite parcourent les catégories et Haut/Bas choisissent la série que le panneau souligne ; une série de points ou une carte de chaleur choisie se parcourt point par point. Un trou n'a rien à cliquer |
ue_series_toggled (string as_key, boolean ab_visible) | L'utilisateur a masqué ou remontré une série d'un clic dans la légende. Ce que le graphique affiche n'est alors plus ce que l'application a envoyé. Poser ib_visible est une valeur, comme cocher une case : cet événement rapporte le geste de l'utilisateur |
L'animation est une entrée, pas un calcul : la géométrie finale est posée tout de suite, et seule l'arrivée est jouée. Un graphique jamais affiché — né hors écran, dans un onglet que personne n'ouvre — montre donc les bonnes barres, en silence.
Propriétés d'item #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_label | string | "" | Le nom de la série, tel que la légende l'affiche |
is_type | string | bar | bar · line · area · scatter · stepline (constantes TYPE_*). Change le dessin de cette série seule — c'est ce qui fait un graphique combiné. Seul un type de la même famille est pris : une série de valeurs parmi bar, line, area, scatter et stepline, une série financière entre ohlc et candle ; un autre est ignoré et is_type relit le type gardé |
il_color | long | -1 | Couleur de la série (RGB()). -1 tant qu'aucune n'est posée : la palette choisit |
ib_visible | boolean | true | false masque une série sans la retirer — la légende garde le chemin du retour. Comme une case à cocher, c'est une valeur posée : ue_series_toggled rapporte, lui, le clic de l'utilisateur dans la légende |
ib_secondary | boolean | false | Trace la série sur le second axe. C'est ainsi qu'un nombre et un montant vivent sur le même graphique |
ib_data_labels | boolean | false | Écrit la valeur de chaque point à côté de lui. Éteint par défaut : sur cinquante points, les étiquettes couvrent le dessin qu'elles expliquent |
is_label_format | string | "" | Ce que dit chaque étiquette et chaque ligne du panneau : #y# la valeur, #x# la catégorie (le x d'une série de points, la colonne d'une case de chaleur), #v# la ligne d'une case de chaleur, #label# le nom de la série, #open# #high# #low# #close# les cours ; le reste s'écrit tel quel — "$#y#K". Vide = la valeur seule. Une étiquette écrite dans une barre empilée prend le noir ou le blanc que sa barre porte |
id_smoothness | double | 1 | Lignes et aires seulement : à quel point la ligne est arrondie, 0 = des segments droits, 1 = pleinement courbe, à la manière de LiveCharts. Un escalier l'ignore — il dit que le niveau a TENU jusqu'à la catégorie suivante, une courbe dirait qu'il a dérivé. Une courbe peut passer au-delà de ses points ; elle est découpée au cadre du tracé et ne peint jamais sur les libellés des axes |
ib_fill | boolean | true | Lignes et aires : le lavis sous le trait, jusqu'à l'axe, dans la teinte de la série. C'est le retrait qui est l'acte délibéré — pour une ligne posée par-dessus autre chose (des colonnes, des bandes d'axe colorées) que le lavis cacherait |
il_fill_color | long | -1 | La couleur de ce lavis. -1 = celle de la ligne elle-même |
is_marker | string | "circle" | Lignes, escaliers et nuages : la FORME du marqueur posé sur chaque point (constantes MARKER_* : none, circle, square, triangle, diamond). Ce n'est pas de la décoration — deux lignes qui se croisent, imprimées en gris, se distinguent par leur marqueur et par rien d'autre |
ii_thickness | integer | 2 | Lignes et aires : l'épaisseur du trait, en pixels |
ii_point_count | integer | 0 | Combien de points cette série porte — des valeurs ou des couples (x, y) (lecture seule) |
il_cold_color | long | -1 | Cartes de chaleur seulement : la borne FROIDE de la rampe, celle de la lecture la plus légère. -1 = la rampe du composant, un seul bleu, du très pâle au soutenu |
il_mid_color | long | -1 | La borne MÉDIANE. Trois bornes et non deux : interpoler d'un bout à l'autre délave le milieu de l'échelle, là où se tiennent la plupart des lectures. -1 = le bleu moyen du composant |
il_hot_color | long | -1 | La borne CHAUDE, celle de la lecture la plus lourde. C'est elle que la légende affiche. -1 = le bleu soutenu du composant |
il_up_color | long | -1 | Séries financières seulement : la couleur d'un point qui clôture au-dessus de son ouverture. -1 = le vert du composant |
il_down_color | long | -1 | Et celle d'un point qui clôture en dessous. Deux couleurs parce que le sens est ce qu'on lit sur un tel graphique — une seule le masquerait. -1 = le rouge du composant |
Propriétés d'axe #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_title | string | "" | Titre écrit le long de l'axe. Vide = pas de titre, et pas de place réservée pour un |
id_min | double | NULL | Borne basse imposée. Elle l'emporte sur les données et n'est pas arrondie : qui écrit 0 veut 0. NULL (SetNull) n'impose rien : l'axe suit à nouveau ses données, et une borne libre se relit NULL (IsNull), jamais 0. Libre, un axe de valeurs ne prend zéro que si une barre ou une aire s'y tient : des cours et des lignes se lisent sur leur propre étendue |
id_max | double | NULL | Borne haute imposée, même règle. Ce qui la dépasse est coupé au bord du tracé |
id_step | double | 0 | Distance entre deux lignes de grille, en valeurs. 0 = un pas rond lu dans l'étendue |
ii_label_rotation | integer | 0 | Rotation des libellés de cet axe, en degrés (-90 à 90) — noms de catégories ou graduations de valeurs. Douze noms de mois ne tiennent sous un graphique qu'inclinés ; quand ils ne tiennent toujours pas, le graphique en écrit un sur N, le premier et le dernier toujours |
ib_separator | boolean | true | Ses lignes de grille. Un axe de catégories en a rarement besoin, un axe de valeurs presque toujours |
ii_section_count | integer | 0 | Combien de bandes et de seuils cet axe porte (lecture seule) |
ib_logarithmic | boolean | false | Axes de valeurs seulement : une échelle logarithmique, graduée par décades (1, 10, 100…), chaque décade de la même hauteur — pour des chiffres qui couvrent plusieurs ordres de grandeur. Zéro et les valeurs négatives n'y ont pas de place et ne sont pas dessinés |
Exemples #
Régler l'animation selon l'écran #
// 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
Ouvrir les lignes derrière un point #
// 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
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 tableau de bord qui vit #
// Timer event of the window : new values for the same series, so the bars
// SLIDE to their new height instead of replaying their arrival
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 graphique en direct qui glisse #
// 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)
Une mesure manquante, et le graphique en image #
// 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")
Une bande et un objectif sur l'axe des valeurs #
// 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)"
Bonnes pratiques #
- Posez les catégories avant les séries. Leur nombre dit ce qu'une série doit contenir ; l'inverse ne peut pas marcher.
- Un second axe se justifie, il ne se subit pas. Deux échelles sur un même dessin trompent l'œil : ne le sortez que quand les unités sont vraiment différentes.
- Coupez l'animation sur un tableau de bord qui se rafraîchit. Une arrivée qui recommence toutes les cinq secondes ne se termine jamais, et fatigue au lieu d'aider.
- Les barres partent de zéro, et le composant s'y tient : zéro entre dans l'axe dès qu'une barre ou une aire s'y tient. Un graphique en barres tronqué exagère chaque écart. Des lignes, des nuages et des cours se lisent, eux, sur leur propre étendue.
- Le graphique garde le sens mathématique dans une application de droite à gauche : catégories de gauche à droite, axe des valeurs à gauche. Seule la légende
START/ENDsuit le sens de lecture. - Empilez pour lire un total, juxtaposez pour comparer. Ce ne sont pas deux styles, ce sont deux questions différentes.
ue_point_clickeddonne le rang : servez-vous en pour ouvrir la liste exacte derrière ce point, pas l'écran de recherche.
Hérité du socle commun #
Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_count · of_keys_at · of_has | Parcourir ce que le composant contient | 3.2 Les items |
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |
Deux aides ne sont pas héritées : of_icon et of_escape_markup vivent sur n_pbt_utils. Déclarez-en une — n_pbt_utils lnv_utils, rien à créer — et appelez-les dessus.