精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 iOS 16 中用 SwiftUI Charts 創建一個折線圖

移動開發 iOS
本文展示了如何用比以前從頭開始創建同樣的折線圖少得多的代碼輕松創建折線圖。此外,自定義圖表的外觀和感覺以及使圖表中的信息易于訪問也是非常容易的。

前言

蘋果在 WWWDC 2022 上推出了 SwiftUI 圖表,這使得在 SwiftUI 視圖中創建圖表變得異常簡單。圖表是以豐富的格式呈現可視化數據的一種很好的方式,而且易于理解。本文展示了如何用比以前從頭開始創建同樣的折線圖少得多的代碼輕松創建折線圖。此外,自定義圖表的外觀和感覺以及使圖表中的信息易于訪問也是非常容易的。

如以前的文章所示,不使用 SwiftUI Charts 也可以創建一個折線圖。然而,使用 Charts[1] 框架可以提供大量的圖表來探索對應用程序中的數據最有效的方法,從而使它變得更加容易。

系列文章

  1. 如何在 SwiftUI 中創建條形圖
  2. SwiftUI 中的水平條形圖
  3. 在 iOS16 中用 SwiftUI 圖表定制一個線圖
  4. 在 Swift 圖表中使用 Foudation 庫中的測量類型

簡單折線圖

從包含一周的步數的數據開始,類似于 在SwiftUI中創建折線圖 中使用的數據。定義一個結構來保存日期和該日的步數,并為當前周創建一個數組。

struct StepCount: Identifiable {
let id = UUID()
let weekday: Date
let steps: Int
init(day: String, steps: Int) {
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
self.weekday = formatter.date(from: day) ?? Date.distantPast
self.steps = steps
}
}
let currentWeek: [StepCount] = [
StepCount(day: "20220717", steps: 4200),
StepCount(day: "20220718", steps: 15000),
StepCount(day: "20220719", steps: 2800),
StepCount(day: "20220720", steps: 10800),
StepCount(day: "20220721", steps: 5300),
StepCount(day: "20220722", steps: 10400),
StepCount(day: "20220723", steps: 4000)
]

要創建一個折線圖,為步數數據中的每個元素創建一個帶有LineMark的圖表。在LineMark的 X 值中指定工作日,在 Y 值中指定步數。注意,還需要導入Charts框架。

這就為步數數據創建了一個線形圖。由于只有一個系列的數據,ForEach 可以省略,數據可以直接傳遞給 Chart 初始化器。兩個部分都產生相同的折線圖。

import SwiftUI
import Charts
struct LineChart1: View {
var body: some View {
VStack {
GroupBox ( "Line Chart - Step Count") {
Chart {
ForEach(currentWeek) {
LineMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
}
GroupBox ( "Line Chart - Step Count") {
Chart(currentWeek) {
LineMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)

}
}
}
}
}

圖片

使用 SwiftUI Charts 創建的折線圖顯示每日步數

其他圖表

SwiftUI Charts 有許多可用的圖表選項。這些可以通過將圖表標記從LineMark改為其他類型的標記(如BarMark)來生成條形圖。

struct OtherCharts: View {
var body: some View {
VStack {
GroupBox ( "Line Chart - Step count") {
Chart(currentWeek) {
LineMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
GroupBox ( "Bar Chart - Step count") {
Chart(currentWeek) {
BarMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
GroupBox ( "Point Chart - Step count") {
Chart(currentWeek) {
PointMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
GroupBox ( "Rectangle Chart - Step count") {
Chart(currentWeek) {
RectangleMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
GroupBox ( "Area Chart - Step count") {
Chart(currentWeek) {
AreaMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
}
}
}
}
}

圖片

使用 SwiftUI 圖表創建的其他圖表類型,顯示每日步數

讓折線圖增加可訪問性

將圖表植入 SwiftUI 的一個好處是,可以很容易地使用可訪問性修飾符[2]使圖表變得可訪問。為 StepCount 添加一個計算屬性,將數據返回為一個字符串,可由 accessibilityLabel 使用。然后為圖表中的每個標記添加可訪問性標簽和值。

struct StepCount: Identifiable {
let id = UUID()
let weekday: Date
let steps: Int
init(day: String, steps: Int) {
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
self.weekday = formatter.date(from: day) ?? Date.distantPast
self.steps = steps
}
var weekdayString: String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd"
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
dateFormatter.locale = Locale(identifier: "en_US")
return dateFormatter.string(from: weekday)
}
}
GroupBox ( "Line Chart - Daily Step Count") {
Chart(currentWeek) {
LineMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
.accessibilityLabel($0.weekdayString)
.accessibilityValue("\($0.steps) Steps")
}
}

圖片

在 SwiftUI 圖表中使折線圖可訪問性

為折線圖添加多個數據序列

折線圖是比較兩個不同系列數據的好方法。創建第二個系列,即前一周的步數,并將這兩個系列添加到折線圖中。

let previousWeek: [StepCount] = [
StepCount(day: "20220710", steps: 15800),
StepCount(day: "20220711", steps: 7300),
StepCount(day: "20220712", steps: 8200),
StepCount(day: "20220713", steps: 25600),
StepCount(day: "20220714", steps: 16100),
StepCount(day: "20220715", steps: 16500),
StepCount(day: "20220716", steps: 3200)
]
let currentWeek: [StepCount] = [
StepCount(day: "20220717", steps: 4200),
StepCount(day: "20220718", steps: 15000),
StepCount(day: "20220719", steps: 2800),
StepCount(day: "20220720", steps: 10800),
StepCount(day: "20220721", steps: 5300),
StepCount(day: "20220722", steps: 10400),
StepCount(day: "20220723", steps: 4000)
]
let stepData = [
(period: "Current Week", data: currentWeek),
(period: "Previous Week", data: previousWeek)
]

第一次嘗試添加這兩個系列的數據沒有按預期顯示。

struct LineChart2: View {
var body: some View {
GroupBox ( "Line Chart - Daily Step Count") {
Chart {
ForEach(stepData, id: \.period) {
ForEach($0.data) {
LineMark(
x: .value("Week Day", $0.weekday, unit: .day),
y: .value("Step Count", $0.steps)
)
.accessibilityLabel($0.weekdayString)
.accessibilityValue("\($0.steps) Steps")
}
}
}
}
}
}

圖片

第一次嘗試在 SwiftUI Charts 中創建一個包含兩個系列步數數據的折線圖

顯示步數系列

在折線圖中顯示多個基于工作日的步數系列

最初嘗試在折線圖中顯示多組數據的問題是X軸使用了日期。當前的周數緊接著上一周,所以每一個點都是沿著X軸線性遞增繪制的。

有必要只用工作日作為X軸的數值,這樣所有的周日都在同一個X坐標上繪制。

在StepCount中添加另一個計算屬性,以便以字符串格式返回工作日的短日。

struct StepCount: Identifiable {
. . .
var shortDay: String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE"
return dateFormatter.string(from: weekday)
}
}

此 shortDay 用于圖表中 LineMarks 的 x 值。另外,前景的樣式設置為基于stepCount數組的周期。折線圖使用 x 軸的工作日來顯示兩周的步數,以便在周之間進行比較。

struct LineChart3: View {
var body: some View {
VStack {
GroupBox ( "Line Chart - Daily Step Count") {
Chart {
ForEach(stepData, id: \.period) { steps in
ForEach(steps.data) {
LineMark(
x: .value("Week Day", $0.shortDay),
y: .value("Step Count", $0.steps)
)
.foregroundStyle(by: .value("Week", steps.period))
.accessibilityLabel($0.weekdayString)
.accessibilityValue("\($0.steps) Steps")
}
}
}
.frame(height:400)
}
.padding()

Spacer()
}
}
}

圖片

SwiftUI圖表中帶有兩個系列的步數數據的折線圖

結論

在 SwiftUI Charts 中還有很多東西可以探索。使用這個框架顯然比從頭開始建立你自己的圖表要好。

參考資料

[1]Charts: ??https://developer.apple.com/documentation/charts。??

[2]可訪問性修飾符: ??https://developer.apple.com/documentation/swiftui/view-accessibility。??

責任編輯:姜華 來源: Swift社區
相關推薦

2022-11-18 09:03:09

SwiftUIiOS16

2023-03-15 09:00:43

SwiftUISlider

2011-12-21 13:25:33

JavaJFreeChart

2023-06-27 13:46:20

2023-11-10 18:07:42

Python折線圖折線

2022-02-23 15:17:04

鴻蒙OpenHarmonJacascript

2020-05-25 15:00:41

matplotlibplot()折線圖

2021-01-08 10:32:24

Charts折線圖數據可視化

2023-11-03 11:57:04

2011-05-11 10:58:39

iOS

2021-03-05 07:03:38

Pyecharts可視化工具復合圖

2020-04-25 20:11:23

Python熱力圖代碼

2009-09-22 11:54:42

ibmdwPHP

2015-08-06 13:44:21

swiftcocoapods

2013-06-03 15:38:16

iOS開發iOS SDK動態Action Sh

2022-01-17 09:22:42

SwiftUI App Store開源

2021-03-30 10:30:27

Charts.css可視化前端

2020-09-29 07:24:14

Python字典數據

2009-07-15 16:18:08

JSci.swing包

2023-12-18 15:02:00

PyechartsPython數據可視化工具
點贊
收藏

51CTO技術棧公眾號

色综合伊人色综合网| 欧美日韩精品在线| 99超碰麻豆| 国产a∨精品一区二区三区仙踪林| 青青久久av| 欧美色精品在线视频| 特级西西人体www高清大胆| 神宫寺奈绪一区二区三区| 天堂网中文在线观看| 久久亚洲天堂| 99久久综合99久久综合网站| 国产精品久久久久久久久免费| 99久久婷婷国产综合| 欧美xxxx在线| 91精品久久久久久久91蜜桃 | 日韩精品你懂的| 四虎亚洲精品| 国产精品天干天干在线综合| 成人综合色站| 国产男女无套免费网站| 日韩中文字幕1| 欧美日韩成人免费| 中国特黄一级片| 日本国产精品| 欧美成人精精品一区二区频| 国产主播中文字幕| 蜜桃视频在线观看播放| 综合色中文字幕| 日韩欧美亚洲精品| 你懂的视频在线观看| 国产精品18久久久久久久久 | 黄色一级视频片| 亚洲国产精品精华素| 国产精品水嫩水嫩| 欧美精品亚洲| 天堂中文在线官网| 成人午夜av电影| 91情侣在线视频| 国产精品毛片一区视频播 | 97人人模人人爽人人澡| 久久久久久久性潮| 欧美午夜理伦三级在线观看| 国产深夜男女无套内射| 成人三级小说| 亚洲国产综合在线| 真实国产乱子伦对白视频| 成人免费网址| 亚洲日本欧美天堂| 中文字幕第一页亚洲| 在线看av的网址| 中文字幕一区三区| 亚洲一区二区三区色| 最新97超碰在线| 国产精品久久久久久久久图文区 | www.自拍偷拍| 亚洲精品亚洲人成在线观看| 亚洲精品国精品久久99热| 国产女人18毛片水真多18| 亚洲精品午夜| 亚洲成**性毛茸茸| 风间由美一二三区av片| 欧美美女啪啪| 亚洲欧美日本精品| 日韩一级av毛片| 精品免费一区二区| 中文字幕视频在线免费欧美日韩综合在线看 | 色阁综合伊人av| 久久久精品少妇| 欧美二区不卡| 性色av一区二区三区在线观看| 中文字幕激情小说| 日韩在线观看一区二区| 成人福利免费观看| 亚洲精品18在线观看| 99这里只有久久精品视频| 久久久久久一区| 91涩漫在线观看| 亚洲精品日韩一| 东北少妇不带套对白| 黄色综合网址| 欧美剧在线免费观看网站| 佐山爱在线视频| 精品国产乱子伦一区二区| 国产视频欧美视频| 美国一级片在线观看| 激情综合电影网| 国产精品aaaa| 国产成人a人亚洲精品无码| 菠萝蜜视频在线观看一区| 日韩欧美亚洲在线| 黄页网站在线| 欧美色精品天天在线观看视频| av在线免费观看不卡| 色吊丝一区二区| www.欧美免费| 五月婷婷开心网| 狠狠网亚洲精品| 久久久久久亚洲精品不卡4k岛国| 欧美成人三区| 色综合久久久久久久| 日韩va在线观看| 特黄特色欧美大片| 久久香蕉国产线看观看av| www.av麻豆| 国产一区亚洲一区| 日本三级中国三级99人妇网站| 久久黄色美女电影| 色悠久久久久综合欧美99| 鲁一鲁一鲁一鲁一av| 久草精品视频| 久久av.com| 波多野结衣电车痴汉| 成人永久看片免费视频天堂| 亚洲精品一区二区三区蜜桃久| 成人在线免费观看黄色| 88在线观看91蜜桃国自产| 亚洲黄色小说视频| 亚洲黄色三级| 91av一区二区三区| 五月天婷婷在线视频| 色偷偷一区二区三区| 一级黄色片毛片| 91精品蜜臀一区二区三区在线| 日韩免费精品视频| 天堂在线中文网| 亚洲一二三专区| 中文字幕人妻无码系列第三区| 欧美伦理影院| 国产精品18久久久久久首页狼| 国精品人妻无码一区二区三区喝尿 | 在线免费观看亚洲视频| 美女国产一区二区三区| 欧美美乳视频网站在线观看| sm捆绑调教国产免费网站在线观看| 欧美军同video69gay| 殴美一级黄色片| 奇米影视一区二区三区| 日本一区二区精品| 国产综合色区在线观看| 亚洲精品在线视频| 亚洲欧美偷拍视频| 久久综合久色欧美综合狠狠| 国产亚洲欧美在线视频| 天堂俺去俺来也www久久婷婷| 欧美激情精品久久久久久| 国产农村妇女毛片精品久久| 亚洲日本在线天堂| 男人女人拔萝卜视频| 你懂的成人av| 成人在线免费观看一区| 国产探花视频在线观看| 欧美成人官网二区| 91在线看视频| www国产精品av| 欧在线一二三四区| 日韩在线观看| 91九色极品视频| 日本在线视频网址| 亚洲成人免费在线视频| 久久综合久久鬼| 91偷拍与自偷拍精品| 黄色片视频在线免费观看| 久草精品在线| 国产精品一区二区久久国产| 日本在线观看网站| 日韩精品一区二区三区在线播放 | 日本精品在线| 91精品国产综合久久精品图片| 精品国产乱码久久久久久鸭王1| 国产精品77777| 丁香花在线影院观看在线播放| 偷拍精品福利视频导航| 国产精品第三页| 黄色视屏免费在线观看| 亚洲电影免费观看高清完整版在线观看| 不卡的免费av| 国产亚洲短视频| 久久国产激情视频| 一区免费在线| 日韩高清av| 国模大尺度视频一区二区| 欧美精品18videosex性欧美| 色视频在线观看福利| 欧美唯美清纯偷拍| 久草免费在线观看视频| 久久久久久亚洲综合| 怡红院亚洲色图| 亚洲国产导航| 亚洲欧洲日韩精品| 红杏aⅴ成人免费视频| 国产精品极品美女粉嫩高清在线| 一二三四区在线观看| 日韩理论片久久| av男人天堂网| 色偷偷一区二区三区| 久久久久久久久久久久久久免费看| 久久蜜臀中文字幕| 丰满少妇中文字幕| 美女诱惑一区二区| av高清在线免费观看| 色狮一区二区三区四区视频| 国产欧美日本在线| 99热这里有精品| 欧美专区中文字幕| 日日夜夜天天综合入口| 影音先锋日韩有码| 五月婷婷丁香花| 欧美一区二区美女| 国产日韩在线免费观看| 性久久久久久久久| 极品久久久久久| 国产精品天天看| 亚洲一区二区三区日韩| www.欧美亚洲| 美女伦理水蜜桃4| 精品一区二区三区在线视频| 一本久道中文无码字幕av| 亚洲精选一区| 国产在线视频综合| 国产精品黑丝在线播放 | 综合激情婷婷| 一区二区三视频| 精品欧美久久| 欧洲高清一区二区| 天堂俺去俺来也www久久婷婷| 国产高清一区二区三区| www欧美在线观看| 国产精品欧美一区二区三区奶水| 婷婷电影在线观看| 久久久久成人网| 欧美黄色视屏| 欧美成人免费网| v天堂福利视频在线观看| 色悠悠久久久久| 视频免费一区| zzjj国产精品一区二区| 1024国产在线| 久久精品99久久久久久久久 | 99久久精品国产成人一区二区| 欧美视频日韩视频| 中文字幕精品在线观看| 欧洲中文字幕精品| 亚洲综合成人av| 欧美日韩aaaaaa| 亚洲熟女乱色一区二区三区久久久 | 亚洲高清在线看| 色天使色偷偷av一区二区| 福利网址在线观看| 色综合久久久久网| 最近中文字幕在线免费观看| 欧美色男人天堂| 91好色先生tv| 日韩欧美中文字幕一区| 国精产品一品二品国精品69xx | 国产亚洲色婷婷久久99精品91| 成人av在线影院| 亚洲一区二区三区无码久久| 久久嫩草精品久久久精品一| 日韩一级片在线免费观看| 国产精品九色蝌蚪自拍| 91插插插插插插| 亚洲大型综合色站| 日韩精品一区二区亚洲av| 欧美亚男人的天堂| 国产jzjzjz丝袜老师水多| 欧美精品一区二区三区很污很色的| 日韩有码第一页| 亚洲日本中文字幕免费在线不卡| 一区二区三区视频网站| 美女视频黄免费的亚洲男人天堂| 日本资源在线| 国产盗摄xxxx视频xxx69| 国产a亚洲精品| 亚洲自拍中文字幕| 欧美挤奶吃奶水xxxxx| 日本一区二区精品视频| 亚欧美无遮挡hd高清在线视频| 国产精品无码电影在线观看| 国产精品最新自拍| www.99r| 成人激情视频网站| 亚洲第一综合网| 亚洲综合偷拍欧美一区色| 天天干在线播放| 91精品国产一区二区三区蜜臀| 五月天婷婷激情网| 久久久999精品| 625成人欧美午夜电影| 91精品久久久久久久久久另类 | 99久久婷婷国产综合精品| 美国美女黄色片| 亚洲电影激情视频网站| 瑟瑟视频在线免费观看| 亚洲成年人影院在线| 日本激情视频在线观看| 国产69精品久久久久久| 国产一区二区在线观| 欧美在线3区| 狠狠入ady亚洲精品经典电影| 不卡av免费在线| 91亚洲精品乱码久久久久久蜜桃 | 精品国产精品三级精品av网址| 中文字幕在线观看精品| 亚洲国产精品字幕| 激情影院在线观看| 国产成人精品一区二区三区| 成人午夜大片| 中文字幕日韩精品久久| 久久精品一区二区国产| 亚洲精品第二页| 亚洲免费在线观看视频| 国产在线观看第一页| 日韩成人在线视频观看| 美女精品导航| 91久久久在线| 日韩欧美网站| 少妇黄色一级片| 久久亚洲精品国产精品紫薇| 豆国产97在线 | 亚洲| 日韩欧美不卡在线观看视频| 色综合久久久久综合一本到桃花网| 欧美专区中文字幕| 日本一区福利在线| 精品丰满人妻无套内射| 国产一区二区三区四区五区美女| 能直接看的av| 欧美偷拍一区二区| 黄网在线观看| 日韩免费精品视频| 一区二区三区韩国免费中文网站| 日韩精品视频在线观看视频 | 亚洲一区不卡| 插我舔内射18免费视频| 亚洲一级电影视频| 狠狠综合久久av一区二区| 色综合久久88| 一区二区三区国产好| japanese在线播放| 国产在线看一区| 少妇影院在线观看| 日韩午夜在线影院| 欧美78videosex性欧美| 大波视频国产精品久久| 黑人一区二区三区四区五区| 精品国产一二区| 午夜精品视频在线观看| 视频国产在线观看| 欧洲永久精品大片ww免费漫画| 欧美重口另类| 欧美牲交a欧美牲交aⅴ免费真| 久久亚洲春色中文字幕久久久| 欧美激情黑白配| 这里只有精品丝袜| 国产精品麻豆| 日韩精品在线观看av| 97aⅴ精品视频一二三区| 最新中文字幕一区| 少妇高潮 亚洲精品| 国产一区二区三区免费观看在线| 91麻豆天美传媒在线| 成人免费观看av| 亚洲另类在线观看| 综合网中文字幕| 久久国产精品美女| 国产一区二区视频播放| 国产偷v国产偷v亚洲高清| 一级特黄aa大片| 欧美精品videos性欧美| 亚洲小说图片视频| 中文字幕av不卡在线| 亚洲精品老司机| 欧美拍拍视频| 成人激情视频在线播放| 欧美日韩伊人| 公侵犯人妻一区二区三区| 欧美日产国产精品| 蜜臀av在线| 日韩精品伦理第一区| 国产毛片精品视频| 国产一级18片视频| 久久久久北条麻妃免费看| 国产精品黄网站| 无需播放器的av| 亚洲国产另类av| 成人免费一区二区三区视频网站| 999国产视频| 三级在线观看一区二区| 中文字幕av免费在线观看| 国产视频久久久久久久| 日韩免费精品| 男人插女人下面免费视频| 亚洲免费av观看| 国产三级电影在线| 国产精品亚洲不卡a| 美女视频黄 久久| 97超碰人人干| 美女啪啪无遮挡免费久久网站| 九九在线精品| 日韩Av无码精品| 777奇米四色成人影色区|