Charts: <error>: CGAffineTransformInvert: matriz singular</error>

Criado em 5 mar. 2016  ·  35Comentários  ·  Fonte: danielgindi/Charts

Estou recebendo este erro repetidamente com um HorizontalBarChartView:
<Error>: CGAffineTransformInvert: singular matrix.

Não há nada de especial no meu código. Estou usando um HorizontalBarChartView no OSX com tamanho de 175x394 pontos. Não é obstruído por nenhuma outra visão. Eu inicializo o gráfico com:

<strong i="9">@IBOutlet</strong> weak var horizontalBarChart: HorizontalBarChartView!
let data = BarChartData(xVals: [1.0, 3.0, 5.0, 7.0, 8.0])
horizontalBarChart.data = data
horizontalBarChart.notifyDataSetChanged()

e, em seguida, é atingido com o erro várias vezes por segundo. Alguma ideia do que esta causando isso?

A linha 206 em ChartTransformer é o único lugar em que CGAffineTransformInvert é chamado.

bug

Comentários muito úteis

Isso não resolve necessariamente o problema subjacente, mas uma verificação da singularidade da matriz evita a mensagem de erro. Substituí pixelToValueMatrix em ChartTransformer por isso para suprimir o erro.

public var pixelToValueMatrix: CGAffineTransform
{
  guard valueToPixelMatrix.a*valueToPixelMatrix.d-valueToPixelMatrix.b*valueToPixelMatrix.c != 0 else {
    // Matrix is singular, return the matrix itself
    return valueToPixelMatrix
  }
  return CGAffineTransformInvert(valueToPixelMatrix)
}

Todos 35 comentários

Isso não resolve necessariamente o problema subjacente, mas uma verificação da singularidade da matriz evita a mensagem de erro. Substituí pixelToValueMatrix em ChartTransformer por isso para suprimir o erro.

public var pixelToValueMatrix: CGAffineTransform
{
  guard valueToPixelMatrix.a*valueToPixelMatrix.d-valueToPixelMatrix.b*valueToPixelMatrix.c != 0 else {
    // Matrix is singular, return the matrix itself
    return valueToPixelMatrix
  }
  return CGAffineTransformInvert(valueToPixelMatrix)
}

Bem, precisamos verificar os valores da matriz, porque é singular, geralmente os dados têm alguns problemas e fazem com que o cálculo da matriz dê errado.
Você pode imprimir chartXMin, deltaX, deltaY, chartYMin e _viewPortHandler.contentRect) e os valores _matrixValueToPx.
também imprima getTransformer(.Left) ou getTransformer(.Right) dependendo de qual eixo y você está usando.
Se possível, use seus dados e ChartsDemo para reproduzi-los

Percebi que meus rótulos do eixo X não estão aparecendo. Talvez esse seja o problema?

não posso dizer com certeza agora. Preciso que você depure para ver o que está acontecendo. você também pode experimentar o ChartsDemo.

Você tem um transformador com uma matriz singular, provavelmente para o eixo X. Isso significa que algo é que sua configuração deu terrivelmente errado ...
Mas, como você não respondeu a @ liuxuan30 desde março, acho que você já descobriu e corrigiu.

Não, como eu disse, é um simples HorizontalBarChartView e tenho certeza que o erro pode ser reproduzido. Você ainda tem um bug em seu código, mas eu simplesmente não tenho tempo para ajudar vocês a consertá-lo e encontrei uma solução alternativa para o curativo.

Fechar o problema não corrige o bug, mas talvez algum dia alguém vá usar este Framework e reabri-lo quando começar a ser bombardeado com mensagens de erro.

@ serk1 bem, essa não é uma atitude positiva ... Estamos fechando questões que as pessoas não respondem há muito tempo - e @ liuxuan30 aqui estava tentando ajudá-lo.
Como eu disse - o único caso em que essa mensagem será cuspida - é quando seu xAxis é inválido e você nem deveria ver os rótulos xAxis.
Se você é um usuário desta biblioteca e deseja ter uma melhor experiência, pode ajudar a corrigir esse bug.

A demonstração OSX não se destina a dispositivos iOS. Verifique sua configuração novamente.

@danielgindi Dei uma olhada na instrução novamente, descobri que @ serk1 está apenas alimentando barChartData com apenas valores x, nenhum conjunto de dados.
Usar ChartsDemo também pode imprimir a mesma mensagem de erro, e posso apenas ver os rótulos do eixo y padrão (0-1), sem os valores do eixo x.

Eu olhei para o código e descobri no calcMinMax () do BarChartView:

// increase deltax by 1 because the bars have a width of 1
_xAxis.axisRange += 0.5

// extend xDelta to make space for multiple datasets (if ther are one)
_xAxis.axisRange *= Double(data.dataSetCount) <----- BOOM

então _xAxis.axisRange é 0 depois disso, e leva a scaleX a 0. então a sigularidade disparada ao traduzir para pixelToValueMatrix. Qualquer zoom neste momento tem um comportamento inesperado.

Parece que oferecemos suporte apenas para feed xVals da declaração da API. O que você acha que é uma solução adequada? Evitamos qualquer zoom / rolagem neste caso, ou tornamos um padrão (se dataSetCount for 0, apenas não multiplique), ou apenas imprimiremos avisos?

Uma correção adequada pode ser _xAxis.axisRange *= Double(data.dataSetCount ?? 1)

ah sim, eu estava apenas editando - o único problema é, neste caso, os rótulos de valor x são uma bagunça. Eles são renderizados na mesma posição.
BTW, não pode ser data.dataSetCount ?? 1 , ?? está verificando nulo, não 0:

(lldb) po Double(data.dataSetCount ?? 1)
0.0

Droga. Vou dar uma olhada :-)

ter que comer ... Eu só estava pensando em lidar com isso como barras normais

@danielgindi Eu
eu encontrei

position.x = CGFloat(i * step) + CGFloat(i) * groupSpace + groupSpace / 2.0

é a parte chave para ter certeza de que está corretamente renderizado na posição x certa, temos que fazer step = 1 se o conjunto de dados for 0, e groupSpace para 0,8 também.

Este tipo de código é distribuído em vários lugares, como drawLabels no gráfico de barras x renderizador do eixo, lowestVisibleXIndex/highestVisibleXIndex , calcMinMax na visualização do gráfico de barras.
Eles têm o mesmo padrão, mas pequenas diferenças. Antes de corrigirmos isso, podemos querer torná-lo único, caso contrário, teremos que alterá-lo em todos os lugares.

Só não sei onde colocar esse padrão. Se você tiver tempo, por favor ajude nisso. Eu tenho que trabalhar agora.

Recebi o mesmo erro ao adicionar pontos dinamicamente a um conjunto de dados vazio e chamar addXValue () depois de chamar addEntry () para corrigi-lo.

Entendi ao enviar matriz de dados com um ponto de valor, [0].

@klanderson 👍: suas falas resolvem as minhas.

o modo de exibição - autoScaleMinMaxEnabled = true - parece causar esse problema para mim ao redesenhar os gráficos, definir como false não dará mais esse problema. O dimensionamento com conjuntos de dados vazios causa o problema?

Eu também tenho esse problema, mas depurá-lo com instruções de impressão ou pontos de interrupção faz com que o comportamento volte ao normal. Algum tipo de problema de simultaneidade, talvez?

Não deve haver problemas de simultaneidade. Eu acho

Sem resposta por um longo tempo e talvez inválido. Fechando

Coloquei alguns gráficos em um controlador de exibição de página e agora recebo este erro em um controlador com um gráfico "Sem dados" vazio simplesmente vinculando a exibição ... estranho. No entanto, o aplicativo não trava e tudo parece estar funcionando bem na tela.

Ainda assim, talvez esse problema deva ser mantido em aberto?

@AndreaPisoni Acho que não, como você não tem dados, deve parar de renderizar, testei o gráfico de barras ChartsDemo com dados nulos, não imprime nada

Você já tentou ter alguns gráficos dentro de um controlador de visualização de página?

Na sexta-feira, 5 de maio de 2017 às 16h33, Xuan [email protected] escreveu:

@AndreaPisoni https://github.com/AndreaPisoni Acho que não, pois
você não tem dados, ele deve parar de renderizar, testei o gráfico de barras ChartsDemo
com dados nulos, não imprime nada

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/danielgindi/Charts/issues/802#issuecomment-299410960 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AN_wJi0KSapg6tbMsQTcv1M5ryFVsf3Iks5r2t7MgaJpZM4Hp4wF
.

Se você tiver novos problemas, abra um novo tópico para rastrear.

@klanderson Obrigado! Sua solução funcionou para mim.

O mesmo problema ocorreu comigo também. E a solução não se encaixa.
No meu caso, há alguns dados normais dentro do LineChart e, se eu aumentar o zoom no gráfico, ele travará.
Parece que isso acontece em func computeAxis(min: Double, max: Double, inverted: Bool) , calculando o p1 e o p2. A chamada do transformador produz o erro e retorna NaN, que falha em computeAxisValues posteriormente.

Estou tendo um acidente na linha 117 em AxisRendererBase em computeAxisValues
let intervalMagnitude = pow(10.0, Double (Int (log10 (intervalo)))). RoundedToNextSignficant () `
Erro fatal: o valor duplo não pode ser convertido em int porque é infinito ou NaN
p1 e p2 em XAxisRenderer em computeAxis na linha 37,38 estão retornando NaN que altera os valores mínimo e máximo para NaN

`(lldb) po _matrixValueToPx
▿ CGAffineTransform

  • a: 14,2508951822917
  • b: 0,0
  • c: -0,0
  • d: -49.6888020833333
  • tx: 0.0
  • ty: 0.0

(lldb) po _viewPortHandler.touchMatrix
▿ CGAffineTransform

  • a: 1.79769313486232e + 308
  • b: 0,0
  • c: 0,0
  • d: 1,0
  • tx: nan
  • ty: nan

(lldb) po _matrixOffset
▿ CGAffineTransform

  • a: 1.0
  • b: 0,0
  • c: 0,0
  • d: 1,0
  • tx: 16.4892578125
  • ty: 159.06640625

(lldb) po _matrixValueToPx.concatenating (_viewPortHandler.touchMatrix) .concatenating (_matrixOffset)
▿ CGAffineTransform

  • a: inf
  • b: nan
  • c: -0,0
  • d: -49.6888020833333
  • tx: nan
  • ty: nan`

então min e max são NaN e a chamada para computeAxisValues ​​trava

Consigo fazer isso ocorrer de maneira consistente se eu começar com um conjunto de dados vazio e, em seguida, adicionar rapidamente outro dado antes de deixar o gráfico terminar

Estou recebendo este erro repetidamente com um LineChartView:
<Error>: CGAffineTransformInvert: singular matrix.

Estou usando para exibir a velocidade. Mas até qualquer movimento ele não atualizará ou aumentará mais minha velocidade. É por isso que meus dados não estarão disponíveis para exibição. Mas depois que o temporizador predefinido termina, ocorre este erro.

Não consegui encontrar a solução.

Mesmo problema como @ dipesh1604

Depois de atualizar para o Swift 3, encontrei a mesma coisa. Teve sorte @ dipesh1604 ?

Mesmo problema que @ dipesh1604
@ liuxuan30 @danielgindi Alguma orientação?

Mesmo problema...

Ainda estou vendo isso, usando gráficos agrupados em UIViewRepresentable conforme https://medium.com/@zzzzbh/plotting -in-ios-using-charts-framework-with-swiftui-222034a2bea6

Também estou tendo esse problema como @gesabo ao usar gráficos agrupados em UIViewRepresentable

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

cilasgimenez picture cilasgimenez  ·  4Comentários

brytnvmg picture brytnvmg  ·  4Comentários

valeIT picture valeIT  ·  3Comentários

deepumukundan picture deepumukundan  ·  3Comentários

sjdevlin picture sjdevlin  ·  3Comentários