Posso forçar a largura da barra a ser maior?
Ainda assim, o conjunto de dados com 1 entidade funciona muito bem:
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;
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:
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.
@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;
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: