Charts: Largura da barra

Criado em 3 mai. 2017  ·  21Comentários  ·  Fonte: danielgindi/Charts

Posso forçar a largura da barra a ser maior?
screen shot 2017-05-03 at 23 08 03

Ainda assim, o conjunto de dados com 1 entidade funciona muito bem:
screen shot 2017-05-03 at 23 36 14

Comentários muito úteis

@ billylo1 Esse é um bom ponto. Preciso cortar algumas décadas do meu valor inicial com certeza: D
double ti = [date timeIntervalSince1970];
@aelam Funcionou bem para mim. Mas não me lembro quando essa solução foi quebrada e em que circunstâncias.
Minha solução final corrigiu o problema, manipulando os valores da barra:

BarChartData* data = [[BarChartData alloc] initWithDataSet:dataSet];

double xMin = [dataSet xMin]; // seconds since 1970x
double xMax = [dataSet xMax]; // seconds since 1970 + few days
double w = MAX(1, xMax - xMin); // if we have 7 days in xaxis, then its 7 * 24 * 60 * 60
double spacing = 0.05; // 5% of barWidth
double barWidth = w / [dataSet values].count - (spacing * w / ([dataSet values].count + 1)); // actual bar width
data.barWidth = barWidth;
[_chartView setFitBars:YES];

xaxis.spaceMin = barWidth / 10.0;
xaxis.spaceMax = barWidth / 10
xaxis.xOffset = barWidth;

_chartView.data = data;

screenshot_20170807_103654

Todos 21 comentários

Olá @zykis :

Em primeiro lugar, defina sua barWidth para o BarChartDataSet:

chartData.barWidth = defaultbarwidth // I Put is as 0.4

Então, o que você pode fazer é criar um Outlet para a largura da restrição do gráfico como este:
(Arraste do Storyboard)
<strong i="12">@IBOutlet</strong> weak var layoutBarChartWidth: NSLayoutConstraint!

Então você pode definir a largura do gráfico de acordo com a quantidade de dados que você tem

            let dataBars = <YOUR DATA OBJECTS>
            let realBarWidth = 20.0
            // Chart Width:
            let fullWidth = CGFloat(realBarWidth*Double(dataBars.count))
            layoutBarChartWidth.constant = max(fullWidth, view.frame.size.width)

Espero que isto ajude :-)

Obrigado, @hernanarber !
Vou tentar esta noite, mas ainda tenho algumas perguntas:
1) Não consigo encontrar a propriedade barWidth na classe BarChartDataSet. Mesmo inspecionando o arquivo IBarChartDataSet.swift mostra apenas "barBorderWidth", "barBorderColor" etc. Pode ser que ele foi removido da nova API?
2) Eu declarei IBOutlets de diferentes objetos de IU em meu Storyboard, mas para NSLayoutConstraint. Como ele pode ser realmente arrastado com ctrl do Storyboard, se não é um herdeiro UIView? Quer dizer, se eu ctrl e arrasto qualquer ponto do BarChartView, o IB irá sugerir que eu crie apenas o outlet BarChartView

A propriedade .barWidth não faz parte do ChartDataSet, mas do BarChartData :-)
let chartData = BarChartData(dataSet: chartDataSet)
Tente

Para a restrição Vá para o EXPLORER no Storyboard para que você possa Ctrl + Arraste a restrição

@hernanarber oh, cara!
Muito obrigado !!
Vou tentar esta solução hoje

definir o alcance visível é o que você quer
verifique o BarLineChartViewBase.swift

     open func setVisibleXRange(minXRange: Double, maxXRange: Double)

@aelam Oh, obrigado! Vou tentar isso.
Embora este método avalia internamente minScale e maxScale para viewportHandler.
Acho que a melhor maneira de lidar com esse comportamento é entender onde esses valores (barWidth) estão sendo avaliados.

@aelam Você pode me explicar mais sobre isso?

Acho que é disso que precisamos ...

Obrigado :-)

@hernanarber
/// Limits the maximum and minimum value count that can be visible by pinching and zooming. /// /// e.g. minRange=10, maxRange=100 no less than 10 values and no more that 100 values can be viewed /// at once without scrolling. /// /// If you call this method, chart must have data or it has no effect. open func setVisibleXRange(minXRange: Double, maxXRange: Double) { let minScale = _xAxis.axisRange / maxXRange let maxScale = _xAxis.axisRange / minXRange _viewPortHandler.setMinMaxScaleX( minScaleX: CGFloat(minScale), maxScaleX: CGFloat(maxScale)) }

Isso é o que a fonte nos diz

pode ser fechado agora

Bem, BarChartData.barWidth não ajuda aqui.
As manipulações com setXVisibleRange também não podem mudar a situação. Eu acredito, está conectado com enormes valores de x de carimbos de data / hora. Alguma ideia de onde é calculado nas fontes?
Timestamps são usados ​​desde 1970

Jogado com ChartsDemo, está funcionando:

        BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets];
        [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]];

        data.barWidth = 1.0f;

        _chartView.data = data;

image

Você tem uma entidade de largura total apenas porque a largura do eixo X é igual a 1,0. Apenas uma coincidencia.
A coisa é ChartBarData.barWidth é o valor POINT-BASED, onde a largura do eixo X = [dataSet xMax] - [dataSet xMin]. Você pode testá-lo definindo valores de entidades com e1 (x = 0, y = 1) e e2 (x = 1000, y = 0,7) e barWidth = 1;

@zykis
Não acho que seja uma boa solução,
A largura da barra é uma porcentagem,
O que você precisa fazer é controlar o alcance visível do xAxis.
Por exemplo,
Se o intervalo visível do xAxis for 0,100 e a largura da barra for 0,8
Então, a largura total do pixel de uma entrada é chartWidth / 100, e a largura do pixel da barra é chartWidth / 100 * barWidth.

Não acho bom que você altere barWidth dinamicamente. A parte dataSet uma vez é definida e, em seguida, concluída. Então cuide da vista. A visualização trata da largura de uma barra inteira. Para abordar isso, defina um visibleRange apropriado.

发 自我 的 iPhone

在 2017 年 5 月 6 日 , 上午 6: 36 , zykis [email protected]写道 :

Você tem uma entidade de largura total apenas porque a largura do eixo X é igual a 1,0. Apenas uma coincidencia.
A coisa é ChartBarData.barWidth é o valor POINT-BASED, onde a largura do eixo X = [dataSet xMax] - [dataSet xMin]. Você pode testá-lo definindo valores de entidades com e1 (x = 0, y = 1) e e2 (x = 1000, y = 0,7) e barWidth = 1;

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Eu acho que você tem dois problemas,
Uma é deixar a barra mais larga,
Um é estreitar a barra.

Se você quiser que a barra seja estreita. Você pode tentar definir barWidth = 0 e borderwidth = 3

发 自我 的 iPhone

在 2017 年 5 月 4 日 , 上午 4:34 , zykis [email protected]写道 :

Posso evitar que a largura da barra seja maior?

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Tentei definir o intervalo de visibilidade:
barChartView.setVisibleXRange(minXRange: 0.0, maxXRange: 5.0)

Mas, como resultado, a largura de barra está mudando dependendo da quantidade de barras, o que eu queria era uma largura de barra CONSTANTE, independentemente da quantidade de dados no gráfico :-(

@aelam
Bem, na verdade a largura da barra não está em PERCENTAGENS, mas em PONTOS.
BarChartRenderer. swift: 71 prepareBuffer ()

let barWidthHalf = barData.barWidth / 2.0
let left = CGFloat(x - barWidthHalf)
let right = CGFloat(x + barWidthHalf)
barRect.origin.x = left
barRect.size.width = right - left
barRect.origin.y = top
barRect.size.height = bottom - top

O CGRect está dimensionando os elementos em pontos, não em porcentagens. Portanto, é apenas um engano.

Mas, como o renderizador está calculando a esquerda e a direita conforme mencionado acima, agora eu tenho a primeira e a última barras cortadas pela metade:
screenshot_20170510_161407
Acho que preciso cavar nos deslocamentos da janela de visualização e defini-los iguais ou mais, depois a metade da largura da barra

Encontrei exatamente o mesmo problema com a primeira / última barra cortada ao meio e problemas de barWidth (também tenho timeIntervalSince1970 como xValues.)

Por fim, obtive o efeito desejado, armazenando # de dias desde a primeira barra como xValues; e usar meu formatador personalizado para converter xValue de volta em uma String.

Espero que isto ajude.

image

image

@zykis definir o xAxisMin para -0,5 se o minXValue atual for 0, então ele não seria cortado, o mesmo que maxValue
e a unidade desses -0,5, 0, 0,5 é baseada no ponto e não no pixel, eu disse porcentagem antes. Mas agora acho que você sabe o que quero dizer agora.

@zykis talvez você possa tentar manter todos os PONTOS nos mesmos pixels todas as vezes, então você pode ter um resultado constante é o que eu quis dizer

@ billylo1 Esse é um bom ponto. Preciso cortar algumas décadas do meu valor inicial com certeza: D
double ti = [date timeIntervalSince1970];
@aelam Funcionou bem para mim. Mas não me lembro quando essa solução foi quebrada e em que circunstâncias.
Minha solução final corrigiu o problema, manipulando os valores da barra:

BarChartData* data = [[BarChartData alloc] initWithDataSet:dataSet];

double xMin = [dataSet xMin]; // seconds since 1970x
double xMax = [dataSet xMax]; // seconds since 1970 + few days
double w = MAX(1, xMax - xMin); // if we have 7 days in xaxis, then its 7 * 24 * 60 * 60
double spacing = 0.05; // 5% of barWidth
double barWidth = w / [dataSet values].count - (spacing * w / ([dataSet values].count + 1)); // actual bar width
data.barWidth = barWidth;
[_chartView setFitBars:YES];

xaxis.spaceMin = barWidth / 10.0;
xaxis.spaceMax = barWidth / 10
xaxis.xOffset = barWidth;

_chartView.data = data;

screenshot_20170807_103654

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

Questões relacionadas

heumn picture heumn  ·  3Comentários

cilasgimenez picture cilasgimenez  ·  4Comentários

newbiebie picture newbiebie  ·  3Comentários

kirti0525 picture kirti0525  ·  3Comentários

coop44483 picture coop44483  ·  3Comentários