TornadoFX编程指南,第8章,图表

译自《Charts

图表

JavaFX提供了一组方便的图表(handy set of charts),可快速显示数据可视化。 虽然有更丰富的图表库,如JFreeChartOrson Charts,可以与TornadoFX一起使用,但内置的JavaFX图表可满足大多数可视化需求。 当数据填充(populated)或更改(changed)时,它们也具有优雅的动画。

TornadoFX带有几个构建器,以使用函数结构简化图表声明。

饼图

PieChart是一个常见的视觉辅助,以说明整体的比例。 它在结构上比XY图更简单,这个我们稍后将会了解。 在piechart()构建器中,您可以调用data()函数来传递多个类别值对(category-value pairs)(图8.1)。

piechart("Desktop/Laptop OS Market Share") {
    data("Windows", 77.62)
    data("OS X", 9.52)
    data("Other", 3.06)
    data("Linux", 1.55)
    data("Chrome OS", 0.55)
}
图8.1

注意,您还可以提供一个预先准备的明确的ObservableList<PieChart.Data>

val items = listOf(
        PieChart.Data("Windows", 77.62),
        PieChart.Data("OS X", 9.52),
        PieChart.Data("Other", 3.06),
        PieChart.Data("Linux", 1.55),
        PieChart.Data("Chrome OS", 0.55)
).observable()

piechart("Desktop/Laptop OS Market Share", items)

以下piechart后的代码块可用于修改piechart的任何属性,就像我们涵盖的任何其他控件的构建器一样。 您还可以利用for()循环,序列(Sequences)和其他迭代工具来添加任意数量的数据项。

val items = listOf(
        PieChart.Data("Windows", 77.62),
        PieChart.Data("OS X", 9.52),
        PieChart.Data("Other", 3.06),
        PieChart.Data("Linux", 1.55),
        PieChart.Data("Chrome OS", 0.55)
).observable()

piechart("Desktop/Laptop OS Market Share") {
    for (item in items) {
        data.add(item)
    }
}

基于映射的数据源(Map-Based Data Sources)

有时您可能希望使用Map作为数据源来构建图表。 使用Kotlin操作符,可以以Kotlin的方式构造Map,然后将其传递给data函数。

 val items = mapOf(
        "Windows" to 77.62,
        "OS X" to 9.52,
        "Other" to 3.06,
        "Linux" to 1.55,
        "Chrome OS" to 0.55
)

piechart("Desktop/Laptop OS Market Share") {
    data(items)
}

基于XY的图表

大多数图表通常处理XY轴上的一个或多个数据点系列。 最常见的是条状和线状图(bar and line charts)。

条形图

您可以通过BarChart表示一个或多个数据点。 该图表可以方便地比较不同数据点与X或Y轴的距离(图8.2)。

 barchart("Unit Sales Q2 2016", CategoryAxis(), NumberAxis()) {
    series("Product X") {
        data("MAR", 10245)
        data("APR", 23963)
        data("MAY", 15038)
    }
    series("Product Y") {
        data("MAR", 28443)
        data("APR", 22845)
        data("MAY", 19045)
    }
}
图8.2

以上, series()data()函数可以快速构建支持图表的数据结构。 在构建中,您将需要为每个X轴和Y轴构造适当的Axis类型。 在这个例子中,这几个月不一定是数字的,而是字符串。 因此,它们最好由CategoryAxis代表。 已经是数字的单位适合使用NumberAxis

series()data()块中,您可以自定义其他属性,如颜色。 您甚至可以调用style()来快速将类型安全的CSS应用于图表。

LineChart和AreaChart

LineChart将XY轴上的数据点用线连接起来,快速可视化它们之间的向上和向下趋势(图8.3)

linechart("Unit Sales Q2 2016", CategoryAxis(), NumberAxis()) {
    series("Product X") {
        data("MAR", 10245)
        data("APR", 23963)
        data("MAY", 15038)
    }
    series("Product Y") {
        data("MAR", 28443)
        data("APR", 22845)
        data("MAY", 19045)
    }
}
图8.3

后台数据结构与BarChart没有太大的不同,并且以相同的方式使用series()data()函数。

您还可以使用一个名为AreaChartLineChart变体,它将使线下面的区域以及任何重叠部分具有明显的颜色(图8.4)。

图8.4

Multiseries

您可以使用multiseries()函数简化多个系列的声明,并使用varargs值调用data()函数。 我们可以使用这个结构巩固我们以前的例子:

linechart("Unit Sales Q2 2016", CategoryAxis(), NumberAxis()) {

    multiseries("Product X", "Product Y") {
        data("MAR", 10245, 28443)
        data("APR", 23963, 22845)
        data("MAY", 15038, 19045)
    }
}

这只是减少样板(boilerplate)的另一个便利,并快速声明图表的数据结构。

ScatterChart

ScatterChart是XY数据系列的最简单的表示形式。 它绘制这些数据点,但是不使用条形或线条。 它经常用于绘制大量的数据点(large volume of data points),以便找到集群(clusters)。 以下是两个不同产品系列的ScatterChart,绘制了每周机器容量(machine capacities by week)的简要示例(图8.5)。

scatterchart("Machine Capacity by Product/Week", NumberAxis(), NumberAxis()) {
    series("Product X") {
        data(1,24)
        data(2,22)
        data(3,23)
        data(4,19)
        data(5,18)
    }
    series("Product Y") {
        data(1,12)
        data(2,15)
        data(3,9)
        data(4,11)
        data(5,7)
    }
}
图8.5

BubbleChart

BubbleChart是类似于ScatterPlot的另一个XY图,但是有第三个变量来控制每个点的半径。 您可以利用此功能来显示,例如,按周计算出的气泡半径(bubble radii),反映使用的机器数量(图8.6)。

 bubblechart("Machine Capacity by Output/Week", NumberAxis(), NumberAxis()) {
    series("Product X") {
        data(1,24,1)
        data(2,46,2)
        data(3,23,1)
        data(4,27,2)
        data(5,18,1)
    }
    series("Product Y") {
        data(1,12,1)
        data(2,31,2)
        data(3,9,1)
        data(4,11,1)
        data(5,15,2)
    }
}
图8.6

概要

图表是可视化数据的有效方法,而TornadoFX中的构建器可以帮助快速创建它们。 您可以在Oracle的文档(Oracle's documentation)中阅读有关JavaFX图表的更多信息。 如果您需要更高级的图表功能,那么您可以使用JFreeChartOrson Charts 等库来利用并与TornadoFX互操作,但这超出了本书的范围。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容