2

私のアプリでは、ios-charts ライブラリ (MPAndroidChart の迅速な代替手段) を使用しています。必要なのは、日付と値を含む折れ線グラフを表示することだけです。

現在、この関数を使用してチャートを表示しています

func setChart(dataPoints: [String], values: [Double]) {       

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(value: values[i], xIndex: i)
        dataEntries.append(dataEntry)
    }        

    let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Items count")
    let lineChartData = LineChartData(xVals: dataPoints, dataSet: lineChartDataSet)
    dateChartView.data = lineChartData      
}

そして、これは私のデータです:

xItems = ["27.05", "03.06", "17.07", "19.09", "20.09"] //String    
let unitsSold = [25.0, 30.0, 45.0, 60.0, 20.0] //Double

しかし、ご覧のとおり、xItems は「dd.mm」形式の日付です。それらは文字列であるため、互いに同じパディングがあります。私はそれらが実際の日付でより正確であることを望みます。たとえば、19.09 と 20.09 は非常に近いはずです。それを達成するには、毎日を何らかの数字と一致させる必要があることを私は知っています。しかし、次に何をすべきかわかりません - x ラベルの余白を調整するにはどうすればよいですか?

更新 多くの開発者がこの機能について尋ねたが何も起こらなかったことがわかった小規模な調査の後、私の場合、Swift- PNChartでこのライブラリの非常に興味深い代替手段を見つけました。使いやすく、私の問題を解決します。

4

4 に答える 4

2

最も簡単な解決策は、データをループしてChartDataEntry、値が 0 の a と、欠落している日付ごとに対応するラベルを追加することです。

コメントの質問への回答として、私のアプリケーションの 1 つからのスクリーンショットを示します。このスクリーンショットでは、日付のギャップを 0 の値で埋めています。

チャートギャップ

私の場合、スキップされた日 (たとえば 8/11) にデータがないことを明確に示しているため、データ ポイントからデータ ポイントへの平均線ではなく 0 の値が必要でした。

@Philipp Jahoda のコメントから、値 0 のエントリをスキップして、必要なデータを正しいラベルにインデックス付けできるように思えます。

MPAndroidChart サンプル プログラムを修正して、いくつかのデータ ポイントをスキップすると、次のようになります。

チャートのギャップがゼロでない

@Philipp Jahoda がコメントで述べたように、チャートEntryは次のデータ ポイントに接続するだけで不足を処理します。以下のコードから、データ セット全体の x 値 (ラベル) を生成しているが、必要なインデックス 11 ~ 29 の y 値 (データ ポイント) をスキップしていることがわかります。私の例では15、20、および25を表示したくないように聞こえるので、残りの唯一のことはxラベルを処理することです。

ArrayList<String> xVals = new ArrayList<String>();
for (int i = 0; i < count; i++) {
    xVals.add((i) + "");
}

ArrayList<Entry> yVals = new ArrayList<Entry>();

for (int i = 0; i < count; i++) {

    if (i > 10 && i < 30) {
        continue;
    }

    float mult = (range + 1);
    float val = (float) (Math.random() * mult) + 3;// + (float)
    // ((mult *
    // 0.1) / 10);
    yVals.add(new Entry(val, i));
}
于 2015-11-09T22:58:46.247 に答える
1

Wingzero の回答に基づいて作成した関数を次に示します (空の値配列のエントリに NaN を渡します)。

func populateLineChartView(lineChartView: LineChartView, labels: [String], values: [Float]) {
    var dataEntries: [ChartDataEntry] = []

    for i in 0..<labels.count {
        if !values[i].isNaN {
            let dataEntry = ChartDataEntry(value: Double(values[i]), xIndex: i)
            dataEntries.append(dataEntry)
        }
    }

    let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Label")
    let lineChartData = LineChartData(xVals: labels, dataSet: lineChartDataSet)
    lineChartView.data = lineChartData
}
于 2016-05-16T09:10:03.920 に答える