macOS、iOS 和 tvOS 的迷你图

一个轻量级的迷你图组件,支持 Swift、SwiftUI、macCatalyst 和 Objective-C。

CocoaPods Swift Package Manager

什么是迷你图?

迷你图是一种非常小的图表,通常不绘制轴或坐标。 它以简单且高度浓缩的方式呈现某个测量值(通常是随时间变化)的一般变化形状,例如温度或股市价格。 迷你图足够小,可以嵌入到文本中,或者可以将多个迷你图组合在一起作为小倍数元素。 典型的图表旨在显示尽可能多的数据,并与文本流分开,而迷你图则旨在简洁、令人难忘,并位于讨论它们的位置。

来源:维基百科

什么不是迷你图?

DSFSparkline不是设计成一个全功能的图形库。 它旨在轻量级,在应用程序中创建小型、令人难忘的图表。

如果您需要诸如标签、实时更新、轴标签、交互性、图例或更大尺寸的美观图表等功能,您可能更适合使用 Charts 库Core plotSciChart (付费)。 您可以在这里找到更多。

功能

一言以蔽之 - 给我看看一些东西!

创建一个具有简单折线覆盖图的 Retina 比例 (144dpi) 位图
// A datasource with a simple set of data
let source = DSFSparkline.DataSource(values: [4, 1, 8, 7, 5, 9, 3], range: 0 ... 10)

let bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface
let stack = DSFSparklineOverlay.Line()      // Create a line overlay
stack.dataSource = source                   // Assign the datasource to the overlay
bitmap.addOverlay(stack)                    // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)

// Embed a sparkline in an NSAttributedString
let attributedString = bitmap.attributedString(size: CGSize(width: 40, height: 18), scale: 2)
创建一个具有零线和高亮范围覆盖的 Swift-UI 折线图迷你图
fileprivate let SwiftUIDemoDataSource: DSFSparkline.DataSource = {
   let d = DSFSparkline.DataSource(windowSize: 20, range: 0 ... 1, zeroLineValue: 0.5)
     d.push(values: [
        0.72, 0.84, 0.15, 0.16, 0.30, 0.58, 0.87, 0.44, 0.02, 0.27,
        0.48, 0.16, 0.15, 0.14, 0.81, 0.53, 0.67, 0.52, 0.07, 0.50
     ])
     return d
  }()

struct SuperCoolLineSpark: View {
   // The overlay representing the zero-line for the data source
   var zeroOverlay: DSFSparklineOverlay = {
      let zeroLine = DSFSparklineOverlay.ZeroLine()
      zeroLine.dataSource = SwiftUIDemoDataSource
      zeroLine.dashStyle = []
      return zeroLine
   }()

   // The overlay to draw a highlight between range 0 ..< 0.2
   var rangeOverlay: DSFSparklineOverlay = {
      let highlight = DSFSparklineOverlay.RangeHighlight()
      highlight.dataSource = SwiftUIDemoDataSource
      highlight.highlightRange = 0.0 ..< 0.2
      highlight.fill = DSFSparkline.Fill.Color(DSFColor.gray.withAlphaComponent(0.4).cgColor)
      return highlight
   }()

   // The actual line graph
   var lineOverlay: DSFSparklineOverlay = {
      let lineOverlay = DSFSparklineOverlay.Line()
      lineOverlay.dataSource = SwiftUIDemoDataSource

      lineOverlay.primaryStrokeColor = DSFColor.systemBlue.cgColor
      lineOverlay.primaryFill = DSFSparkline.Fill.Color(DSFColor.systemBlue.withAlphaComponent(0.3).cgColor)

      lineOverlay.secondaryStrokeColor = DSFColor.systemYellow.cgColor
      lineOverlay.secondaryFill = DSFSparkline.Fill.Color(DSFColor.systemYellow.withAlphaComponent(0.3).cgColor)

      lineOverlay.strokeWidth = 1
      lineOverlay.markerSize = 4
      lineOverlay.centeredAtZeroLine = true

      return lineOverlay
   }()

   var body: some View {
      DSFSparklineSurface.SwiftUI([
         rangeOverlay,    // range highlight overlay
         zeroOverlay,     // zero-line overlay
         lineOverlay,     // line graph overlay
      ])
      .frame(width: 150, height: 40)
   }
}

可用的图形类型

折线

一个简单的折线迷你图。 可以将折线居中于零线,以指示正值和负值。 您还可以将(可选)标记添加到数据点。

您可以通过提供绘图回调块 (markerDrawingBlock) 来自定义绘制标记,您可以在其中自定义绘制哪些标记(例如,仅最小值和最大值)以及如何绘制它们。

标准 居中
插值 插值居中
标准标记 插值标记
自定义标记(仅最小值/最大值) 自定义标记(最近 5 个值)
使用自定义标记的 Swift 示例
//
// A custom marker drawing function that draws the maximum value in green, the minimum value in red
//
self.myLineView.markerDrawingBlock = { context, markerFrames in
   // Get the frames containing the minimum and maximum values
   if let minMarker = markerFrames.min(by: { (a, b) -> Bool in a.value < b.value }),
      let maxMarker = markerFrames.min(by: { (a, b) -> Bool in a.value > b.value }) {

      // Draw minimum marker

      context.setFillColor(DSFColor.systemRed.cgColor)
      context.fill(minMarker.rect)
      context.setLineWidth(0.5)
      context.setStrokeColor(DSFColor.white.cgColor)
      context.stroke(minMarker.rect)

      // Draw maximum marker

      context.setFillColor(DSFColor.systemGreen.cgColor)
      context.fill(maxMarker.rect)

      context.setLineWidth(0.5)
      context.setStrokeColor(DSFColor.white.cgColor)
      context.stroke(maxMarker.rect)
   }
}

条形

一个简单的条形图迷你图。 可以将条形居中于零线,以指示正值和负值。

标准 居中

堆叠线

堆叠线迷你图与条形图类似,只是它不分离出单独的列。 堆叠线可以居中于零线,以指示正值和负值。

标准 居中

条纹

条纹图。 条纹图的一个很好的例子是“变暖条纹”气候图

来自数据源的值被映射到提供的渐变

标准 整数(像素边界)

类似于 Activity Viewer 的 CPU 历史记录图的点迷你图

标准 反转

胜/负/平

胜负图,其中数据源中的正值表示为“胜”,负值表示为“负”,零值表示为“平”。

胜/负 胜/负/平

平板

平板图,其中数据源中的正值表示为填充圆圈,负值表示为空心圆圈。 该行为与胜负图相同。

标准

饼图

一个基本的饼图迷你图

标准

数据条

数据条迷你图。 支持百分比和总计类型。

百分比 总计

百分比条

百分比条迷你图接受单个值 (0 ... 1),并绘制一个包含该值的水平条形图,带有可选的文本标签。

雨刷量表

一个带有单个值 (0 ... 1) 的简单量表。 量表中显示的颜色可以是以下之一

标准

活动网格

Github 风格的活动网格。 每个单元格代表一个渐进中的离散值,带有颜色

圆形进度

圆形进度图

模拟健康环
   

圆形量表

圆形量表

演示

您可以在 Demos/Samples 子文件夹中的项目中找到许多迷你图示例,提供 macOS(swift 和 objc)、iO、tvOS、macCatalyst 和 SwiftUI 的示例。

Demos/Playground 子文件夹中还有一个简单的 Xcode Playground,您可以在其中使用不同的迷你图类型

构建您的迷你图

使用预构建的视图

预构建的视图对于使用 SwiftUI 或通过 Interface Builder 快速添加迷你图非常有用。 这些视图的样式和自定义设置略有限制,但比直接使用覆盖层实现起来要快得多。

在大多数情况下,预构建的类型将满足您的所有需求。

如果您在 v4 之前使用过 DSFSparklines,这些是您过去用于显示迷你图的原始视图类型。

使用覆盖层

覆盖迷你图有三个基本的构建块。 与预构建的视图相比,覆盖迷你图更加灵活和可配置,但设置起来更复杂。

表面

表面代表迷你图的目标。 该库提供了许多内置表面

数据源

数据源为迷你图提供数据。 数据源可以在多个覆盖层或预构建类型(见下文)之间共享,以提供数据源中包含的数据的不同“视图”。 并且如果更新了 DataSource,所有观察该数据源的迷你图覆盖层都将自动重新渲染。

目前有两种类型的数据源可用

DSFSparkline.DataSource

一个 DataSource,其中包含可以通过将新值推送到源来更新的值。

更多详情

窗口大小 (WindowSize)

DataSource 定义了一个“windowSize”——要在覆盖层上绘制的最大值数量。当值被推送到 DataSource 中时,任何不再fit在 DataSource 窗口中的值都将被丢弃。

代码示例
/// Swift
dataSource.windowSize = 30
assert(dataSource.windowSize == 30)
/// Objective-C
[dataSource setWindowSize:30];
assert([dataSource windowSize] == 30);

Y 轴范围 (Y-range)

范围定义了要在微型图 (sparkline) 中显示的上限值和下限值。 推送到数据源中的任何值在绘制到该范围时都将被限制在此范围内。

如果未设置范围(即 nil),则任何覆盖图都将自动调整大小以适应源中的整个值范围。 例如,如果值为 [1, 2, 3, 4],则范围隐式设置为 1 ... 4。 如果值为 [-10, 100, 33],则范围隐式设置为 -10 ... 100。

代码示例
/// Swift
dataSource.range = -1.0 ... 1.0
/// Objective-C
[dataSource setRangeWithLowerBound:-1.0 upperBound:1.0];

零线值 (Zero-line value)

零线定义了微型图覆盖图应视为“零”的点。 例如,可以居中的图形(线形图、条形图和堆叠线形图)使用零线值来定义图形居中位置。

零线值默认为零。

您可以通过向您的表面添加一个DSFSparklineOverlay.ZeroLine来绘制微型图的零线。

代码示例
/// Swift
dataSource.zeroLineValue = 0.2
/// Objective-C
[dataSource setZeroLineValue:0.2];

添加值 (Adding values)

您可以使用push函数将新值推送到数据源中。 数据源中早于数据源的windowSize的值将被丢弃。

当值被推送到数据源中时,分配给该数据源的任何覆盖图都将自动更新。

代码示例
/// Swift
dataSource.push(value: 4.5)
dataSource.push(values: [6, 7, 8])
/// Objective-C
[dataSource pushWithValue:@(4.5)];

您可以使用set函数替换数据源中的所有值。 set 函数还会将数据源的windowSize更改为传入的值数组的大小。

分配给该数据源的任何覆盖图都将自动更新。

代码示例
/// Swift
datasource.set(values: [
   0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
   0.0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0
])
/// Objective-C
[datasource setWithValues:
   @[@(0.0), @(0.1), @(0.2), @(0.3), @(0.4), @(0.5), @(0.6), @(0.7), @(0.8), @(0.9), @(1),
     @(0.0), @(-0.1), @(-0.2), @(-0.3), @(-0.4), @(-0.5), @(-0.6), @(-0.7), @(-0.8), @(-0.9), @(-1)]];

DSFSparkline.StaticDataSource

一个包含静态值集的数据源。 某些类型的微型图使用单个“set”数据,不提供历史上下文。

更多详情
/// Swift
let dataSource = DSFSparkline.StaticDataSource([1, 2, 3])
/// Objective-C
DSFSparklineStaticDataSource* dataSource = [[DSFSparklineStaticDataSource alloc] init: @[@(1), @(2), @(3)]];

覆盖图 (Overlays)

覆盖图代表微型图的各个可视组件。 您可以按任意顺序向您的表面添加任意数量的覆盖图。 例如,您可以使用相同的数据源将两种不同的图形类型叠加到同一表面上。 并且由于覆盖图可以共享它们的数据源,因此如果数据发生更改(例如,响应push),所有使用相同源的覆盖图都将自动更新。

例如,有一个覆盖图突出显示数据的 y 轴范围。 或者,如果您想要一些网格线,您可以使用网格线覆盖图添加它们。

您可以将覆盖图的不同实例添加到同一个微型图。 例如,如果您想要添加多个范围高亮,您可以将多个“高亮”覆盖图添加到微型图表面。

添加覆盖图的顺序决定了它们在微型图中的 z 轴顺序。 例如,如果您想将网格绘制在图形的顶部,您可以在添加网格覆盖图之前添加图形覆盖图。

覆盖图使您的微型图可以根据需要变得复杂或简单。

图形类型 (Graph types)

动态 (Dynamic)

当值被“推送”到其数据源上时,动态图形会自动更新其覆盖图。 添加数据后,分配的覆盖图会自动更新以反映新数据。 如果通过 push 或 set 添加了更多数据,则数据将被添加到数据源,关联的视图将自动更新以反映新数据。 不再属于数据源窗口范围内的旧数据将被丢弃。

这提供了在图形的广度上显示历史数据集的能力。

`DSFSparklineOverlay.Line`
let bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface
let line = DSFSparklineOverlay.Line()      // Create a line overlay
line.strokeWidth = 1
line.primaryFill = primaryFill
line.dataSource = source                   // Assign the datasource to the overlay
bitmap.addOverlay(line)                    // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.StackLine`
let bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface
let stack = DSFSparklineOverlay.Stackline()  // Create a stackline overlay
stack.dataSource = source                    // Assign the datasource to the overlay
stack.strokeWidth = 1
stack.primaryFill = primaryFill
bitmap.addOverlay(stack)                     // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.Bar`
let bitmap = DSFSparklineSurface.Bitmap()   // Create a bitmap surface
let bar = DSFSparklineOverlay.Bar()         // Create a bar overlay
bar.dataSource = source                     // Assign the datasource to the overlay
bar.primaryFill = primaryFill
bitmap.addOverlay(bar)                      // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.Dot`
let bitmap = DSFSparklineSurface.Bitmap()  // Create a bitmap surface
let dot = DSFSparklineOverlay.Dot()        // Create a dot graph overlay
dot = biggersource                         // Assign the datasource to the overlay
bitmap.addOverlay(dot)                     // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 32, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.WinLossTie`
let bitmap = DSFSparklineSurface.Bitmap()          // Create a bitmap surface
let winLossTie = DSFSparklineOverlay.WinLossTie()  // Create a win-loss-tie overlay
winLossTie.dataSource = winloss                    // Assign the datasource
bitmap.addOverlay(winLossTie)                      // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 75, height: 12, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.Tablet`
let bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface
let stack = DSFSparklineOverlay.Tablet()     // Create a tablet overlay
stack.dataSource = winloss                   // Assign a datasource to the overlay
bitmap.addOverlay(stack)                     // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 90, height: 16, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.Stripes`
let bitmap = DSFSparklineSurface.Bitmap()    // Create a bitmap surface
let stack = DSFSparklineOverlay.Stripes()    // Create a stripes overlay
stack.dataSource = .init(values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
bitmap.addOverlay(stack)                     // And add the overlay to the surface.

// Generate an image with retina scale
let image = bitmap.image(width: 90, height: 16, scale: 2)

// Do something with 'image'

静态 (Static)

静态图形具有固定的值集(例如,饼图)。 当将新的静态数据源分配给它时,覆盖图会更新。

`DSFSparklineOverlay.Pie`
let bitmap = DSFSparklineSurface.Bitmap()
let pie = DSFSparklineOverlay.Pie()
pie.dataSource = DSFSparkline.StaticDataSource([10, 55, 20])
pie.lineWidth = 0.5
pie.strokeColor = CGColor.black

bitmap.addOverlay(pie)

// Generate an image with retina scale
let image = bitmap.image(width: 18, height: 18, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.DataBar`
let bitmap = DSFSparklineSurface.Bitmap()
let stack = DSFSparklineOverlay.DataBar()
stack.dataSource = DSFSparkline.StaticDataSource([10, 20, 30])
stack.lineWidth = 0.5
stack.strokeColor = CGColor.black

bitmap.addOverlay(stack)

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 18, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.PercentBar`
let bitmap = DSFSparklineSurface.Bitmap()
let percentBar = DSFSparklineOverlay.PercentBar(value: 0.3)

bitmap.addOverlay(percentBar)

// Generate an image with retina scale
let image = bitmap.image(width: 50, height: 18, scale: 2)!

// Do something with 'image'
`DSFSparklineOverlay.WiperGauge`
let bitmap = DSFSparklineSurface.Bitmap()
let wiperGauge = DSFSparklineOverlay.WiperGauge()
wiperGauge.value = 0.75

bitmap.addOverlay(wiperGauge)

// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 50, height: 25, scale: 2)

// Do something with 'image'
`DSFSparklineOverlay.ActivityGrid`
let bitmap = DSFSparklineSurface.Bitmap()
let activityGrid = DSFSparklineOverlay.ActivityGrid()
activityGrid.dataSource = DSFSparkline.StaticDataSource(values: [...])
activityGrid.verticalCellCount = 1

bitmap.addOverlay(activityGrid)

// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 200, height: 14, scale: 2)

// Do something with 'image'
`DSFSparklineOverlay.CircularGauge`
let bitmap = DSFSparklineSurface.Bitmap()
let gauge = DSFSparklineOverlay.CircularGauge()
gauge.value = 0.66

bitmap.addOverlay(gauge)

// Generate an image of the wiper gauge with retina scale
let image = bitmap.image(width: 40, height: 40, scale: 2)

// Do something with 'image'

组件类型 (Component types)

组件表示本身不是图形的覆盖图。 示例包括网格线、零线、高亮等。 组件使用相同的数据源,以便与其关联的图形对齐。

名称 (Name) 描述 (Description)
DSFSparklineOverlay.ZeroLine 在微型图的“零线”位置绘制一条水平线。 零线由数据源定义,默认情况下为零,但可以更改。
DSFSparklineOverlay.RangeHighlight 突出显示微型图上的一系列 y 轴值
DSFSparklineOverlay.GridLines 在微型图上指定的 y 轴值处绘制线条

使用预构建的视图

DSFSparkline 提供了许多“预构建”的微型图视图,范围更有限,旨在更快地添加到您的项目中。

每个预构建的微型图视图都有一个 SwiftUI 配套视图。

可用的预构建类型 (Available prebuilt types)

Swift 代码示例 (Sample Swift code)
// Create the view
let sparklineView = DSFSparklineLineGraphView()
sparklineView.graphColor = UIColor.blue
sparklineView.showZeroLine = true

// Create the datasource and assign to the view
let sparklineDataSource = DSFSparklineDataSource(windowSize: 30, range: -1.0 ... 1.0)
sparklineView.dataSource = sparklineDataSource



// Add a single new data element to the sparkline
sparklineDataSource.push(value: 0.7)                          // view automatically updates with new data

// Add a set of data to the sparkline
sparklineDataSource.push(values: [0.3, -0.2, 1.0])            // view automatically updates with new data

// Completely replace the sparkline data with a new set of data
sparklineDataSource.set(values: [0.2, -0.2, 0.0, 0.9, 0.8])   // view automatically resets to new data
SwiftUI 代码示例 (Sample SwiftUI code)
struct SparklineView: View {

   let leftDataSource: DSFSparkline.DataSource
   let rightDataSource: DSFSparkline.DataSource
   
   let BigCyanZeroLine = DSFSparkline.ZeroLineDefinition(
      color: .cyan,
      lineWidth: 3,
      lineDashStyle: [4,1,2,1]
   )
   
   var body: some View {
      HStack {
         DSFSparklineLineGraphView.SwiftUI(
            dataSource: leftDataSource,
            graphColor: DSFColor.red,
            interpolated: true)
         DSFSparklineBarGraphView.SwiftUI(
            dataSource: rightDataSource,
            graphColor: DSFColor.blue,
            lineWidth: 2,
            showZeroLine: true,
            zeroLineDefinition: BigCyanZeroLine)
      }
   }
}

预构建自定义 (Prebuilt customizations)

视图类型和设置 (View Types and settings)

表示可查看的设置和显示。 当前可用的视图类型有:-

常见的显示自定义 (Common display customizations)

设置 (Setting) 类型 (Type) 描述 (Description)
graphColor NSColor
UIColor
绘制微型图时要使用的颜色

可以显示零线的图形的常见元素(线形图/条形图/堆叠线形图)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
showZeroLine Bool 在 y 轴上的零线点处绘制虚线
zeroLineColor NSColor
UIColor
y 轴上“零线”的颜色。
zeroLineWidth CGFloat y 轴上“零线”的宽度
zeroLineDashStyle [CGFloat] 绘制零线时要使用的短划线模式

可以围绕零线居中的图形的常见元素(线形图/条形图/堆叠线形图)

设置 (Setting) 类型 (Type) 描述 (Description)
centeredAtZeroLine Bool 图形是否应在零线处居中?
lowerGraphColor NSColor
UIColor
用于绘制零线下值的颜色。 如果为 nil,则与图形颜色相同

折线图自定义 (DSFSparklineLineGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
lineWidth CGFloat 线的宽度
interpolation Bool 在点之间插入曲线
lineShading Bool 为线条下方的区域着色
shadowed Bool 在线条下方绘制阴影
markerSize CGFloat (可选)使用该点的线条颜色,在图形中的每个数据点处绘制指定大小的标记
markerSize CGFloat (可选)使用该点的线条颜色,在图形中的每个数据点处绘制指定大小的标记
markerDrawingBlock 允许自定义绘制标记的回调块(如果markerSize > 1)

柱状图自定义 (DSFSparklineBarGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
lineWidth CGFloat 线的宽度
barSpacing CGFloat 每个柱状图之间的间距

条纹图自定义 (DSFSparklineStripesGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
integral Bool 如果为 true,则在像素边界上绘制条纹,以获得漂亮的干净线条
gradient DSFGradient 将数据源值映射到颜色时使用的颜色渐变。

点状图自定义 (DSFSparklineDotGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
upsideDown Bool 如果为 true,则从图表的顶部向下绘制
unsetGraphColor NSColor
UIColor
绘制背景时使用的颜色

盈亏图自定义 (DSFSparklineWinLossGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
lineWidth CGFloat 描边的线宽
barSpacing CGFloat 每个柱状图之间的间距
winColor NSColor
UIColor
用于“赢”的颜色
lossColor NSColor
UIColor
用于“亏”的颜色
tieColor NSColor
UIColor
(可选) 用于“平局”的颜色。如果为 nil,则不绘制平局 (0) 值
默认情况下,不绘制“平局”值。

平板图自定义 (DSFSparklineTabletGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource DSFDataSource 图形的数据源
lineWidth CGFloat 描边的线宽
barSpacing CGFloat 每个柱状图之间的间距
winColor NSColor
UIColor
绘制“赢”的填充圆的颜色
lossColor NSColor
UIColor
绘制“亏”的填充圆的颜色

饼图自定义 (DSFSparklinePieGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource [CGFloat] 饼图中要显示的数据
palette DSFSparklinePalette 绘制图表时使用的调色板
strokeColor NSColor
UIColor
(可选) 在每个分段之间绘制的线条颜色。 如果为 nil,则不绘制线条
lineWidth CGFloat 在每个分段之间绘制的线条宽度
animated Bool 如果为 true,则在设置数据源时,各个段会动画进入视图
animationDuration CGFloat 动画的持续时间

数据条图自定义 (DSFSparklineDataBarGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
dataSource [CGFloat] 饼图中要显示的数据
maximumTotalValue CGFloat 如果 <= 0,则数据表示总数的百分比;如果 > 0,则表示数据条最右边的值
palette DSFSparklinePalette 绘制时使用的调色板。
strokeColor NSColor
UIColor
(可选) 在每个分段之间绘制的线条颜色。 如果为 nil,则不绘制线条
lineWidth CGFloat 在每个分段之间绘制的线条宽度
unsetColor NSColor
UIColor
(可选) 如果设置了最大值,并且各个段不适合总数,则此颜色用作背景颜色
animated Bool 如果为 true,则在设置数据源时,各个段会动画进入视图
animationDuration CGFloat 动画的持续时间

百分比条图自定义 (DSFSparklinePercentBarGraphView)

设置 (Setting) 类型 (Type) 描述 (Description)
value CGFloat 饼图中要显示的值
displayStyle Style 绘制图表时应用的样式
cornerRadius CGFloat 条形的圆角半径。
showLabel Bool 我们是否应该在百分比条形图上绘制文本标签?
underBarColor NSColor
UIColor
百分比条形图的条形背景颜色
underBarTextColor NSColor
UIColor
在背景上显示的文本颜色
barColor NSColor
UIColor
百分比条形图的条形颜色
barTextColor NSColor
UIColor
在条形上显示的文本颜色
fontName String 标签字体的名称
fontSize CGFloat 标签字体的大小
shouldAnimate Bool 如果为 true,则在设置数据源时,各个段会动画进入视图
animationDuration CGFloat 动画的持续时间
leftInset. CGFloat 条形从控件左侧的缩进
topInset CGFloat 条形从控件顶部的缩进
rightInset CGFloat 条形从控件右侧的缩进
bottomInset CGFloat 条形从控件底部的缩进

集成

Demos 子文件夹中提供了针对每个支持平台的演示。 演示使用 CocoaPods,因此您需要在 Demos 文件夹中执行 pod install

将库导入到您的源文件中

Cocoapods

pod 'DSFSparkline', :git => 'https://github.com/dagronf/DSFSparkline/'

Swift package manager

https://github.com/dagronf/DSFSparkline 添加到您的项目。

屏幕截图

在应用程序中

macOS 暗黑 macOS 浅色 iOS

Interface Builder

macOS tvOS

SwiftUI

支持 NSAttributedString

动画

变更

6.0.0

5.2.0

5.1.0

5.0.0

4.6.0

4.3.0

4.2.0

4.1.2

4.1.1

4.1.0

4.0.0

对绘图代码进行了大量的重新架构(以前直接在视图中),将其分为覆盖层和表面,这些覆盖层和表面更加灵活(例如,能够绘制迷你图位图而无需创建视图)

以前的 view/swiftui 类型仍然可用 - 它们已使用新的覆盖方案重建,并在文档中称为“预构建”类型。 这允许与以前版本的库向后兼容。 但请注意,鉴于预构建视图已被重写,因此可能会出现细微的视觉差异。

3.7.0

3.6.1

3.6.0

3.5.2

3.5.1

3.5.0

3.4.0

3.3.0

3.2.0

3.1.0

3.0.0

您可以通过数据源上的 zeroLineValue 设置绘制“零”线的位置。

2.0.0

许可证

麻省理工学院。 随心所欲地使用它,只需注明我的作品即可。 如果您在某个地方使用它,请告诉我,我很乐意听到它!

MIT License

Copyright (c) 2023 Darren Ford

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.