FLOT: Como fazer diferentes pontos coloridos nas mesmas séries de dados, conectadas por uma linha?

StackOverflow https://stackoverflow.com/questions/2283346

  •  21-09-2019
  •  | 
  •  

Pergunta

Acho que posso ter tropeçado em uma limitação de flot, mas não tenho certeza. Estou tentando representar uma única série de dados ao longo do tempo. O "estado" dos itens é representado no eixo y (existem 5 deles) e o tempo está no eixo x (os itens podem alterar os estados ao longo do tempo). Eu quero que o gráfico tenha pontos e linhas conectando esses pontos para cada série de dados.

Além de rastrear o estado de um item ao longo do tempo, eu também gostaria de representar seu "status" em qualquer um dos pontos específicos. Isso eu gostaria de fazer mudando a cor dos pontos. O que isso significa é que um único item pode ter status diferentes em momentos diferentes, o que significa uma única série de dados, preciso de uma linha que conecte pontos diferentes (pontos) de cores diferentes.

A única coisa que vi até agora é a capacidade de especificar a cor para tudo pontos em um determinado conjunto de dados. Alguém sabe se há uma maneira de especificar cores individualmente?

Obrigado.

Foi útil?

Solução 2

Com 3 visualizações, pode não valer a pena responder minha própria pergunta, mas aqui está a solução:

Meu problema original era como plotar uma conjunto de dados de pontos e uma linha, mas com cada ponto sendo uma cor que eu especifique.

O flot apenas permite especificar cores dos pontos no nível de dados, o que significa que cada cor devo Seja suas próprias conjuntos de dados. Com isso em mente, a solução é fazer uma única conjunto de dados para cada cor e desenhar esse conjunto de dados com apenas pontos e sem linhas. Então eu devo fazer um separado DataSeries que são todos os pontos que eu quero conectados pela linha e desenham esse sem pontos e apenas uma linha.

Então, se eu quiser mostrar uma linha passando por 5 pontos com cinco cores diferentes, preciso de 6 conjuntos de dados: 5 para cada ponto e 1 para a linha que as conecta. O flot simplesmente atrai tudo um no outro, e acredito que há uma maneira de especificar o que é mostrado na parte superior (para garantir que os pontos sejam mostrados acima da linha).

Outras dicas

Lá vai você cara. Você precisa usar um gancho de empate.

$(function () {

  var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]];
  var colors = ["#cc4444", "#ff0000", "#0000ff", "#00ff00"];
  var radius = [10, 20, 30, 40];

  function raw(plot, ctx) {
    var data = plot.getData();
    var axes = plot.getAxes();
    var offset = plot.getPlotOffset();
    for (var i = 0; i < data.length; i++) {
        var series = data[i];
        for (var j = 0; j < series.data.length; j++) {
            var color = colors[j];
            var d = (series.data[j]);
            var x = offset.left + axes.xaxis.p2c(d[0]);
            var y = offset.top + axes.yaxis.p2c(d[1]);
            var r = radius[j];                
            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.arc(x,y,r,0,Math.PI*2,true);
            ctx.closePath();            
            ctx.fillStyle = color;
            ctx.fill();
        }    
    }
  };  

    var plot = $.plot(
          $("#placeholder"),
          [{ data: d2, points: { show: true } }],
          { hooks: { draw  : [raw] } }
  );  
});

Na verdade, não é muito difícil adicionar um recurso ao flot que voltaria ao seu código para obter a cor de cada ponto. Levei cerca de uma hora e não sou um especialista em JavaScript em nenhuma medida.

Se você olhar para drawSeriesPoints(), tudo que você precisa fazer é passar um parâmetro de retorno de chamada para plotPoints() que será usado para definir ctx.strokeStyle. Eu adicionei uma opção chamada series.points.colorCallback, e drawSeriesPoints() ou usa isso ou uma função simples que sempre retorna a série.color.

Um ponto complicado: o índice que você deve passar para o seu retorno de chamada provavelmente não é o i dentro plotPoints(), mas sim i/ps.

Espero que isto ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top