【问题标题】:Candlestick Chart with dates and time on x-axisX 轴上带有日期和时间的烛台图
【发布时间】:2023-04-02 12:02:01
【问题描述】:

我正在尝试使用 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
}

这会创建一个 chartDataPairs 数组,如图所示:

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 字符串转换为 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 { $0 == ":" } .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 小时等。

为此,我在下面的给定链接中遵循了一些问题和建议: iOS-Charts Library: x-axis labels without backing data not showing

关于这个问题:candlestickView.xAxisRenderer = XAxisWeekRenderer()

不工作。它要求 viewporthandler、x 轴和转换。

虽然我可以从自定义 IAxisValueFormatter 中获取自定义标签。 x 轴上两个值之间的间隔不是我希望它在 15 分钟或 50 分钟或 4 小时等内的样子。

ios Charts 3.0 - Align x labels (dates) with plots

在上述链接上我无法获得minTimeInterval and referenceTimeInterval

基本上我在这里要做的是在 x 轴中从我从 JSON 中获取的字符串中绘制小时和分钟,并在创建自定义 x 轴时在 x 轴的值之间创建自定义间隔标签。

我的图表目前显示为: Candlestick Chart

【问题讨论】:

  • 参考 Chirag 的回答我已经设法从 dateTime 字符串中获取 x 轴值,因为我的来自 JSON 的 DateTime 已经是字符串格式。现在的问题是将 DateTime 转换为 Double。

标签: swift datetime charts axis-labels candlestick-chart


【解决方案1】:

我有同样的东西要显示所以我用这种方式显示数据

        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)
    }

这是输出

【讨论】:

  • 在提到self.setDateFormat(dateFormatter, dateFormat: strDateFormat) 的函数中使用这一行时出现问题,当我尝试使用上面的代码并从数组中获取日期时间时,它会给出错误提示:无法转换类型的值' String' 到预期的参数类型'Double'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多