質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

[Swift] [iOS-Charts] X軸に関する設定の確認

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,317

score 18

前提・実現したいこと

Qiitaの記事ios-charts チャート表示ライブラリ Xcode8 + Swift3を参考に、iOS-Chartsを使って棒グラフを作成してみようと思ったのですが、とある箇所の引数が理解できずに困っています。

public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
// 0 -> Jan, 1 -> Feb...
return months[Int(value)]
}

この関数に疑問を持ち、
stringForValue(_ value: Double, axis: AxisBase?)
の第一引数である
「_ value: Double」はどこから値が呼ばれているか知りたいです。

教えていただければ幸いです。よろしくお願いいたします。

試したこと

print(value)置き、value値を確かめたところ、
0.0、1.0、2.0、3.0、4.0、...となりました。
X軸やY軸の個数(unitsSoldやmonthsの配列の増減 例)共に4つ格納)を変化すると実行結果が
0.0、0.7、1.4、2.1、2.8、3.5
となったりします。

補足情報(言語/FW/ツール等のバージョンなど)

swift 3.0 / Xcode 8.3.3 / Charts 3.0.2 を使用しています。

ソースコード

//  ChartViewController.swift

import UIKit
import Charts

class ChartViewController: UIViewController {
    // ここに棒グラフを描きます
    @IBOutlet weak var myChartView: BarChartView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // y軸のプロットデータ
        let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        setChart(y: unitsSold)
    }

    func setChart(y: [Double]) {
        // プロットデータ(y軸)を保持する配列
        var dataEntries = [BarChartDataEntry]()

        for (i, val) in y.enumerated() {
            let dataEntry = BarChartDataEntry(x: Double(i), y: val) // X軸データは、0,1,2,...
            dataEntries.append(dataEntry)
        }
        // グラフをUIViewにセット
        let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")
        myChartView.data = BarChartData(dataSet: chartDataSet)

        // X軸のラベルを設定
        let xaxis = XAxis()
        xaxis.valueFormatter = BarChartFormatter()
        myChartView.xAxis.valueFormatter = xaxis.valueFormatter

        // x軸のラベルをボトムに表示
        myChartView.xAxis.labelPosition = .bottom
        // グラフの色
        chartDataSet.colors = [UIColor(red: 230/255, green: 126/255, blue: 34/255, alpha: 1)]
        // グラフの背景色
        myChartView.backgroundColor = UIColor(red: 189/255, green: 195/255, blue: 199/255, alpha: 1)
        // グラフの棒をニョキッとアニメーションさせる
        myChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0)
        // 横に赤いボーダーラインを描く
        let ll = ChartLimitLine(limit: 10.0, label: "Target")
        myChartView.rightAxis.addLimitLine(ll)
        // グラフのタイトル
        myChartView.chartDescription?.text = "Cool Graph!"
    }
}

public class BarChartFormatter: NSObject, IAxisValueFormatter{
    // x軸のラベル
    var months: [String]! = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

    // デリゲート。TableViewのcellForRowAtで、indexで渡されたセルをレンダリングするのに似てる。
    public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        // 0 -> Jan, 1 -> Feb...
        return months[Int(value)]
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/06/21 08:44 編集

    「どこから値をもらっているか」というのは「どこから呼ばれているか」という意味でいいでしょうか?あと、コードは ``` で囲って下さい。

    キャンセル

  • ks-cap

    2017/06/21 09:15

    指摘された点につきまして変更致しました。はい、引数である「_ value: Double」がどこから呼ばれているかです。

    キャンセル

回答 2

checkベストアンサー

+1

おそらく、x軸の値はライブラリ側で自動で計算されているのだと思います。(自分の場合は0.0, 2.0, 4.0... となりました。)

以下、このライブラリの説明をします。
https://github.com/danielgindi/Charts

 計算方法

x軸のラベルの数はデフォルトで 6 個になっています。
Source/Charts/Components/AxisBase.swift

    /// the number of label entries the axis should have
    ///
    /// **default**: 6
    fileprivate var _labelCount = Int(6)

その _labelCount ですが、ViewController内などで、

        myChartView.xAxis.labelCount = Int(12)


などと設定した場合、 AxisBase.swift内のsetLabelCountという関数が実行されます。
その中身ですが、

    open func setLabelCount(_ count: Int, force: Bool)
    {
        self.labelCount = count
        forceLabelsEnabled = force
    }


このようになっており、 labelCountに値を保持させています。
さて、labelCountですが、

    /// the number of label entries the axis should have
    /// max = 25,
    /// min = 2,
    /// default = 6,
    /// be aware that this number is not fixed and can only be approximated
    open var labelCount: Int
    {
        get
        {
            return _labelCount
        }
        set
        {
            _labelCount = newValue

            if _labelCount > 25
            {
                _labelCount = 25
            }
            if _labelCount < 2
            {
                _labelCount = 2
            }

            forceLabelsEnabled = false
        }
    }


このようになっており、実質_labelCountの値を返しています。
この値は書いてある通り、最小値2、最大値25を保持するようですね。

それらを元に、元のx軸の最小値と最大値からlabelCountで割っていった値が来るみたいですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/22 17:12

    回答ありがとうございます。
    事細かく教えてくださりありがとうございます。
    "myChartView.xAxis.labelCount = Int(...)"
    を利用することで理想に近いX軸ラベルにすることが出来ました。

    キャンセル

+1

 stringForValue()にブレークポイントを設定して、バックトレースを確認して下さい。
止まった後で、コンソール(Debug Area)でbtと打ち込むか、Debug navigatorでバックトレースを確認できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/19 19:14

    回答ありがとうございます。
    btと打ち込むことで確認できるとは知りませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る