有哪些用 JavaScript 实现的图形库

JavaScript011

有哪些用 JavaScript 实现的图形库,第1张

D3.js

D3 是最流行的可视化库之一,它被很多其他的表格插件所使用。它允许绑定任意数据到 DOM,然后将数据驱动转换应用到文档中。你可以使用它用一个数组创建基本的

HMTL 表格,或是利用它的流体过度和交互,用相似的数据创建惊人的 SVG 条形图。

ChartJS

Chart.js 是一个令人印象深刻的 JavaScript 图表库,建立在 HTML5 Canvas

基础上。目前,它支持6种图表类型(折线图,条形图,雷达图,饼图,柱状图和极地区域区)。而且,这是一个独立的包,不依赖第三方 JavaScript 库,小于

5KB。

Highcharts JS

Highcharts JS 是一个制作图表的纯 Javascript 类库,主要特性如下:兼容性:兼容当今所有的浏览器,包括 iPhone、IE

和火狐等等对个人用户完全免 费纯JS,无BS支持大部分的图表类型:直线图,曲线图、区域图、区域曲线图、柱状图、饼装图、散布图跨语言:不管是

PHP、Asp.net 还是 Java 都可以使用。

Fusioncharts

FusionCharts Suite XT 是个专业的 JavaScript

图表库,能创建任何类型的图表。它创建的图表都是可以进行完全自定义的,标签,字体,边界等等,都可以进行修改。它有很强的交互功能,有许多信息提示,可 点击的

legend 关键字,还有 dril-down,缩放/滚动 和单击打印图表功能。

Flot

Flot 是受 Plotr 和 PlotKit 的 启发,Ole Laursen 基于 jQuery 开发了一个图表绘制(WEB Chart)插件并命名为

flot。 flot 是个纯 JavaSript 库,专注于简单的使用方式,迷人的外观和交互式特性。支持的浏览器有: Internet Explorer 6+,

Chrome, Firefox 2+, Safari 3+ and Opera 9.5+。

Chartist.js

Chartist.js 提供了优美的响应图表。就像 ChartJS。它使用 SVG 渲染图,可以被控制,并通过对 CSS3 媒体查询和 SASS

定制。另外 Chartist.js 提供很酷的动画。

n3-charts

如果你是一个 AngularJS 开发者,你一定喜欢款有趣的图表。它是建立在 D3.js 和 AngularJS 的基础上,提供了可定制的

AngularJS 指令的形式不同标准的图表。

Ember Charts

Ember Charts 是一个基于 Ember.js 和 D3.js

的图表库。它包括时间序列、柱状图、饼图、点图,很容易扩展和修改。这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展的。

Chartkick

Chartkick 是专为 Ruby 应用程序的 JavaScript

图表库。它提供了所有主要的图表类型,如饼图,柱形图,条形图,面积,地理,时间,以及多个系列。

MeteorCharts

它有一个很酷的图表生成器,为您提供选项来选择图表,选择主题,然后生成一个图表。

amCharts

amCharts 无疑是最漂亮的图表库。amCharts 提供了JavaScript/HTML5 Charts、Javascript/HTML5

Stock Chart、JavaScript Maps 三种图表组件。

EJS Chart

EJS图表声称自己是企业准备的图表库。图表看起来很干净,可读性比大多数旧的图表库。这也是与IE6+等旧浏览器兼容。

uvCharts

uvCharts 是一个开源的 JavaScript 图表库,号称有100多个自定义选项。它拥有12种不同的标准图表类型,开箱即用。

ECharts

基于 Canvas,纯 JavaScript

图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

商业产品常用图表库,底层基于ZRender,创建了坐标系,图例,提示,工具箱等基础组件,并在此上构建出折线图(区域图)、柱状图(条状图)、散点图(气泡图)、饼图(环形图)、K线图、地图、和弦图以及力导向布局图,同时支持任意维度的堆积和多图表混合展现。

这个问题挺复杂的,以前看过一次,但没太看懂,这次整理了一下。有兴趣的同学可以看看。

首先打印出0.14和0.14*100的二进制(程序见参考):

0.14 : 0 01111111100 0001111010111000010100011110101110000101000111101100

0.14*100 : 0 10000000010 1100000000000000000000000000000000000000000000000001

14.0 : 0 10000000010 1100000000000000000000000000000000000000000000000000

我们可以看到0.14的小数部分出现循环,就像10/3 = 1.33333…一样,所以0.14是有精度丢失的,

比较0.14*100和14.0,0.14*100多了最后一位1。

Java遵循IEEE 754标准来支持浮点数的操作,结合浮点值0.14,我们来看一下,1) 0.14的二进制格式

0 01111111100 0001111010111000010100011110101110000101000111101100.

根据IEEE 754标准,

注:S:符号(0正1负),E,指数,M小数部分。

对0.14格式化后的结果是:

S(1位) E(11位) M (52位)

0 01111111100 0001111010111000010100011110101110000101000111101100

根据计算公式:

我们可以得到e = 01111111100 – 1023 = 1020 – 1023 = -3

m = 1 (隐藏位) + 0.0001111010111000010100011110101110000101000111101100 = 1 +

Long.valueOf("0001111010111000010100011110101110000101000111101100", 2)/ (Math.pow(2, 52) – 1)

= 1.12000000000000013

n = 1.12000000000000013 *2^-3= 1.12000000000000013/8 约 0.14

接下来,第二个问题,2)为什么0.14 * 100 输出14.000000000000002?

由上可知0.14是不精确的,乘100只会扩大这个不精确度。具体的计算过程如下:

100的浮点二进制:

0 10000000101 1001000000000000000000000000000000000000000000000000

跟据浮点乘法规则指数相加,小数相乘,得到

0.14 * 100 =

2^(6-3) //100的指数是6,0.14的指数是-3

*

(1. 1001000000000000000000000000000000000000000000000000*

1. 0001111010111000010100011110101110000101000111101100) //小数部分

= 2^(6-3) * (1 + 0.1001000000000000000000000000000000000000000000000000 +

0.0001111010111000010100011110101110000101000111101100 +

0. 1001000000000000000000000000000000000000000000000000 * 0. 0001111010111000010100011110101110000101000111101100

//方便计算,分解乘数(同1.1 * 1.1 = 1 + 0.1 * 1 + 1 * 0.1 + 0.1*0.1)

这部分我用计算器计算,貌似精度丢失更严重,但可以得知小数部分依然是循环,而不能精确表达。同时,通过查看JDK中Double.toString(d)方法,我们可以看到SUN实现的浮点输出方法。所以最后打印在页面的是14.000000000000002而不是14.0.

故,浮点是用有限二进位接近表达一个数值,不精确是常态,使用要慎重

参考(强烈推荐)

IEEE 754 浮点数的表示精度探讨

http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html

解读IEEE标准754:浮点数表示

http://www.linuxsir.org/bbs/thread262207.html

浮点乘法计算

http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BinMath/multFloat.html

打印DOUBLE二进制方法:

public class DoubleTest {

@Test

public void test(){

System.out.println("0.5 : " + this.dumpDouble(0.5))

System.out.println("0.14 : " + this.dumpDouble(0.14))

System.out.println("0.14*100 : " + this.dumpDouble(0.14 * 100))

System.out.println("14.0 : " + this.dumpDouble(14.0))

System.out.println("100 : " + this.dumpDouble(100))

Assert.assertEquals("100.0%", getPercentage(0.9999, 2))

Assert.assertEquals("100%", getPercentage(0.9999, 1))

Assert.assertEquals("99.9%", getPercentage(0.999, 2))

Assert.assertEquals("10.1%", getPercentage(0.101, 2))

Assert.assertEquals("10.2%", getPercentage(0.1015, 2))

Assert.assertEquals("11.0%", getPercentage(0.1095, 2))

Assert.assertEquals("0.11%", getPercentage(0.0011, 3))

final int TOTAL = 100000

double[] data = new double[TOTAL]

for(int i = 0i <TOTALi++ ){

data[i] = Math.random()

}

//通过FORMAT,获得百分比,忽略精度

DecimalFormat f = new DecimalFormat("0.##'.0'%")

long start = System.currentTimeMillis()

for(int i = 0i <TOTALi++ ){

f.format(data[i])

}

long end = System.currentTimeMillis()

System.out.println("0 time: " + (end - start))

//基于字符计算百分比

start = System.currentTimeMillis()

for(int i = 0i <TOTALi++ ){

this.getPercentage(data[i], 2)

}

end = System.currentTimeMillis()

System.out.println("1 time: " + (end - start))

}

public String dumpDouble(double d) {

StringBuilder b = new StringBuilder()

String bString = Long.toBinaryString(Double.doubleToLongBits(d))

int fillZeros = 64 - bString.length()

for(int i = 0i <fillZeros i++){

if(i == 1){

b.append(' ')

}

b.append('0')

}

for(int i = 0i <bString.length()i++ ){

if((i + fillZeros) == 1 || (i + fillZeros) == 12){

b.append(' ')

}

b.append(bString.charAt(i))

}

return b.toString()

}

char[] next = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',}

public String getPercentage(double d, int precision){

StringBuilder b = new StringBuilder(Double.toString(d * 100))

int dot = b.indexOf(".")

if(dot >0 &&dot + precision <b.length()){

char c = b.charAt(dot + precision)

//四舍五入

if(c >'4'){

int j = dot + precision - 1

if(j == dot) {

//跳过小数点

j --

}

char n = next[b.charAt(j) - '0']

b.setCharAt(j, n)

//向前进1

while(n == '0' &&j >0){

j --

if(j == dot) {

//跳过小数点

j --

}

//+1

n = next[b.charAt(j) - '0']

b.setCharAt(j, n)

}

if(j == 0){

b.insert(0, 1)

dot++

if(precision == 1){

b.setCharAt(dot, '%')

return b.substring(0, dot + 1)

}else{

b.setCharAt(dot + precision, '%')

return b.substring(0, dot + precision + 1)

}

}

}

b.setCharAt(dot + precision, '%')

return b.substring(0, dot + precision + 1)

}

b.append("%")

return b.toString()

}

使用node轻巧的特性,可以方便的搭建一个个人博客

node同时是很多前端框架的基础组件,使用node,可以学习到很多不同的前端框架

ReactNative可以开发原生APP