8 Aplicando estruturas de controle no JSPlotly
Agora o mais chique…aplicar as estruturas de controle no próprio aplicativo ! Relembrando o quadro de estruturas..
// Condicionais
if // executa um bloco de código se uma condição for verdadeira
else // executa um bloco de código se a condição do if for falsa
else if // verifica múltiplas condições em sequência
switch // executa diferentes blocos de código com base no valor de uma expressão
// Repetição
for // laço com contador: inicialização; condição; atualização — ideal quando o nº de iterações é conhecido
while // laço por condição: repete enquanto a condição for verdadeira (condição testada ANTES de cada volta)
do while // laço pós-teste: executa AO MENOS uma vez e repete enquanto a condição for verdadeira (testada DEPOIS)
8.1 Estruturas condicionais no JSPlotly
Para as estruturas condicionais, seguem alguns exemplos.
8.1.1 IF
// IF
const x = [0, 1, 2]; // experimente tirar um ponto e ver o resultado
const y = [0, 2, 4];
let mode = "lines+markers";
if (x.length < 3) { // condição
mode = "markers"; // ação se verdadeiro
}
Plotly.newPlot("grafico", [{ x, y, mode, name: "dados" }], { title: "if: linhas só com >= 3 pontos" });
Nesse exemplo, desenha linhas apenas se houver pontos suficientes; caso contrário, só marcadores. Teste no JSPlotly vivo que segue, delete(ando) o código padrão e o substituindo pelo acima.
Observe que, se retirar qualquer ponto, o traço do gráfico se converterá para pontos, apenas (marker).
8.1.2 IF…ELSE
const x = Array.from({length: 21}, (_, i) => i);
const y = x.map(v => v*v*0.1); // cresce
const maxY = Math.max(...y);
let layout = { title: "if/else: trava o eixo se y for grande" };
if (maxY > 15) {
layout.yaxis = { range: [0, 15] }; // verdadeiro → trava
} else {
layout.yaxis = { autorange: true }; // falso → auto
}
Plotly.newPlot("grafico", [{ x, y, mode: "lines" }], layout);
Nesse outro exemplo, se a máxima de y ultrapassar o limite, o código fixa o range do eixo; senão, deixa como auto. Experimente mudar o valor de 15 do eixo para valores menores, e verá que o eixo y não ultrapassa 15. Por outro lado, experimente colocar um teto de 150 em maxY, e perceberá que o eixo agora ajusta-se automaticamente.
8.1.3 ELSE IF
const x = [0, 1, 2, 3];
const y = [2, 2.1, 2.2, 2.3]; // quase horizontal → slope ~ 0
// estimativa simples da inclinação final
const slope = (y[y.length-1] - y[0]) / (x[x.length-1] - x[0]);
let color, titulo;
if (slope > 0.05) {
color = "green"; titulo = "Crescente";
} else if (slope < -0.05) {
color = "red"; titulo = "Decrescente";
} else {
color = "orange"; titulo = "Quase constante";
}
Plotly.newPlot("grafico", [{
x, y, mode: "lines+markers",
line: { color }, marker: { color }
}], { title: `else if: tendência ${titulo}` }); Aqui a cor do traço dependerá da inclinação média dos pontos (const slope), incidindo também no título do gráfico. Para obter inclinações que correpondam às 3 situações do código, basta variar para valores significativos negativos (descendente), positivos (ascendente) ou muito próximos (quase constante).
8.1.4 SWITCH
const tipo = "barras"; // troque entre "dispersao", "barras", "box"
let data, layout = { title: `switch: tipo = ${tipo}` };
switch (tipo) {
case "dispersao":
data = [{ x: [0,1,2,3], y: [1,4,9,16], mode: "markers", name: "pontos" }];
break;
case "barras":
data = [{ x: ["A","B","C"], y: [5, 3, 7], type: "bar", name: "contagens" }];
break;
case "box":
data = [{ y: [1,2,2,3,10], type: "box", name: "distribuição" }];
break;
default:
data = [{ x: [0,1], y: [0,1], mode: "lines", name: "fallback" }];
}
Plotly.newPlot("grafico", data, layout);
Aqui o gráfico é gerado por opções introduzidas na constante tipo do código, perfazendo barras, dispersão ou box-plot.
8.2 Estrutura de repetição
8.2.1 FOR
const x = [], y = [];
for(let i=0; i<=20; i++){
x.push(i);
y.push(i*i);
}
Plotly.newPlot("grafico", [{x, y, mode:"lines+markers", name:"y = x^2"}],
{title:"for (basico)"} );
No exemplo é solicitado que o código gere pontos no intervalo de x entre 0 e 20, aplicando-se a função y=x^2 (“qualquer semelhança é mera coincidência”).
8.2.1.1 FOR…IN
const base = [1,2,3,4,5];
const x = [...base];
const y = new Array(base.length);
for (const i in base){ // i são indices: "0","1","2"...
y[i] = base[i] * 10;
}
Plotly.newPlot("grafico", [{x, y, type:"bar", name:"base*10"}],
{title:"for...in (indices)"} );
O exemplo itera sobre indices (chaves) do array e multiplica os valores.
8.2.1.2 FOR…OF
const x = Array.from({length: 21}, (_, i) => i); // 0..20
const y = [];
for (const v of x){ // v sao os valores de x
y.push(0.5*v + 1);
}
Plotly.newPlot("grafico", [{x, y, mode:"lines", name:"y = 0.5x + 1"}],
{title:"for...of (valores)"} ); Aqui o exemplo percorre valores e calcula “y = 0.5*x + 1”.
8.2.2 WHILE
const x = [], y = [];
let i = 0, soma = 0;
while (soma < 50){
x.push(i);
soma += i; // acumulando
y.push(soma);
i++;
}
Plotly.newPlot("grafico", [{x, y, mode:"lines+markers", name:"acumulo"}],
{title:"while (acumulo ate limite)"} ); Já nesse exemplo, o código permite uma soma cumulativa ate atingir o limite (ex.: cresce até y >= 50).
8.2.3 DO…WHILE
const passos = 20;
const x = [], y = [];
let i = 0, pos = 0;
do {
x.push(i);
// passo aleatorio: -1, 0 ou +1
pos += Math.sign(Math.random() - 0.5);
y.push(pos);
i++;
} while (i <= passos);
Plotly.newPlot("grafico", [{x, y, mode:"lines+markers", name:"random walk"}],
{title:"do...while (pelo menos uma vez)"} ); Neste último exemplo para laços de repetição, o código garante pelo menos uma iteracão.