我有一個lineChart,我想添加一個點(散點)。 這可能嗎? 有什麼解決方法嗎? 我試圖找出我對我來說似乎是不可能的,因爲即使使用散佈數據只有我必須使用相同的xVals
陣列,在我的情況下,該行有一些xVals
點,單個散點只有一個值在X和一個Y.如何在iOS圖表中添加單點到lineChart
感謝
編輯: 這就是我想要達到的目標:使用的是iOS,圖表被疊加兩種查看圖表
對我來說,唯一的解決辦法...
我有一個lineChart,我想添加一個點(散點)。 這可能嗎? 有什麼解決方法嗎? 我試圖找出我對我來說似乎是不可能的,因爲即使使用散佈數據只有我必須使用相同的xVals
陣列,在我的情況下,該行有一些xVals
點,單個散點只有一個值在X和一個Y.如何在iOS圖表中添加單點到lineChart
感謝
編輯: 這就是我想要達到的目標:使用的是iOS,圖表被疊加兩種查看圖表
對我來說,唯一的解決辦法...
您是否要求截斷折線圖?我不清楚你的問題是什麼。如果您只想分散圖表+折線圖,請使用CombinedChartView
。
我有一個截斷折線圖的功能請求,所以我們可以在折線圖中有'單點',所以如果你不想連接點。檢查它是否是https://github.com/danielgindi/ios-charts/issues/280。如果屬實,你可以幫忙評論,以便作者知道。
在您身邊,您可以嘗試的是將折線圖渲染器和協議子類化以允許添加單點。對於我來說,如果當前點不能連接到下一個點,我想截斷這一行。如y值:1-2-3 5(單點)7-8-9。
你必須提供你想要的,所以我可以幫助你更好。
對於你在評論中提出的問題,我只能提供一些代碼,讓你開始,但你必須完全明白我想要做什麼。 CoreGraphics + CGAffineTransform(iOS),viewPortHandler,transformer,axisRenderer(ios-charts)。您必須擁有的知識:CoreGraphics + CGAffineTransform(iOS),viewPortHandler,transformer,axisRenderer(ios-charts)。
在我的問題,我將繼承ScatterChartView,所以我可以繪製xAxis像yAxis。這個想法是禁用xAxis,並讓rightAxis爲HorizontalBarChartYAxisRenderer充當xAxis。
首先,子類ScatterChartView和覆蓋初始化():
public override func initialize() {
super.initialize();
doubleTapToZoomEnabled = false;
xAxis.enabled = false;
// to determine how much space left for the dots to be drawn
_leftYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer);
// right axis will be the bottom axis above xAxis
_rightAxisTransformer = ChartTransformerHorizontalBarChart(viewPortHandler: _viewPortHandler);
_rightYAxisRenderer = MyChartYAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer);
renderer = MyScatterChartRenderer(delegate: self, animator: _animator, viewPortHandler: _viewPortHandler);
}
覆蓋prepareValuePxMatrix
internal override func prepareValuePxMatrix()
{
// replace the chartXMin and deltaX with rightAxis values to keep the CTM correct
_rightAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis.axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis.axisMinimum);
_leftAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis.axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis.axisMinimum);
}
到現在爲止,你必須創建rightAxis作爲X軸,併產生了矩陣。
現在對於數據部分,我將創建兩個數據集,並通過dataSet.axisDependency將它們分配給AxisDependencyLeft和AxisDependencyRight,以便我可以知道如何呈現它們。
在圖表渲染器中,我將讀取兩個數據集,一個用於x,另一個用於y,並利用變換器獲取繪製的位置。
如:
var xDataSet = scatterData.getRight()
var yDataSet = scatterData.getLeft()
var dataSet = yDataSet as! ScatterChartDataSet
var trans = delegate!.scatterChartRenderer(self, transformerForAxis: dataSet.axisDependency)
var phaseX = _animator.phaseX
var phaseY = _animator.phaseY
var xEntries = (xDataSet as! ScatterChartDataSet).yVals
var entries = dataSet.yVals
// if count not equal, something goes off
if (xEntries.count != entries.count)
{
return
}
var shapeSize = dataSet.scatterShapeSize
var shapeHalf = shapeSize/2.0
var point = CGPoint()
var valueToPixelMatrix = trans.valueToPixelMatrix
var shape = dataSet.scatterShape
CGContextSaveGState(context)
for (var j = 0, count = Int(min(ceil(CGFloat(entries.count) * _animator.phaseX), CGFloat(entries.count))); j < count; j++)
{
var e = entries[j]
var xEntry = xEntries[j]
point.x = CGFloat(xEntry.value)
point.y = CGFloat(e.value) * phaseY
point = CGPointApplyAffineTransform(point, valueToPixelMatrix)
// now you have the point to render, such as:
if (shape == .Circle)
{
CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)
var rect = CGRect()
rect.origin.x = point.x - shapeHalf
rect.origin.y = point.y - shapeHalf
rect.size.width = shapeSize
rect.size.height = shapeSize
CGContextFillEllipseInRect(context, rect)
}
}
我不能提供所有我的代碼。你必須明白我在做什麼,所以你可以想象你的。唯一的魔法是你有機會定義你想要如何渲染它。
我認爲這是我的情況。唯一的問題是折線圖沒有與散點圖相同的x值。 – Nicholas
你的意思是?您只需將X值添加到組合圖表數據中即可。看看演示 – Wingzero
如果您看演示,折線圖的點具有相同的條形圖的x值...您是否有一個例外的情況? – Nicholas