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

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

新規登録して質問してみよう
ただいま回答率
85.46%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1817閲覧

iOs-Chartsで作成したグラフのプロットラベルの値の桁数を調節したい。

hero1207

総合スコア5

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/04/04 00:54

編集2020/04/04 04:37

前提・実現したいこと

初心者です。
iOs-Chartsを使用して線グラフを作成しようとしています。

発生している問題・エラーメッセージ

問題点:プロットのラベルの値が小数点第2位まで表示されてしまう。 小数点第1位まで表示させたいと考えています。

該当のソースコード

swift

1 2import Foundation 3import UIKit 4import Charts 5 6class iosCharts: UIViewController, IAxisValueFormatter { 7 func stringForValue(_ value: Double, axis: AxisBase?) -> String { 8 return year[Int(value)] 9 } 10 11 var year: [String]! 12 var koshincod: [Double] = [] 13 weak var axisFormatDelegate: IAxisValueFormatter? 14 @IBOutlet var iosChartsFigure: LineChartView! { 15 didSet { 16 //x軸設定 17 iosChartsFigure.xAxis.labelPosition = .bottom //x軸ラベル下側に表示 18 iosChartsFigure.xAxis.labelFont = UIFont.systemFont(ofSize: 11) //x軸のフォントの大きさ 19 iosChartsFigure.xAxis.labelCount = Int(35) //x軸に表示するラベルの数 20 iosChartsFigure.xAxis.labelTextColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) //x軸ラベルの色 21 iosChartsFigure.xAxis.axisLineColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) //x軸の色 22 iosChartsFigure.xAxis.axisLineWidth = CGFloat(1) //x軸の太さ 23 iosChartsFigure.xAxis.drawGridLinesEnabled = true //x軸のグリッド表示 24 iosChartsFigure.xAxis.granularity = 1.0 25 //y軸設定 26 iosChartsFigure.rightAxis.enabled = false //右軸(値)の表示 27 iosChartsFigure.leftAxis.enabled = true //左軸(値)の表示 28 iosChartsFigure.leftAxis.axisMaximum = 14 //y左軸最大値 29 iosChartsFigure.leftAxis.axisMinimum = 0 //y左軸最小値 30 iosChartsFigure.leftAxis.labelFont = UIFont.systemFont(ofSize: 11) //y左軸のフォントの大きさ 31 iosChartsFigure.leftAxis.labelTextColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) //y軸ラベルの色 32 iosChartsFigure.leftAxis.axisLineColor = #colorLiteral(red: 0.05882352963, green: 0.180392161, blue: 0.2470588237, alpha: 1) //y左軸の色(今回はy軸消すためにBGと同じ色にしている) 33 iosChartsFigure.leftAxis.drawAxisLineEnabled = true //y左軸の表示 34 iosChartsFigure.leftAxis.labelCount = Int(5) //y軸ラベルの表示数 35 iosChartsFigure.leftAxis.drawGridLinesEnabled = true //y軸のグリッド表示(今回は表示する) 36 iosChartsFigure.leftAxis.gridColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) //y軸グリッドの色 37 iosChartsFigure.leftAxis.valueFormatter = YAxisValueFormatter() 38 39 //その他UI設定 40 iosChartsFigure.noDataFont = UIFont.systemFont(ofSize: 30) //Noデータ時の表示フォント 41 iosChartsFigure.noDataTextColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) //Noデータ時の文字色 42 iosChartsFigure.noDataText = "Keep Waiting" //Noデータ時に表示する文字 43 iosChartsFigure.legend.enabled = false //"■ months"のlegendの表示 44 iosChartsFigure.dragDecelerationEnabled = true //指を離してもスクロール続くか 45 iosChartsFigure.dragDecelerationFrictionCoef = 0.6 //ドラッグ時の減速スピード(0-1) 46 iosChartsFigure.chartDescription?.text = nil //Description(今回はなし) 47 iosChartsFigure.backgroundColor = #colorLiteral(red: 0.501960814, green: 0.501960814, blue: 0.501960814, alpha: 1) //Background Color 48 iosChartsFigure.animate(xAxisDuration: 1.2, yAxisDuration: 1.5, easingOption: .easeInOutElastic)//グラフのアニメーション(秒数で設定) 49 } 50 } 51 52 override func viewDidLoad() { 53 super.viewDidLoad() 54 55 axisFormatDelegate = self 56 year = ["S49","S50","S51","S52","S53","S54","S55","S56","S57","S58","S59","S60","S61","S62","S63","H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13","H14","H15","H16","H17","H18","H19","H20","H21","H22","H23","H24","H25","H26","H27","H28","H29","H30"] 57 koshincod = [12.0,12.0,12.0,10.0,12.0,11.0,9.9,9.7,9.8,10.0,11.0,10.0,10.0,10.0,10.0,10.0,10.0,9.1,9.4,9.8,11.0,11.0,10.0,9.4,12.0,9.7,9.2,9.1,9.8,9.1,9.0,8.3,8.0,7.9,8.1,7.5,8.0,7.8,7.7,7.4,7.6,7.2,8.0,7.8,8.8] 58 59 drawLineChart(xValArr: year, yValArr: koshincod) 60 61 } 62 63 //グラフ描画部分 64 func drawLineChart(xValArr: [String], yValArr: [Double]) { 65 iosChartsFigure.noDataText = "You need to provide data for the chart." 66 var yValues : [ChartDataEntry] = [ChartDataEntry]() 67 68 for (i, _) in yValArr.enumerated() { 69 let dataEntry = ChartDataEntry(x: Double(i), y: yValArr[i]) 70 yValues.append(dataEntry) //(ChartDataEntry(x: Double(i), y: dollars1[i])) 71 72 } 73 74 let data = LineChartData() 75 let ds = LineChartDataSet(entries: yValues, label: "year") //ds means DataSet 76 let xAxisValue = iosChartsFigure.xAxis 77 xAxisValue.valueFormatter = axisFormatDelegate 78 79 ////グラフのUI設定 80 //グラフのグラデーション有効化 81 let gradientColors = [#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1).cgColor, #colorLiteral(red: 0.2196078449, green: 1, blue: 0.8549019694, alpha: 1).withAlphaComponent(0.3).cgColor] as CFArray // Colors of the gradient 82 let colorLocations:[CGFloat] = [0.7, 0.0] // Positioning of the gradient 83 let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations) // Gradient Object 84 ds.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0) // Set the Gradient 85 86 //その他UI設定 87 ds.lineWidth = 2.0 //線の太さ 88 //ds.circleRadius = 0 //プロットの大きさ 89 ds.circleRadius = 5.0 90 ds.drawCirclesEnabled = true //プロットの表示 91 ds.mode = .linear //直線にする 92 ds.fillAlpha = 0.8 //グラフの透過率 93 ds.drawFilledEnabled = false //グラフ下の部分塗りつぶし 94 //ds.fillColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) //グラフ塗りつぶし色 95 ds.drawValuesEnabled = true //各プロットのラベル表示 96 ds.highlightColor = #colorLiteral(red: 1, green: 0.8392156959, blue: 0.9764705896, alpha: 1) //各点を選択した時に表示されるx,yの線 97 ds.colors = [#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)] //Drawing graph 98 let ll = ChartLimitLine(limit: 5, label: "環境基準") 99 iosChartsFigure.leftAxis.addLimitLine(ll) 100 101 ////グラフのUI設定 102 103 data.addDataSet(ds) 104 self.iosChartsFigure.data = data 105 } 106 107 override func didReceiveMemoryWarning() { 108 super.didReceiveMemoryWarning() 109 } 110}

試したこと

初心者なりに多くのサイトから情報を収集してグラフ作成していますが、壁に当たってしまいました。
色々なサイトから引っ張ってきて作成したため、不要・余計なコードがあるかもしれませんがご容赦ください。

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

初質問ということもあり、回答に必要な情報が足りないかもしれません。
補足が必要であればご教授ください。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ch3cooh

2020/04/04 08:55

左側の数字の軸なので本題とは直接関係ありませんが、YAxisValueFormatter はどのような実装になっていますか?
hero1207

2020/04/04 08:58

確認ありがとうございます。 YAxisValueFormatterの実装は以下のコードです。 ``` import Foundation import Charts class YAxisValueFormatter: NSObject, IAxisValueFormatter { let numFormatter: NumberFormatter override init() { numFormatter = NumberFormatter() numFormatter.minimumFractionDigits = 1 numFormatter.maximumFractionDigits = 1 numFormatter.minimumIntegerDigits = 1 // how many digits do want before decimal numFormatter.paddingPosition = .beforePrefix numFormatter.paddingCharacter = "0" } } } ```
hero1207

2020/04/04 09:00

すみません。上記は間違いです。 以下がYAxisValueFormatterの実装は以下のコードです。 import Foundation import Charts class YAxisValueFormatter: NSObject, IAxisValueFormatter { let numFormatter: NumberFormatter override init() { numFormatter = NumberFormatter() numFormatter.minimumFractionDigits = 1 numFormatter.maximumFractionDigits = 1 numFormatter.minimumIntegerDigits = 1 // how many digits do want before decimal numFormatter.paddingPosition = .beforePrefix numFormatter.paddingCharacter = "0" } public func stringForValue(_ value: Double, axis: AxisBase?) -> String { return numFormatter.string(from: NSNumber(floatLiteral: value))! } }
ch3cooh

2020/04/04 09:05

ありがとうございます。挙動確認してみます。
hero1207

2020/04/04 09:06

ありがとうございます。よろしくお願いします。
guest

回答1

0

ベストアンサー

小数点第一位まで表示させたいとのことでしたので、IValueFormatterを継承した ValueFormatterクラスを作成しました。

class ValueFormatter: NSObject, IValueFormatter { func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String { return String(format: "%0.1f", value) } }

LineChartDataSet#valueFormatterValueFormatter を設定することで、任意の形式でグラフの値を表示させることができます。

let ds = LineChartDataSet(entries: yValues, label: "year") //ds means DataSet ds.valueFormatter = ValueFormatter() // add

下図は、前述のコードを追加して実行した結果です。

イメージ説明

検証環境について

  • Xcode 11.4
  • iOS 13.4
  • Charts 3.4.0

にて検証をおこないました。GitHubに検証に使ったプロジェクトをアップロードいたしました。参考になれば幸いです。

投稿2020/04/04 09:16

ch3cooh

総合スコア287

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hero1207

2020/04/04 09:29

はやい回答ありがとうございます! 新しいクラスを作成すればよかったのですね。とても勉強になります! こちらでもきちんと作動することを確認できました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問