Charts: Ширина штанги

Созданный на 3 мая 2017  ·  21Комментарии  ·  Источник: danielgindi/Charts

В любом случае я могу увеличить ширину полосы?
screen shot 2017-05-03 at 23 08 03

Тем не менее, набор данных с одной сущностью работает довольно хорошо:
screen shot 2017-05-03 at 23 36 14

Самый полезный комментарий

@ billylo1 Хороший момент. Мне точно нужно отрезать несколько десятилетий от моего начального значения: D
double ti = [date timeIntervalSince1970];
@aelam У меня отлично сработало. Но я не могу вспомнить, когда это решение было нарушено и при каких обстоятельствах.
Мое окончательное решение исправило проблему, манипулируя значениями панели:

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

Все 21 Комментарий

Привет @zykis :

Прежде всего установите barWidth для BarChartDataSet:

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

Затем вы можете создать выход для ширины ограничения диаграммы следующим образом:
(Перетащите из раскадровки)
<strong i="12">@IBOutlet</strong> weak var layoutBarChartWidth: NSLayoutConstraint!

Затем вы можете установить ширину диаграммы в соответствии с объемом имеющихся данных.

            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)

Надеюсь это поможет :-)

Спасибо, @hernanarber !
Я попробую сегодня вечером, но еще остались вопросы:
1) Я не могу найти свойство barWidth в классе BarChartDataSet. Даже просмотр файла IBarChartDataSet.swift показывает только «barBorderWidth», «barBorderColor» и т. Д. Может быть, он был удален из нового API?
2) Я объявил IBOutlets различных объектов пользовательского интерфейса в моей раскадровке, но что касается NSLayoutConstraint. Как его можно на самом деле перетащить ctrl из раскадровки, если это не наследник UIView? Я имею в виду, если я перетащу любую точку BarChartView, удерживая Ctrl, IB предложит мне создать только выход BarChartView.

Свойство .barWidth не является частью ChartDataSet, но является частью BarChartData :-)
let chartData = BarChartData(dataSet: chartDataSet)
Попытайся

Для ограничения Перейдите в EXPLORER в раскадровке, чтобы вы могли Ctrl + перетащить ограничение

@hernanarber о, чувак!
Большое спасибо!!
Я попробую это решение сегодня

установка видимого диапазона - это то, что вы хотите
оформить заказ BarLineChartViewBase.swift

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

@aelam О, спасибо! Я попробую это.
Хотя этот метод внутренне оценивает minScale и maxScale для viewportHandler.
Я думаю, что лучший способ справиться с таким поведением - это понять, где оцениваются эти значения (barWidth).

@aelam Не могли бы вы объяснить мне об этом

Думаю, это то, что нам нужно ....

Спасибо :-)

@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)) }

Вот что сообщает нам источник

можно закрыть сейчас

Что ж, BarChartData.barWidth здесь не помогает.
Манипуляции с setXVisibleRange тоже не могут изменить ситуацию. Я считаю, что это связано с огромными значениями x временных меток. Есть идеи, где это рассчитано в источниках?
Метки времени используются с 1970 года.

Поиграл с ChartsDemo, он работает:

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

        data.barWidth = 1.0f;

        _chartView.data = data;

image

У вас есть объект полной ширины только потому, что ширина вашей оси X равна 1.0. Просто совпадение.
Дело в том, что ChartBarData.barWidth - это ТОЧЕЧНОЕ значение, где ширина оси X = [dataSet xMax] - [dataSet xMin]. Вы можете проверить это, установив значения сущностей с помощью e1 (x = 0, y = 1) и e2 (x = 1000, y = 0,7) и barWidth = 1;

@zykis
Не думаю, что это хорошее решение,
Ширина полосы в процентах,
Что вам нужно сделать, так это обработать видимый диапазон xAxis.
Например,
Если xAxis visible range 0,100, а ширина полосы 0,8
Тогда полная ширина записи AN составляет chartWidth / 100, а ширина полосы в пикселях - chartWidth / 100 * barWidth.

Не думаю, что это хорошо, что вы меняете barWidth динамически. Часть dataSet один раз устанавливается, а затем выполняется. Тогда позаботьтесь о представлении. Представление определяет, насколько широкой будет полная ширина полосы. Чтобы приблизиться к этому, установите соответствующий visibleRange.

发 自我 的 iPhone

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

У вас есть объект полной ширины только потому, что ширина вашей оси X равна 1.0. Просто совпадение.
Дело в том, что ChartBarData.barWidth - это ТОЧЕЧНОЕ значение, где ширина оси X = [dataSet xMax] - [dataSet xMin]. Вы можете проверить это, установив значения сущностей с помощью e1 (x = 0, y = 1) и e2 (x = 1000, y = 0,7) и barWidth = 1;

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.

Я думаю, у тебя две проблемы,
Один - сделать планку шире,
Один из них - сузить планку.

Если вы хотите, чтобы планка была узкой. Вы можете попробовать установить barWidth = 0 и borderwidth = 3

发 自我 的 iPhone

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

В любом случае я могу предотвратить увеличение ширины полосы?

-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.

Я попытался установить видимый диапазон:
barChartView.setVisibleXRange(minXRange: 0.0, maxXRange: 5.0)

Но в результате ширина полосы изменяется в зависимости от количества полосок. Я хотел получить ПОСТОЯННУЮ ширину полосы независимо от того, сколько данных было на диаграмме :-(

@aelam
На самом деле ширина полосы не в ПРОЦЕНТАХ, а в ПУНКТАХ.
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

CGRect определяет размеры элементов в пунктах, а не в процентах. Так что это просто заблуждение.

Но поскольку рендерер вычисляет влево и вправо, как упоминалось выше, теперь у меня первая и последняя полоски разрезаны наполовину:
screenshot_20170510_161407
Угадайте, мне нужно покопаться в смещениях области просмотра и установить их равными или более, затем половину ширины полосы

Я столкнулся с той же проблемой с первой / последней полосой, разрезанной пополам, и проблемами barWidth (у меня также есть timeIntervalSince1970 как xValues.)

В конце концов получил желаемый эффект, сохранив # дней с момента первого бара как xValues; и используйте мой собственный форматировщик, чтобы преобразовать xValue обратно в String.

Надеюсь это поможет.

image

image

@zykis устанавливает xAxisMin на -0,5, если текущее minXValue равно 0, тогда оно не будет вырезано, так же, как maxValue
и единица этих -0,5, 0, 0,5 основана на точке, а не на пикселе, я говорил ранее в процентах. Но теперь я думаю, вы теперь понимаете, о чем я.

@zykis, возможно, вы можете попытаться каждый раз сохранять каждую ТОЧКУ в одних и тех же пикселях, тогда вы можете получить постоянный результат, вот что я имел в виду

@ billylo1 Хороший момент. Мне точно нужно отрезать несколько десятилетий от моего начального значения: D
double ti = [date timeIntervalSince1970];
@aelam У меня отлично сработало. Но я не могу вспомнить, когда это решение было нарушено и при каких обстоятельствах.
Мое окончательное решение исправило проблему, манипулируя значениями панели:

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

ahmedsafadii picture ahmedsafadii  ·  3Комментарии

sjdevlin picture sjdevlin  ·  3Комментарии

kwstasna picture kwstasna  ·  3Комментарии

Bharati555 picture Bharati555  ·  4Комментарии

guoyutaog picture guoyutaog  ·  3Комментарии