X 轴上带有日期和时间的烛台图
Candlestick Chart with dates and time on x-axis
我正在尝试使用 Charts Framework 与 Codable 一起创建烛台图表,因为 JSON 通过 myclass 可以显示为:
struct ChartDataPair: Codable {
var DateTime: String = ""
var Open: Double = 0.0
var High: Double = 0.0
var Low: Double = 0.0
var Close: Double = 0.0
}
创建一个图表数据对数组,如下所示:
struct ChartData: Codable {
var chartDataPairs: [ChartDataPair]
}
我正在获取的值将在下面显示为示例:
{"chartDataPairs":
[{
"DateTime": "2018/10/1 10:00:01",
"Open": 50.05,
"High": 50.05,
"Low": 49.00,
"Close":49.00
},
{
"DateTime": "2018/10/1 10:05:02",
"Open": 51.05,
"High": 54.06,
"Low": 40.00,
"Close":45.06
},
{
"DateTime": "2018/10/1 10:10:02",
"Open": 50.05,
"High": 64.06,
"Low": 40.00,
"Close":58.06
}]
}
数据只是一个示例,所以只写了 3 个值。现在我只需要获取时间并将 DateTime String 转换为 Double 以将其绘制在图表的 x 轴上。因为我正在使用 :
var dataEntries: [ChartDataEntry] = []
guard let financialData = dataChart.self else {
return
}
for chartData in financialData{
let open = chartData.Open
let close = chartData.Close
let high = chartData.High
let low = chartData.Low
let datetime = chartData.DateTime
let formatter = DateFormatter()
formatter.dateFormat = "YYYY/MM/dd HH:mm:ss"
let yourDate = formatter.date(from: datetime)
formatter.dateFormat = "HH:mm"
let myStringafd = formatter.string(from: yourDate!)
let time = myStringafd
let components = time.characters.split { [=13=] == ":" } .map { (x) -> Int in return Int(String(x))! }
let hours = components[0]
let minutes = components[1]
let double1 = Double("\(hours).\(minutes)")
let dataEntry = CandleChartDataEntry(x: double1! , shadowH: high, shadowL: low, open: open, close: close)
dataEntries.append(dataEntry)
}
let chartDataSet = CandleChartDataSet(values: dataEntries, label: "")
chartDataSet.axisDependency = .left
chartDataSet.drawIconsEnabled = false
chartDataSet.shadowColor = .darkGray
chartDataSet.shadowWidth = 0.7
chartDataSet.decreasingColor = .red
chartDataSet.decreasingFilled = true // fill up the decreasing field color
chartDataSet.increasingColor = UIColor(red: 122/255, green: 242/255, blue: 84/255, alpha: 1)
chartDataSet.increasingFilled = true // fill up the increasing field color
chartDataSet.neutralColor = .blue
chartDataSet.barSpace = 1.0
chartDataSet.drawValuesEnabled = false
let chartData = CandleChartData(dataSet: chartDataSet)
candlestickView.data = chartData
我知道根据需要将时间转换为双精度不正确,我需要一些帮助将日期时间转换为双精度值。
第二个问题是烛台的条形宽度,我无法减小烛台的宽度。
我想用 HH:MM 等时间值填充 x 轴,并以特定间隔(如 15 分钟、50 分钟、4 小时等)填充 x 轴。
为此,我在下面给出的 link 中遵循了几个问题和建议:
关于这个问题:candlestickView.xAxisRenderer = XAxisWeekRenderer()
不工作。它正在调用 viewporthandler、x 轴和转换。
尽管我可以从自定义 IAxisValueFormatter 中获取自定义标签。 x 轴上两个值之间的间隔不是我想要的 15 分钟或 50 分钟或 4 小时等。
关于上面提到的link我无法得到minTimeInterval
and referenceTimeInterval
基本上我想在这里做的是从我从 JSON 中获取的字符串中的 x 轴绘制小时和分钟,并在 x 轴的值之间创建一个自定义间隔,同时创建自定义 x 轴标签。
我的图表目前显示为:
Candlestick Chart
我有同样的东西要显示,所以我用这种方式显示数据
let xAxis = chartView.xAxis
var dataPoints = [String]()
for i in 0 ..< arrData.count
{
let timeStampFrom = arrData[i].time
dataPoints.append(self.stringFromTimestamp(timeStampFrom, strDateFormat: "h a"))
}
xAxis.valueFormatter = IndexAxisValueFormatter(values:dataPoints)
xAxis.setLabelCount(5, force: false)
一些需要的功能
func stringFromTimestamp(_ timeInterval : Double ,strDateFormat : String)->String
{
let dateFormatter = DateFormatter()
self.setDateFormat(dateFormatter,dateFormat: strDateFormat)
let date = Date(timeIntervalSince1970: TimeInterval(timeInterval))
return dateFormatter.string(from: date)
}
这是输出
我正在尝试使用 Charts Framework 与 Codable 一起创建烛台图表,因为 JSON 通过 myclass 可以显示为:
struct ChartDataPair: Codable {
var DateTime: String = ""
var Open: Double = 0.0
var High: Double = 0.0
var Low: Double = 0.0
var Close: Double = 0.0
}
创建一个图表数据对数组,如下所示:
struct ChartData: Codable {
var chartDataPairs: [ChartDataPair]
}
我正在获取的值将在下面显示为示例:
{"chartDataPairs":
[{
"DateTime": "2018/10/1 10:00:01",
"Open": 50.05,
"High": 50.05,
"Low": 49.00,
"Close":49.00
},
{
"DateTime": "2018/10/1 10:05:02",
"Open": 51.05,
"High": 54.06,
"Low": 40.00,
"Close":45.06
},
{
"DateTime": "2018/10/1 10:10:02",
"Open": 50.05,
"High": 64.06,
"Low": 40.00,
"Close":58.06
}]
}
数据只是一个示例,所以只写了 3 个值。现在我只需要获取时间并将 DateTime String 转换为 Double 以将其绘制在图表的 x 轴上。因为我正在使用 :
var dataEntries: [ChartDataEntry] = []
guard let financialData = dataChart.self else {
return
}
for chartData in financialData{
let open = chartData.Open
let close = chartData.Close
let high = chartData.High
let low = chartData.Low
let datetime = chartData.DateTime
let formatter = DateFormatter()
formatter.dateFormat = "YYYY/MM/dd HH:mm:ss"
let yourDate = formatter.date(from: datetime)
formatter.dateFormat = "HH:mm"
let myStringafd = formatter.string(from: yourDate!)
let time = myStringafd
let components = time.characters.split { [=13=] == ":" } .map { (x) -> Int in return Int(String(x))! }
let hours = components[0]
let minutes = components[1]
let double1 = Double("\(hours).\(minutes)")
let dataEntry = CandleChartDataEntry(x: double1! , shadowH: high, shadowL: low, open: open, close: close)
dataEntries.append(dataEntry)
}
let chartDataSet = CandleChartDataSet(values: dataEntries, label: "")
chartDataSet.axisDependency = .left
chartDataSet.drawIconsEnabled = false
chartDataSet.shadowColor = .darkGray
chartDataSet.shadowWidth = 0.7
chartDataSet.decreasingColor = .red
chartDataSet.decreasingFilled = true // fill up the decreasing field color
chartDataSet.increasingColor = UIColor(red: 122/255, green: 242/255, blue: 84/255, alpha: 1)
chartDataSet.increasingFilled = true // fill up the increasing field color
chartDataSet.neutralColor = .blue
chartDataSet.barSpace = 1.0
chartDataSet.drawValuesEnabled = false
let chartData = CandleChartData(dataSet: chartDataSet)
candlestickView.data = chartData
我知道根据需要将时间转换为双精度不正确,我需要一些帮助将日期时间转换为双精度值。
第二个问题是烛台的条形宽度,我无法减小烛台的宽度。
我想用 HH:MM 等时间值填充 x 轴,并以特定间隔(如 15 分钟、50 分钟、4 小时等)填充 x 轴。
为此,我在下面给出的 link 中遵循了几个问题和建议:
关于这个问题:candlestickView.xAxisRenderer = XAxisWeekRenderer()
不工作。它正在调用 viewporthandler、x 轴和转换。
尽管我可以从自定义 IAxisValueFormatter 中获取自定义标签。 x 轴上两个值之间的间隔不是我想要的 15 分钟或 50 分钟或 4 小时等。
关于上面提到的link我无法得到minTimeInterval
and referenceTimeInterval
基本上我想在这里做的是从我从 JSON 中获取的字符串中的 x 轴绘制小时和分钟,并在 x 轴的值之间创建一个自定义间隔,同时创建自定义 x 轴标签。
我的图表目前显示为: Candlestick Chart
我有同样的东西要显示,所以我用这种方式显示数据
let xAxis = chartView.xAxis
var dataPoints = [String]()
for i in 0 ..< arrData.count
{
let timeStampFrom = arrData[i].time
dataPoints.append(self.stringFromTimestamp(timeStampFrom, strDateFormat: "h a"))
}
xAxis.valueFormatter = IndexAxisValueFormatter(values:dataPoints)
xAxis.setLabelCount(5, force: false)
一些需要的功能
func stringFromTimestamp(_ timeInterval : Double ,strDateFormat : String)->String
{
let dateFormatter = DateFormatter()
self.setDateFormat(dateFormatter,dateFormat: strDateFormat)
let date = Date(timeIntervalSince1970: TimeInterval(timeInterval))
return dateFormatter.string(from: date)
}
这是输出