2016-09-21 22 views
0

私は現在、CorePlotライブラリ(バージョン2.1)を使用して散布図を描いているiOSアプリケーションで作業しています。私の散布図はうまく描画され、次のステップでは、プロットの上に半透明の信頼楕円を描きたいと思います。私は主軸と副軸を計算するクラスと私の楕円の必要な回転角を書きました。私のConfidenceEllipseクラスは描画する楕円を表すCGPathを返すgetPath()メソッドを実装しています。あなたのよう私に次 Screenshot を与える、これをやって散布図の上に信頼楕円を描く

let graph  = hostView.hostedGraph! 
let space  = graph.defaultPlotSpace  
let ellipse = ConfidenceEllipse(chiSquare: 5.991) 
ellipse.analyze(self.samples) 

let annotation = CPTPlotSpaceAnnotation (plotSpace: space!, anchorPlotPoint: [0,0]) 
let overlay = CPTBorderedLayer (frame: graph.frame) 
overlay.outerBorderPath = ellipse.getPath() 

let fillColor = CPTColor.yellowColor() 
overlay.fill = CPTFill (color: fillColor) 

annotation.contentLayer = overlay 
annotation.contentLayer?.opacity = 0.5 
graph.addAnnotation(annotation) 

func getPath() -> CGPath 
{ 
var ellipse: CGPath 

var transform = CGAffineTransformIdentity 
transform = CGAffineTransformTranslate (transform, CGFloat(-self.meanX), CGFloat(-self.meanY)) 
transform = CGAffineTransformRotate (transform, CGFloat(self.angle)) 
transform = CGAffineTransformTranslate (transform, CGFloat(self.meanX), CGFloat(self.meanY)) 

ellipse = CGPathCreateWithEllipseInRect(CGRectMake (CGFloat(-self.mainHalfAxis), CGFloat(-self.minorHalfAxis), CGFloat(2 * self.mainHalfAxis), CGFloat(2 * self.minorHalfAxis)),&transform) 

return ellipse 
} 

しばらくの間、ウェブを検索した後、注釈が進むべき道であると表示されますので、私はこれを試してみましたオーバーレイはフレームのフルサイズを占めています。これは、CPTBorderedLayerオブジェクトを作成するときにフレームの寸法を渡したことを考慮すると論理的です。コンストラクタを空のままにしてみましたが、オーバーレイがまったく表示されません。だから私は不思議に思っています、私はここに欠けているものは何ですか?

答えて

0

プロットに合わせて楕円をスケーリングする必要があります。アノテーションレイヤのフレームにプロットエリアboundsを使用し、プロットエリアにアノテーションを添付します。プロット領域にプロットをフィットさせるためにプロット空間で使用される変換と一致するように、楕円をx方向およびy方向にスケーリングします。

編集: ボーダーレイヤの仕組みを見て、私は上記の提案がうまくいかないことに気付きました。 CPTBorderedLayerは、レイヤー境界が変更されるたびに自動的にouterBorderPathを設定します。レイヤーの境界線に影響を与えようとする代わりに、楕円をイメージに描画し、境界線付きレイヤーの場合はfillとして使用します。楕円が内側に収まるようにレイヤーのサイズを設定する必要があります。

+0

あなたは正しいですが、私は楕円をスケーリング忘れてしまったのに役立ちます。私は、プロット領域と楕円の両方の境界線で境界アノテーションを初期化しようとしましたが、後で境界アノテーションをスケーリングして、散布図上の点で領域を完全にカバーしましたが、残念ながら楕円は表示されません。アノテーションはまだ長方形として表示されます。あなたはouterBorderPathを設定して私を考慮していますか?これは、次の記事http://stackoverflow.com/questions/11588862/changing-the-layer-shape-for-cptplotspaceannotationを読んだ後に私に起こりました。 – Neckelatius

0

注釈が正常に機能しなくなった後、別の道を行くことにしました。私の最終的な解決策は、オリジナルの散布図を重ねて、2つ目の散布図を作成することです。これには、1つのデータポイント、つまり自信の楕円の中心が含まれています。ここではここで最終的な結果のスクリーンショットだコード

func drawConfidenceEllipse() { 

    let graph  = hostView.hostedGraph! 
    let plotSpace = graph.defaultPlotSpace as! CPTXYPlotSpace 

    let scaleX = (graph.bounds.size.width - graph.paddingLeft - graph.paddingRight)/CGFloat(plotSpace.xRange.lengthDouble) 
    let scaleY = (graph.bounds.size.height - graph.paddingTop - graph.paddingBottom)/CGFloat(plotSpace.yRange.lengthDouble) 

    let analysis = ConfidenceEllipse(chiSquare: 5.991) 
    analysis.analyze(self.samples) 
    let unscaledPath = analysis.getPath() 

    let bounds = CGPathGetBoundingBox(unscaledPath) 

    var scaler = CGAffineTransformIdentity 
    scaler = CGAffineTransformScale (scaler, scaleX, scaleY) 
    scaler = CGAffineTransformTranslate (scaler, CGFloat (-bounds.origin.x), CGFloat (-bounds.origin.y)) 
    let scaledPath = CGPathCreateCopyByTransformingPath (unscaledPath, &scaler) 
    let scaledBounds = CGPathGetPathBoundingBox(scaledPath) 

    let symbol = CPTPlotSymbol() 
    symbol.symbolType = CPTPlotSymbolType.Custom 
    symbol.customSymbolPath = scaledPath 
    symbol.fill = CPTFill (color: CPTColor.yellowColor().colorWithAlphaComponent(0.25)) 
    symbol.size = CGSize (width: scaledBounds.size.width, height: scaledBounds.size.height) 

    let lineStyle = CPTMutableLineStyle() 
    lineStyle.lineWidth = 1 
    lineStyle.lineColor = CPTColor.yellowColor() 

    symbol.lineStyle = lineStyle 

    let ellipse = CPTScatterPlot (frame: hostView.frame) 
    ellipse.title = "Confidence Ellipse" 
    ellipse.delegate = self 
    ellipse.dataSource = self 
    ellipse.plotSymbol = symbol 
    ellipse.dataLineStyle = nil 

    graph.addPlot(ellipse) 

}

です:

95% Confidence Ellipse on top of scatter plot

ホープこれは