Alterar o tamanho e o símbolo dos pontos do gráfico de dispersão no ScalaFX

Sampo Paukkonen

Eu quero fazer um programa de regressão linear que visualiza os dados para o usuário. Estou usando EJML para cálculos e ScalaFX para front end. Tudo está indo bem, mas quando eu ploto os dados usando o Gráfico de dispersão, a linha desenhada a partir dos dados é definida como retângulos que cobrem os pontos de dados originais. Gostaria de saber como posso alterar o tamanho, a forma e a transparência, etc. dos pontos traçados.

Quase todos os guias sobre JavaFX dizem que devo modificar o arquivo CSS (que não existe automaticamente) para estilizar meu gráfico. Não sei como fazer isso no ScalaFX ou mesmo se é possível fazer assim. Meu resultado de pesquisar todos os tutoriais possíveis foi infrutífero.

import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.chart.ScatterChart
import scalafx.collections.ObservableBuffer
import scalafx.scene.chart.NumberAxis
import scalafx.scene.chart.XYChart
import scalafx.scene.shape.Line
import org.ejml.simple.SimpleMatrix
import scala.math.pow
import scala.collection.mutable.Buffer


object Plotting extends JFXApp {
  /*
   * Below are some arbitrary x and y values for a regression line
   */
  val xValues = Array(Array(1.0, 1.0, 1.0, 1.0, 1.0, 1.0), Array(14.0, 19.0, 22.0, 26.0, 31.0, 43.0))
  val yValues = Array(Array(51.0, 57.0, 66.0, 71.0, 72.0, 84.0))
  val temp    = yValues.flatten
  val wrapper = xValues(1).zip(temp)
  /*
   * In the lines before stage what happens is that matrices for the x and y values are created, coefficients
   * for the regression line are calculated with matrix operations and (x, y) points are calculated for the 
   * regression line.
   */
  val X       = new SimpleMatrix(xValues).transpose
  val Y       = new SimpleMatrix(yValues).transpose
  val secondX = new SimpleMatrix(xValues(0).size, 2)
  for (i <- 0 until xValues(0).size) {
    secondX.set(i, 0, xValues(0)(i))
    secondX.set(i, 1, xValues(1)(i))
  }
  val invertedSecondX = secondX.pseudoInverse()
  val B = invertedSecondX.mult(Y)
  val graphPoints = Buffer[(Double, Double)]()
  for (i <- 0 to xValues(1).max.toInt) {
    graphPoints.append((i.toDouble, B.get(0, 0) + i * B.get(1, 0)))
  }

  stage = new JFXApp.PrimaryStage {
    title = "Demo"
    scene = new Scene(400, 400) {
      val xAxis = NumberAxis()
      val yAxis = NumberAxis()
      val pData = XYChart.Series[Number, Number](
        "Data",
        ObservableBuffer(wrapper.map(z => XYChart.Data[Number, Number](z._1, z._2)): _*))
      val graph = XYChart.Series[Number, Number](
        "RegressionLine",
        ObservableBuffer(graphPoints.map(z => XYChart.Data[Number, Number](z._1, z._2)): _*))
      val plot = new ScatterChart(xAxis, yAxis, ObservableBuffer(graph, pData))
      root     = plot
    }
  }
}
Mike Allen

Isso certamente não está tão bem documentado quanto poderia ser ... :-(

As folhas de estilo são normalmente colocadas no diretório de recursos do seu projeto. Se você estiver usando o SBT (recomendado), isso seria src/main/resources.

Neste exemplo, adicionei uma folha de estilo chamada MyCharts.cssa este diretório com o seguinte conteúdo:

/* Blue semi-transparent 4-pointed star, using SVG path. */
.default-color0.chart-symbol {
    -fx-background-color: blue;
    -fx-scale-shape: true;
    -fx-shape: "M 0.0 10.0 L 3.0 3.0 L 10.0 0.0 L 3.0 -3.0 L 0.0 -10.0 L -3.0 -3.0 L -10.0 0.0 L -3.0 3.0 Z ";
    -fx-opacity: 0.5;
}

/* Default shape is a rectangle. Here, we round it to become a red circle with a white
 * center. Change the radius to control the size.
 */
.default-color1.chart-symbol {
    -fx-background-color: red, white;
    -fx-background-insets: 0, 2;
    -fx-background-radius: 3px;
    -fx-padding: 3px;
}

color0será usado para a primeira série de dados (a linha de regressão), color1para a segunda (seus dados de dispersão). Todas as outras séries usam o estilo JavaFX padrão .

(Para obter mais informações sobre o uso de caminhos de gráficos vetoriais escaláveis ( SVG ) para definir formas personalizadas, consulte a seção relevante da especificação SVG .)

Para que esta folha de estilo seja usada pelo ScalaFX ( JavaFX ), você tem uma escolha de opções. Para aplicá-los globalmente, adicione-o à cena principal (que é o que fiz abaixo). Como alternativa, se cada gráfico precisar de um estilo diferente, você pode adicionar diferentes folhas de estilo a gráficos específicos. (Aliás, também adicionei o padrão inclui importação, pois isso evita muitos problemas de conversão de elemento JavaFX - ScalaFX ; caso contrário, não fiz alterações em suas fontes.)

import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.chart.ScatterChart
import scalafx.collections.ObservableBuffer
import scalafx.scene.chart.NumberAxis
import scalafx.scene.chart.XYChart
import scalafx.scene.shape.Line
import org.ejml.simple.SimpleMatrix
import scala.math.pow
import scala.collection.mutable.Buffer

object Plotting extends JFXApp {
  /*
   * Below are some arbitrary x and y values for a regression line
   */
  val xValues = Array(Array(1.0, 1.0, 1.0, 1.0, 1.0, 1.0), Array(14.0, 19.0, 22.0, 26.0, 31.0, 43.0))
  val yValues = Array(Array(51.0, 57.0, 66.0, 71.0, 72.0, 84.0))
  val temp    = yValues.flatten
  val wrapper = xValues(1).zip(temp)
  /*
   * In the lines before stage what happens is that matrices for the x and y values are created, coefficients
   * for the regression line are calculated with matrix operations and (x, y) points are calculated for the 
   * regression line.
   */
  val X       = new SimpleMatrix(xValues).transpose
  val Y       = new SimpleMatrix(yValues).transpose
  val secondX = new SimpleMatrix(xValues(0).size, 2)
  for (i <- 0 until xValues(0).size) {
    secondX.set(i, 0, xValues(0)(i))
    secondX.set(i, 1, xValues(1)(i))
  }
  val invertedSecondX = secondX.pseudoInverse()
  val B = invertedSecondX.mult(Y)
  val graphPoints = Buffer[(Double, Double)]()
  for (i <- 0 to xValues(1).max.toInt) {
    graphPoints.append((i.toDouble, B.get(0, 0) + i * B.get(1, 0)))
  }

  stage = new JFXApp.PrimaryStage {
    title = "Demo"
    scene = new Scene(400, 400) {

      // Add our stylesheet.
      stylesheets.add("MyCharts.css")

      val xAxis = NumberAxis()
      val yAxis = NumberAxis()
      val pData = XYChart.Series[Number, Number](
        "Data",
        ObservableBuffer(wrapper.map(z => XYChart.Data[Number, Number](z._1, z._2)): _*))
      val graph = XYChart.Series[Number, Number](
        "RegressionLine",
        ObservableBuffer(graphPoints.map(z => XYChart.Data[Number, Number](z._1, z._2)): _*))
      val plot = new ScatterChart(xAxis, yAxis, ObservableBuffer(graph, pData))
      root     = plot
    }
  }
}

Para obter mais informações sobre as opções de formatação CSS disponíveis (alterar formas, cores, transparência, etc.), consulte o JavaFX CSS Reference Guide .

O resultado é o seguinte: Imagem do gráfico, com pontos personalizados.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Alterar as formas dos pontos no gráfico de dispersão

gráfico de dispersão com pontos baseados na cor e tamanho do fator no ggplot 2

Faça a cor E o marcador dos pontos de dispersão do gráfico de bokeh dependentes dos valores do dataframe

Configurando o tamanho dos pontos no gráfico de dispersão no Seaborn com Python

Existe uma função R que pode me ajudar a modificar o tamanho dos pontos do gráfico de dispersão em um gráfico de Paris?

Alterar a cor dos pontos no gráfico de dispersão para diferentes valores fictícios

Como posso alterar a forma dos pontos em um gráfico de dispersão?

Pandas Matplotlib: Como alterar a forma e o tamanho da legenda no gráfico de dispersão?

Pandas Matplotlib: Como alterar a forma e o tamanho da legenda no gráfico de dispersão?

Pontos do gráfico de dispersão em d3 não são renderizados

Gráfico de dispersão dos pandas por categoria e tamanho de ponto

Gráfico de dispersão dos pandas por categoria e tamanho de ponto

Como alterar o tamanho do ponto para regplot (), função de gráfico de dispersão do seaborn (python)

Pontos de cores do gráfico de dispersão Python

Redimensionar pontos do gráfico de dispersão no ggplot

Altere o tamanho e a forma do gráfico de dispersão dinamicamente - LightningChart JS

Alterar as cores dos pontos em apenas alguns dados armazenados em um gráfico de dispersão de lista

tamanho do marcador do gráfico de dispersão pyplot

Tamanho e cor no gráfico de dispersão Julia

Gráfico de dispersão do Python. Tamanho e estilo do marcador

Gráfico de dispersão do Python. Tamanho e estilo do marcador

Gráfico de dispersão com tamanho, marcador e cor diferentes do dataframe do pandas

Como altero o tamanho do gráfico para um gráfico de dispersão do mar?

Rotulagem do gráfico de dispersão do Python Matplotlib nos pontos do gráfico

Problema de gráfico de dispersão ao mudar a cor dos pontos com a função if

R: altera o tamanho dos pontos em um gráfico

Alterar as cores no gráfico de dispersão

Alterar o tamanho da bolha no gráfico de dispersão para c3.js

Os pontos do gráfico de dispersão D3 não são exibidos corretamente

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo