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.
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
(lldb) po _viewPortHandler.touchMatrix
▿ CGAffineTransform
(lldb) po _matrixOffset
▿ CGAffineTransform
(lldb) po _matrixValueToPx.concatenating (_viewPortHandler.touchMatrix) .concatenating (_matrixOffset)
▿ CGAffineTransform
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
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.