chartcartesian — u_pbt_chartcartesian #
← Referência dos componentes · Índice do guia
Gráfico cartesiano: colunas, barras, linhas, áreas e nuvens de pontos, num eixo de categorias e num ou dois eixos de valores. O tipo define-se por série.
▶ Ver ao vivo — Aplicação de demonstração, mosaico Cartesian chart : a pré-visualização, o código que o produz e esta página, lado a lado.
Em resumo #
| Userobject | u_pbt_chartcartesian |
| Classe de itens | n_pbt_chartcartesian_series (of_item(key)) · n_pbt_chartcartesian_axis (of_axis(axis)) |
| Serve para | Comparar valores ao longo de um eixo — meses, produtos, regiões |
| Princípio | Você põe as categorias e depois as séries; as escalas, a grelha e a animação são connosco |
Arranque 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)
O tipo pertence à SÉRIE, não ao componente #
É a decisão de que decorre tudo o resto. Um componente por tipo — um para barras, outro para linhas — nunca pode produzir um combinado: barras encimadas por uma linha de objectivo, num segundo eixo. E é justamente a forma mais pedida num painel.
Aqui há um só componente, e cada série leva o seu is_type (TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER, TYPE_STEPLINE). Mudar o tipo de uma série não toca nas outras.
ib_secondary coloca uma série no segundo eixo de valores. É o que permite a um número de encomendas e a uma facturação conviverem: sem ele, uma das duas é uma linha plana rente ao eixo.
of_set_categoriesvem antes das séries: o seu número fixa quantos valores cada série deve levar.
// 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
Propriedades #
| Propriedade | Tipo | Predefinição | Papel |
|---|---|---|---|
is_title | string | "" | Título do gráfico, mostrado por cima |
ib_show_legend | boolean | true | Mostra a legenda. Clicar numa entrada esconde a sua série — a forma mais barata de comparar duas séries em cinco |
is_legend_location | string | bottom | Onde fica a legenda (constantes LEGEND_*): por cima ou por baixo do traçado, ou ao lado — START/END põem-na em coluna de um lado, e o traçado cede-lhe o espaço. START/END são lógicas: seguem o sentido de leitura. Uma posição desconhecida vale o fundo, e relê-se assim |
ib_show_grid | boolean | true | As linhas de fundo, em cada valor redondo. Sem elas só a forma continua legível, nunca um valor |
ib_value_tooltip | boolean | true | O painel de valores: quando o rato passa sobre uma categoria, todas as séries e o seu valor aí, de uma vez, e uma retícula marca a coluna. Não é is_tooltip (herdado), que é a dica do componente inteiro — este segue o ponteiro e diz de que é feito o gráfico. Cada série escreve a sua linha com o seu próprio is_label_format; um valor ausente não tem linha. A dica de uma série (o seu is_tooltip) é escrita neste painel, sob a linha da série apontada, mesmo a false |
is_orientation | string | vertical | Colunas ou barras (constantes ORIENTATION_*). Roda todo o referencial, linhas e áreas incluídas |
ib_stacked | boolean | false | Empilha as séries de barras em vez de as pôr lado a lado; as séries de áreas empilham-se entre si — nunca barras com áreas. Uma linha nunca se empilha: diz um nível. As barras do segundo eixo formam a sua própria pilha, ao lado da do eixo principal |
is_stack_mode | string | value | Soma ou quota (constantes STACK_*). Em percentage cada pilha é levada a 100: o eixo lê então quotas, não totais — até -100 quando há quotas negativas. Não significa nada fora do empilhamento |
ib_enabled | boolean | true | Esbatido: o componente continua a mostrar o que mostra — um gráfico sem dados não é o mesmo que um gráfico que a aplicação desligou — mas deixa de responder: nem clique, nem tecla, nem entrada de legenda, e sai da ordem de tabulação. true por omissão |
ib_animated | boolean | true | O gráfico chega animado: as formas sobem do eixo — o gráfico inteiro quando passa de vazio a desenhado e quando se acrescenta uma série. Os novos valores deslizam para o seu lugar, e uma forma que um gráfico em direto acrescenta (of_append_values) sobe sozinha: um painel que se actualiza pode manter a animação. Um posto configurado para reduzir o movimento não anima, a não ser que a aplicação insista (PBT_SetAnimationPolicy, secção 4.8) |
ii_anim_duration | integer | 450 | Duração dessa chegada, em milissegundos (0 a 5000) |
is_anim_easing | string | ease-out | Curva da chegada (constantes EASING_*): linear, ease-out, back-out que passa e volta, bounce-out que ressalta, elastic-out que estala. É ela que dá carácter à animação |
ii_anim_delay | integer | 0 | Desfasamento entre duas séries à chegada, em milissegundos (0 a 1000). Entram então uma após a outra em vez de surgirem juntas, o que dá ao gráfico o seu sentido de leitura. 0 = todas ao mesmo tempo |
is_format | string | "" | O formato de todos os números que o gráfico escreve — eixos de valores, etiquetas e painel de valores — na sintaxe de um formato de DataWindow: #,##0.00, $#,##0, #,##0 "unidades", secções positivo;negativo;zero. Os separadores são os da língua de apresentação. Um eixo pode ter o seu (of_axis(AXIS_VALUE2).is_format), que prevalece sobre este. Vazio (ou um formato que não é numérico) = o número tal como está, à milésima |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de acento deste componente (-1 = acento do tema) |
is_tooltip | string | "" | Dica simples mostrada ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título da dica enriquecida (tem precedência sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto da dica enriquecida (marcação rica aceite) |
is_super_tooltip_image | string | "" | Imagem da dica enriquecida |
Métodos #
| Método | Papel | |
|---|---|---|
of_set_categories ( string as_labels[] ) | As etiquetas do eixo de categorias — texto: uma etiqueta de marcação que contenham é retirada, e o eixo, o painel e #x# dizem o mesmo. A chamar antes das séries. Devolve 0 uma vez aplicado, -2 se o componente não estiver criado | |
of_set_value_labels ( string as_labels[] ) | Etiquetas no eixo dos valores. Vazio — o caso normal — esse eixo carrega números. Preenchido, carrega faixas como o eixo de categorias: o quadro de duas categorias em que se desenha um mapa de calor. Devolve 0 uma vez aplicado, -2 se o componente não estiver criado | |
of_get_value_labels ( ref string as_labels[] ) | Preenche as_labels[] com o que o eixo dos valores carrega agora e devolve o número. Zero = carrega números; uma etiqueta que contenha ` | ` relê-se inteira |
of_get_categories ( ref string as_labels[] ) | Preenche as_labels[] com as categorias que o gráfico carrega agora — depois de of_append_categories retirar as mais antigas, depois de of_from_datastore as ler — e devolve o seu número | |
of_get_last_error ( ) | Porque é que a última chamada foi recusada (um papel de of_map que as linhas não têm, um limite NULL, uma posição fora de uma série…), ou quantas linhas o último of_from_datastore pôs de lado e porquê; senão o último erro da DLL, como para qualquer componente | |
of_add_heat_series ( string as_key, string as_label, long al_x[], long al_y[], double ad_weight[] ) | Um mapa de calor: uma célula por par (categoria, etiqueta de valor), colorida pelo seu peso. al_x é o posto da categoria e al_y o da etiqueta, ambos a partir de 1 — os postos de um array PowerScript, que um duplo ciclo escreve sem cálculo. Definir antes as duas listas. Um peso NULL é uma célula vazia: aí nada é desenhado, etiquetado nem clicável. Devolve 0 uma vez adicionada, -5 se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada, -2` se o componente não estiver criado |
of_add_ohlc_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Uma série OHLC: a amplitude do mínimo ao máximo, um traço à esquerda para a abertura e outro à direita para o fecho. Quatro números por ponto, e o eixo lê-se pelo máximo e pelo mínimo — os outros dois estão dentro por construção. Os quatro arrays são truncados ao mais curto. Devolve 0 uma vez adicionada, -5 se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada, -2` se o componente não estiver criado |
of_add_candle_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Os mesmos quatro números, desenhados em velas: um pavio do mínimo ao máximo e um corpo cheio entre a abertura e o fecho. Um doji — abertura igual ao fecho — guarda um pixel de corpo, para continuar a ser uma linha que o olho encontra. Devolve 0 uma vez adicionada, -5 se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada, -2` se o componente não estiver criado |
of_set_series_ohlc ( string as_key, double ad_open[], double ad_high[], double ad_low[], double ad_close[] ) | Novas cotações para uma série financeira já traçada. O que of_set_series_values é para uma série de valores. Devolve 0 uma vez aplicado, -5 se nenhuma série tiver esta chave ou se não for financeira, -2 se o componente não estiver criado | |
of_get_series_ohlc ( string as_key, ref double ad_open[], ref double ad_high[], ref double ad_low[], ref double ad_close[] ) | Preenche os quatro arrays com o que a série carrega agora e devolve o número de pontos. Uma série não financeira devolve 0 | |
of_add_series ( string as_key, string as_label, string as_type, double ad_values[] { , long al_color } ) | Adiciona uma série com o seu tipo — TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER ou TYPE_STEPLINE; a sobrecarga recebe também a sua cor (RGB()), senão a paleta escolhe. Um valor NULL (SetNull) é um buraco: aí nada é desenhado, etiquetado nem clicável, e uma linha interrompe-se. Uma chave já tomada é recusada, nunca substituída: of_set_series_values e o handle of_item mudam uma série que existe. Devolve 0 uma vez adicionada, -5 se o tipo não for um destes cinco (um mapa de calor e as séries financeiras têm o seu método), ou se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada, -2` se o componente não estiver criado |
of_set_series_values ( string as_key, double ad_values[] ) | Novos valores para uma série já traçada, o resto intacto. É a chamada de um painel vivo: a série mantém a sua identidade, por isso as formas deslizam em vez de saltar. Um valor NULL é um buraco. Devolve 0 uma vez aplicado, -5 se nenhuma série tiver esta chave ou se tiver pontos ou cotações (of_set_series_points, of_set_series_ohlc substituem-nos), -2 se o componente não estiver criado | |
of_set_point_color ( string as_key, long al_position, long al_color ) | A cor de um ponto — o mês que ultrapassou o seu limite, a vermelho. al_position conta a partir de 1; -1 (ou NULL) devolve ao ponto a cor da sua série. Barras, marcadores de linha e pontos de nuvem tomam-na, e desliza com o seu ponto num gráfico em direto. Devolve 0 uma vez aplicado, -5 se nenhuma série tiver esta chave, se a posição estiver fora da série, ou para um mapa de calor ou uma série financeira (as suas cores são a sua escala e o seu sentido), -2 se o componente não estiver criado | |
of_get_point_color ( string as_key, long al_position ) | Devolve a cor (um long RGB()) que of_set_point_color — ou uma coluna ROLE_COLOR — deu ao ponto al_position, contado a partir de 1, ou -1 quando não tem (toma a cor da sua série), e para uma chave ou uma posição desconhecida | |
of_append_values ( string as_key, double ad_values[], long al_max_points ) | Um gráfico em direto: acrescenta novos valores no fim de uma série e retira os mais antigos assim que tiver mais de al_max_points (0 = sem limite). Só viajam os valores novos — a série não é reenviada a cada tique. A combinar com of_append_categories. As novas formas sobem sozinhas, as outras deslizam. Acrescente cada série, com o mesmo máximo que of_append_categories: uma série esquecida desfasa-se das suas categorias. Devolve 0 uma vez aplicado, -5 se nenhuma série tiver esta chave ou se tiver pontos ou cotações, -2 se o componente não estiver criado | |
of_append_categories ( string as_labels[], long al_max_count ) | Novas categorias no fim do eixo, as mais antigas retiradas além de al_max_count (0 = sem limite): as etiquetas de um gráfico em direto deslizam com os seus valores. Acrescente cada série com of_append_values e o mesmo máximo. Devolve 0 uma vez aplicado, -2 se o componente não estiver criado | |
of_add_point_series ( string as_key, string as_label, double ad_x[], double ad_y[] { , double ad_weight[] } ) | Uma série posicionada por valor nos dois eixos: x diz onde ao longo do eixo de categorias, y a que altura. Esse eixo deixa então de ser um eixo de categorias — passa a ser um segundo eixo de valores, com as suas graduações. Uma sobrecarga aceita um peso por ponto, que dimensiona a bolha. Um peso NULL mantém o tamanho predefinido, fora da escala das outras. Não misture estas séries com séries de valores num gráfico de categorias: as etiquetas das categorias dão lugar às graduações. Devolve 0 uma vez adicionada, -5 se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada, -2` se o componente não estiver criado |
of_set_series_points ( string as_key, double ad_x[], double ad_y[], double ad_weight[] ) | Novos pontos para uma série que já os carrega. O que of_set_series_values é para uma série de valores. Devolve 0 uma vez aplicado, -5 se nenhuma série tiver esta chave ou se tiver valores ou cotações, -2 se o componente não estiver criado | |
of_get_series_points ( string as_key, ref double ad_x[], ref double ad_y[], ref double ad_weight[] ) | Preenche os três arrays com o que a série carrega agora e devolve o número de pontos. Uma série de valores não responde nada em ad_x: não tem abcissa própria | |
of_get_series_values ( string as_key, ref double ad_values[] ) | Preenche ad_values[] com o que a série carrega agora e devolve o número. Leitura viva : consulta o gráfico, não o último envio | |
of_remove_series ( string as_key ) | Retira uma série; as outras mantêm a cor — tomada ao serem acrescentadas — e a visibilidade; a sua tooltip e as suas cores de item vão com ela. O seu handle (of_item) é destruído com ela: um of_item seguinte na mesma chave cria um novo. Devolve 0 uma vez retirada, -5 se nenhuma série tiver esta chave, -2 se o componente não estiver criado | |
of_clear ( ) | Esvazia o gráfico — séries e categorias; os handles de série vão com elas. Os eixos mantêm as suas definições e as suas secções. Devolve 0 uma vez esvaziado, -2 se o componente não estiver criado | |
of_from_datastore ( datastore ads ) | Alimenta o gráfico a partir de um DataStore (um DataWindow, um DataWindowChild: sobrecargas), como o gráfico de um DataWindow: uma coluna de categorias, uma coluna de valores e, se existir, uma coluna de séries — uma série por cada valor encontrado, uma série com o nome da coluna dos valores sem ela. As linhas que partilham uma categoria e uma série são somadas; as categorias vêm pela ordem das linhas (ordene o DataStore); uma categoria sem linha é um buraco. Uma coluna de cor colore o seu ponto. Uma coluna desempenha um papel quando tem o seu nome (category, series, value, color) ou quando of_map o diz; números e datas do posto são lidos corretamente. Dado de novo, o gráfico muda no lugar: uma série mantém o tipo, a cor e o eixo, uma série acrescentada à mão nunca é tocada; uma nova série é uma barra. Devolve 0 uma vez carregado (as linhas cuja série não pode ser uma chave são saltadas: of_get_last_error diz quantas), -5 se o DataStore não for válido ou nenhuma coluna desempenhar ROLE_CATEGORY ou ROLE_VALUE (of_get_last_error diz qual), -2 se o componente não estiver criado | |
of_map ( string as_role, string as_column ) | Dá um papel a uma coluna do DataStore (ROLE_CATEGORY, ROLE_SERIES, ROLE_VALUE, ROLE_COLOR) quando o seu nome não o diz. Antes de of_from_datastore, ou depois: as linhas são relidas. Uma coluna vazia devolve o papel à coluna que tem o seu nome. Devolve 0 uma vez definido, -5 se o papel não for uma constante ROLE_ ou a coluna não for uma do último DataStore, -2 se o componente não estiver criado | |
of_reload ( ) | Relê as linhas do DataStore (ou do DataWindow) dado a of_from_datastore — depois de um Retrieve, de uma edição, de um filtro — e muda o gráfico no lugar: as formas deslizam para os novos valores. Devolve 0 uma vez relido, -5 se nenhum DataStore tiver sido dado ou já não for válido, -2 se o componente não estiver criado | |
of_item ( string as_key ) | Devolve a pega de uma série, para a alterar depois | |
of_axis ( string as_axis ) | Devolve a pega de um eixo (AXIS_CATEGORY, AXIS_VALUE, AXIS_VALUE2), para o ajustar depois. Qualquer outro papel não devolve nenhuma pega (IsValid() é falso) | |
of_add_axis_section ( string as_axis, string as_key, double ad_from, double ad_to, long al_color ) | Uma faixa através do traçado, por trás dos dados: « abaixo de 200 é mau ». Desenhada sob as formas, nunca compete com elas. No eixo das categorias, ad_from e ad_to são posições contadas a partir de 1 (de 2 a 3 cobre a segunda e a terceira categoria). Uma cor -1 (ou NULL) é uma aguada pálida do acento do tema. Devolve 0 uma vez adicionada, -5 se o eixo não for um dos AXIS_*, se um limite for NULL ou se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada nesse eixo, -2` se o componente não estiver criado |
of_add_axis_threshold ( string as_axis, string as_key, double ad_at, long al_color, integer ai_thickness ) | Uma linha através do traçado num valor — um objectivo, um limite. O mesmo registo das faixas, mas desenhada para ser vista. Uma cor -1 (ou NULL) desenha-a no acento do tema. Devolve 0 uma vez adicionada, -5 se o eixo não for um dos AXIS_*, se um limite for NULL ou se a chave estiver vazia, contiver / ou ` | , ou já estiver tomada nesse eixo, -2` se o componente não estiver criado |
of_clear_axis_sections ( string as_axis ) | Retira todas as faixas e todos os limiares de um eixo. Devolve 0 uma vez esvaziado, -5 se o eixo não for um dos AXIS_*, -2 se o componente não estiver criado | |
of_remove_axis_section ( string as_axis, string as_key ) | Retira uma faixa ou um limiar de um eixo: os outros ficam. Devolve 0 uma vez retirado, -5 se o eixo não for um dos AXIS_* ou não tiver nenhuma secção com esta chave, -2 se o componente não estiver criado | |
of_reset ( ) | Esvazia o gráfico — handles de série e de eixo incluídos — e repõe todas as propriedades no seu valor de origem. Devolve 0 uma vez feito, -2 se o componente não estiver criado |
Sem chave (modo demo), o gráfico só desenha as suas 3 primeiras séries, legenda incluída. As outras ficam no modelo —
of_count,of_get_series_valuese os seus handles veem-nas — e a chave definida mostra-as sem que tenha de reenviar nada.
Eventos #
| Evento | Disparado quando |
|---|---|
ue_point_clicked (string as_key, long al_index, double ad_value) | Uma barra, um ponto, uma célula ou uma cotação foi clicada — ou confirmada com Enter: a chave da série, a posição do ponto na série, a partir de 1, e o seu valor — o do ponto seja qual for a forma da série: o y de uma nuvem, o peso de uma célula de calor, o fecho de uma cotação. No teclado, Esquerda/Direita percorrem as categorias e Cima/Baixo escolhem a série que o painel sublinha; uma série de pontos ou um mapa de calor escolhido percorre-se ponto a ponto. Um buraco não tem nada para clicar; o ponto em que está o teclado é rodeado, e anunciado ao leitor de ecrã |
ue_point_rclicked (string as_key, long al_index, double ad_value, long al_x, long al_y) | Um clique direito numa barra, num ponto, numa célula ou numa cotação — ou a tecla Menu (Shift+F10) no ponto em que está o teclado: a chave da série, a posição a partir de 1 e o valor, como ue_point_clicked os dá. É aí que se abre o seu menu; al_x, al_y: onde abrir o menu, em píxeis de ecrã — o ponteiro, ou pelo teclado (tecla Menu, Shift+F10) o meio da forma do ponto; um contextmenu abre-se aí tal como estão (uo_menu.of_show(al_x, al_y)) |
ue_rclicked ( ) | Um clique direito no gráfico onde nenhum ponto está desenhado — os eixos, o traçado vazio, a legenda. Um clique direito num ponto lança ue_point_rclicked em vez disso, nunca os dois |
ue_series_toggled (string as_key, boolean ab_visible) | O utilizador ocultou ou voltou a mostrar uma série com um clique na legenda. O que o gráfico mostra deixa então de ser o que a aplicação enviou. Definir ib_visible é um valor, como marcar uma caixa: este evento comunica o gesto do utilizador |
A animação é uma entrada, não um cálculo: a geometria final é escrita de imediato e só a chegada é tocada. Um gráfico nunca mostrado — nascido fora do ecrã, num separador que ninguém abre — mostra portanto as barras certas, em silêncio.
Propriedades de item #
| Propriedade | Tipo | Predefinição | Papel |
|---|---|---|---|
is_label | string | "" | O nome da série, tal como a legenda o mostra |
is_type | string | bar | bar · line · area · scatter · stepline (constantes TYPE_*). Muda o desenho desta série apenas — é isso que faz um gráfico combinado. Só um tipo da mesma família é aceite: uma série de valores entre bar, line, area, scatter e stepline, uma série financeira entre ohlc e candle; qualquer outro é ignorado e is_type relê o tipo mantido |
il_color | long | -1 | Cor da série (RGB()). -1 enquanto nenhuma estiver definida: a paleta escolhe, ao acrescentar, e a série mantém-na: retirar outra série nunca a recolore. Um ponto pode tomar a sua (of_set_point_color). As cores de item herdadas (il_accent, il_back_color, il_text_color e as suas variantes ao passar) não têm efeito numa série: decide il_color |
ib_visible | boolean | true | false oculta uma série sem a retirar — a legenda guarda o caminho de volta. Como uma caixa de verificação, é um valor definido: ue_series_toggled comunica o clique do utilizador na legenda |
ib_secondary | boolean | false | Traça a série no segundo eixo. É assim que um número e um montante vivem no mesmo gráfico |
ib_data_labels | boolean | false | Escreve o valor de cada ponto ao seu lado. Desligado por omissão: em cinquenta pontos as etiquetas tapam o desenho que explicam |
is_label_format | string | "" | O que diz cada etiqueta e cada linha do painel: #y# o valor, #x# a categoria (o x de uma série de pontos, a coluna de uma célula de calor), #v# a linha de uma célula de calor, #label# o nome da série, #open# #high# #low# #close# as cotações; o resto escreve-se tal como está — "$#y#K". Vazio = o valor sozinho. Uma etiqueta escrita dentro de uma barra empilhada fica a preto ou a branco, conforme a sua barra suporta |
id_smoothness | double | 1 | Só linhas e áreas: quão arredondada é desenhada a linha, 0 = segmentos retos, 1 = plenamente curva, como a desenha o LiveCharts. Uma linha em escada ignora-o — diz que o nível se MANTEVE até à categoria seguinte, uma curva diria que derivou. Uma curva pode passar para além dos seus pontos; é cortada no quadro do traçado e nunca pinta sobre os rótulos dos eixos |
ib_fill | boolean | true | Linhas e áreas: a aguada sob o traço, até ao eixo, no tom da série. É a remoção que é o acto deliberado — para uma linha posta por cima de outra coisa (colunas, bandas de eixo coloridas) que a aguada esconderia |
il_fill_color | long | -1 | A cor dessa aguada. -1 = a da própria linha |
is_marker | string | "circle" | Linhas, escadas e nuvens de pontos: a FORMA do marcador em cada ponto (constantes MARKER_*: none, circle, square, triangle, diamond). Não é decoração — duas linhas que se cruzam, impressas a cinzento, distinguem-se pelo seu marcador e por mais nada |
ii_thickness | integer | 2 | Linhas e áreas: a espessura do traço, em píxeis |
il_point_count | long | 0 | Quantos pontos carrega esta série — valores, pares (x, y) ou cotações (só leitura). Um long: uma série em direto pode guardar mais de 32 767 |
il_cold_color | long | -1 | Só mapas de calor: o extremo FRIO da escala, a leitura mais leve. -1 = a escala própria do componente, um só azul, do muito pálido ao intenso |
il_mid_color | long | -1 | O ponto MÉDIO. Três pontos e não dois: interpolar de uma ponta à outra desbota o meio da escala, onde está a maior parte das leituras. -1 = o azul médio do componente |
il_hot_color | long | -1 | O extremo QUENTE, a leitura mais pesada. É o que a legenda mostra. -1 = o azul intenso do componente |
il_up_color | long | -1 | Só séries financeiras: a cor de um ponto que fecha acima da sua abertura. -1 = o verde do componente |
il_down_color | long | -1 | E a de um ponto que fecha abaixo. Duas cores porque o sentido é o que se lê num gráfico assim — uma só ocultá-lo-ia. -1 = o vermelho do componente |
is_tooltip | string | "" | A sua dica, escrita no painel de valores, logo sob a linha da série — só quando é a série apontada (a sua barra, o seu ponto ou a sua linha sob o rato, ou a série escolhida no teclado por Cima / Baixo), nunca para as outras séries da coluna, nunca como segunda bolha. Uma coluna percorrida onde nenhuma forma está desenhada não aponta nenhuma série. Com ib_value_tooltip a false, o painel abre-se na mesma para ela, sem os números. Uma série de pontos ou um mapa de calor mostra-a no painel que o teclado abre sobre o seu ponto. Marcação aceite |
is_super_tooltip_title | string | "" | O título a negrito da sua dica, escrito no painel sob a sua linha |
is_super_tooltip_text | string | "" | O texto da sua dica, no painel. Marcação aceite |
is_super_tooltip_image | string | "" | Uma imagem no topo da sua dica, no painel (caminho do bundle, caminho absoluto ou resources.dll:nome) |
Propriedades de eixo #
| Propriedade | Tipo | Predefinição | Papel |
|---|---|---|---|
is_title | string | "" | Título escrito ao longo do eixo. Vazio = sem título, e sem espaço reservado para um. A dica e as cores de item que um identificador de eixo herda (is_tooltip, is_super_tooltip_*, il_accent, il_back_color, il_text_color…) não têm efeito num eixo |
id_min | double | NULL | Limite inferior imposto. Ganha aos dados e não é arredondado: quem escreve 0 quer 0. NULL (SetNull) não impõe nada: o eixo volta a seguir os seus dados, e um limite livre relê-se NULL (IsNull), nunca 0. Livre, um eixo de valores só inclui o zero se uma barra ou uma área assentar nele: cotações e linhas leem-se no seu próprio intervalo |
id_max | double | NULL | Limite superior imposto, mesma regra. O que o ultrapassa é cortado na borda do traçado |
id_step | double | 0 | Distância entre duas linhas de grelha, em valores. 0 = um passo redondo lido do intervalo |
ii_label_rotation | integer | 0 | Rotação das etiquetas deste eixo, em graus (-90 a 90) — nomes de categoria ou graduações de valores. Doze nomes de meses só cabem por baixo de um gráfico inclinados; quando ainda não cabem, o gráfico escreve um em cada N, sempre o primeiro e o último |
ib_separator | boolean | true | As suas linhas de grelha. Um eixo de categorias raramente precisa delas, um de valores quase sempre |
ii_section_count | integer | 0 | Quantas faixas e limiares este eixo carrega (só leitura) |
ib_logarithmic | boolean | false | Só eixos de valores: uma escala logarítmica, graduada por décadas (1, 10, 100…), cada década com a mesma altura — para números que abrangem várias ordens de grandeza. O zero e os valores negativos não têm lugar nela e não são desenhados |
is_format | string | "" | O formato deste eixo — as suas graduações, e as etiquetas e o painel das séries traçadas nele — por cima do is_format do gráfico: um montante de um lado, um número de encomendas do outro. Mesma sintaxe (#,##0, 0.0 "u"…). Vazio = o formato do gráfico |
Exemplos #
Ajustar a animação conforme o ecrã #
// 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 as linhas por trás de um ponto #
// 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)
Um painel 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)
Um gráfico em direto que 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)
Uma medida em falta, e o gráfico como imagem #
// 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")
Uma faixa e um objetivo no eixo dos 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)"
Um gráfico alimentado por um 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()
A cor de um ponto, um menu noutro #
// 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
Boas práticas #
- Ponha as categorias antes das séries. O seu número diz o que uma série deve conter; ao contrário não pode funcionar.
- Um segundo eixo justifica-se, não se sofre. Duas escalas no mesmo desenho enganam o olho: só o traga quando as unidades forem mesmo diferentes.
- Corte a animação num painel que se actualiza. Uma chegada que recomeça de cinco em cinco segundos nunca termina, e cansa em vez de ajudar.
- As barras partem do zero, e o componente cumpre-o: o zero entra no eixo assim que uma barra ou uma área assenta nele. Um gráfico de barras truncado exagera cada diferença. Linhas, nuvens e cotações leem-se no seu próprio intervalo.
- O gráfico mantém o sentido matemático numa aplicação da direita para a esquerda: categorias da esquerda para a direita, eixo dos valores à esquerda. Só a legenda
START/ENDsegue o sentido de leitura. - Empilhe para ler um total, justaponha para comparar. Não são dois estilos, são duas perguntas diferentes.
- Acrescente cada série num gráfico em direto:
of_append_categoriese depoisof_append_valuespara cada uma, com o mesmo máximo — uma série esquecida desliza para debaixo da categoria ao lado. - Um buraco não é um zero. Um valor NULL não é desenhado, nem etiquetado, nem clicável; um peso NULL deixa vazia a célula de um mapa de calor.
ue_point_clickeddá a ordem: use-a para abrir a lista exacta por trás desse ponto, não o ecrã de pesquisa.
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_count · of_keys_at · of_has | Percorrer o que o componente contém | 3.2 Os items |
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |
is_accessible_name · is_accessible_description | O nome e a descrição que um leitor de ecrã diz | 3.4 Propriedades e eventos opcionais |
Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.