! function ( e, t) { "object" == typeof  exports&& "object" == typeof  module? module. exports= t ( require ( "echarts" ) ) : "function" == typeof  define&& define. amd? define ( [ "echarts" ] , t) : "object" == typeof  exports? exports. dataTool= t ( require ( "echarts" ) ) : ( e. echarts= e. echarts|| { } , e. echarts. dataTool= t ( e. echarts) ) } ( this , function ( e) { return  function ( e) { function  t ( o) { if ( r[ o] ) return  r[ o] . exports; var  n= r[ o] = { exports: { } , id: o, loaded: ! 1 } ; return  e[ o] . call ( n. exports, n, n. exports, t) , n. loaded= ! 0 , n. exports} var  r= { } ; return  t. m= e, t. c= r, t. p= "" , t ( 0 ) } ( [ function ( e, t, r) { var  o; o = function ( e) { var  t= r ( 1 ) ; return  t. dataTool= { version: "1.0.0" , gexf: r ( 5 ) , prepareBoxplotData: r ( 6 ) } , t. dataTool} . call ( t, r, t, e) , ! ( void  0 !== o&& ( e. exports= o) ) } , function ( t, r) { t. exports= e} , , , , function ( e, t, r) { var  o; o = function ( e) { "use strict" ; function  t ( e) { var  t; if ( "string" == typeof  e) { var  r= new  DOMParser ; t= r. parseFromString ( e, "text/xml" ) } else  t= e; if ( ! t|| t. getElementsByTagName ( "parsererror" ) . length) return  null ; var  i= l ( t, "gexf" ) ; if ( ! i) return  null ; for ( var  u= l ( i, "graph" ) , s= o ( l ( u, "attributes" ) ) , c= { } , f= 0 ; f< s. length; f++ ) c[ s[ f] . id] = s[ f] ; return { nodes: n ( l ( u, "nodes" ) , c) , links: a ( l ( u, "edges" ) ) } } function  o ( e) { return  e? s. map ( u ( e, "attribute" ) , function ( e) { return { id: i ( e, "id" ) , title: i ( e, "title" ) , type: i ( e, "type" ) } } ) : [ ] } function  n ( e, t) { return  e? s. map ( u ( e, "node" ) , function ( e) { var  r= i ( e, "id" ) , o= i ( e, "label" ) , n= { id: r, name: o, itemStyle: { normal: { } } } , a= l ( e, "viz:size" ) , s= l ( e, "viz:position" ) , c= l ( e, "viz:color" ) , f= l ( e, "attvalues" ) ; if ( a&& ( n. symbolSize= parseFloat ( i ( a, "value" ) ) ) , s&& ( n. x= parseFloat ( i ( s, "x" ) ) , n. y= parseFloat ( i ( s, "y" ) ) ) , c&& ( n. itemStyle. normal. color= "rgb(" + [ 0 | i ( c, "r" ) , 0 | i ( c, "g" ) , 0 | i ( c, "b" ) ] . join ( "," ) + ")" ) , f) { var  p= u ( f, "attvalue" ) ; n. attributes= { } ; for ( var  v= 0 ; v< p. length; v++ ) { var  d= p[ v] , g= i ( d, "for" ) , h= i ( d, "value" ) , b= t[ g] ; if ( b) { switch ( b. type) { case "integer" : case "long" : h= parseInt ( h, 10 ) ; break ; case "float" : case "double" : h= parseFloat ( h) ; break ; case "boolean" : h= "true" == h. toLowerCase ( ) } n. attributes[ g] = h} } } return  n} ) : [ ] } function  a ( e) { return  e? s. map ( u ( e, "edge" ) , function ( e) { var  t= i ( e, "id" ) , r= i ( e, "label" ) , o= i ( e, "source" ) , n= i ( e, "target" ) , a= { id: t, name: r, source: o, target: n, lineStyle: { normal: { } } } , u= a. lineStyle. normal, s= l ( e, "viz:thickness" ) , c= l ( e, "viz:color" ) ; return  s&& ( u. width= parseFloat ( s. getAttribute ( "value" ) ) ) , c&& ( u. color= "rgb(" + [ 0 | i ( c, "r" ) , 0 | i ( c, "g" ) , 0 | i ( c, "b" ) ] . join ( "," ) + ")" ) , a} ) : [ ] } function  i ( e, t) { return  e. getAttribute ( t) } function  l ( e, t) { for ( var  r= e. firstChild; r; ) { if ( 1 == r. nodeType&& r. nodeName. toLowerCase ( ) == t. toLowerCase ( ) ) return  r; r= r. nextSibling} return  null } function  u ( e, t) { for ( var  r= e. firstChild, o= [ ] ; r; ) r. nodeName. toLowerCase ( ) == t. toLowerCase ( ) && o. push ( r) , r= r. nextSibling; return  o} var  s= r ( 1 ) . util; return { parse: t} } . call ( t, r, t, e) , ! ( void  0 !== o&& ( e. exports= o) ) } , function ( e, t, r) { var  o; o = function ( e) { var  t= r ( 7 ) , o= r ( 1 ) . number; return  function ( e, r) { r= r|| [ ] ; for ( var  n= [ ] , a= [ ] , i= [ ] , l= r. boundIQR, u= 0 ; u< e. length; u++ ) { i. push ( u+ "" ) ; var  s= o. asc ( e[ u] . slice ( ) ) , c= t ( s, .25 ) , f= t ( s, .5 ) , p= t ( s, .75 ) , v= p- c, d= "none" === l? s[ 0 ] : c- ( null == l? 1.5 : l) * v, g= "none" === l? s[ s. length- 1 ] : p+ ( null == l? 1.5 : l) * v; n. push ( [ d, c, f, p, g] ) ; for ( var  h= 0 ; h< s. length; h++ ) { var  b= s[ h] ; if ( b< d|| b> g) { var  x= [ u, b] ; "vertical" === r. layout&& x. reverse ( ) , a. push ( x) } } } return { boxData: n, outliers: a, axisData: i} } } . call ( t, r, t, e) , ! ( void  0 !== o&& ( e. exports= o) ) } , function ( e, t, r) { var  o; o = function ( e) { return  function ( e, t) { var  r= ( e. length- 1 ) * t+ 1 , o= Math. floor ( r) , n= + e[ o- 1 ] , a= r- o; return  a? n+ a* ( e[ o] - n) : n} } . call ( t, r, t, e) , ! ( void  0 !== o&& ( e. exports= o) ) } ] ) } ) ;   
结果展示   上代码,可直接拷贝使用,引入echarts.js和dataTool.js即可使用   
<!DOCTYPE html> 
< html  lang = " en" >  
< head> < meta  charset = " UTF-8" > < title>  盒须图</ title>  
</ head>  
< body> < div  id = " container"  style  =" width : 100%; height : 600px; " > </ div>  
</ body>  
< script  src = " ../js/jquery.min.js" > </ script>  
< script  src = " ../js/echarts.min.js" > </ script>  
< script  src = " ../js/dataTool.min.js" > </ script>  
< script  type = " text/javascript" > $ ( document) . ready ( function  ( )  { $ ( '#chart' ) . css ( "height" , $ ( window) . height ( ) - 350 ) ; data =  [ ] ; var  redBoxData =  [ [ 850 ,  740 ,  900 ,  1070 ,  930 ,  850 ,  950 ,  980 ,  980 ,  880 ,  1000 ,  980 ,  930 ,  650 ,  760 ,  810 ,  1000 ,  1000 ,  960 ,  960 ] , [ 960 ,  940 ,  960 ,  940 ,  880 ,  800 ,  850 ,  880 ,  900 ,  840 ,  830 ,  790 ,  810 ,  880 ,  880 ,  830 ,  800 ,  790 ,  760 ,  800 ] , [ 890 ,  810 ,  810 ,  820 ,  800 ,  770 ,  760 ,  740 ,  750 ,  760 ,  910 ,  920 ,  890 ,  860 ,  880 ,  720 ,  840 ,  850 ,  850 ,  780 ] , [ 850 ,  840 ,  780 ,  810 ,  760 ,  810 ,  790 ,  810 ,  820 ,  850 ,  870 ,  870 ,  810 ,  740 ,  810 ,  940 ,  950 ,  800 ,  810 ,  870 ] ] ; data. push ( echarts. dataTool. prepareBoxplotData ( redBoxData) ) ; var  blockBoxData =  [ [ 850 ,  740 ,  900 ,  1070 ,  930 ,  850 ,  950 ,  980 ,  980 ,  880 ,  1000 ,  980 ,  930 ,  650 ,  760 ,  810 ,  1000 ,  1000 ,  960 ,  960 ] , [ 960 ,  940 ,  960 ,  940 ,  880 ,  800 ,  850 ,  880 ,  900 ,  840 ,  830 ,  790 ,  810 ,  880 ,  880 ,  830 ,  800 ,  790 ,  760 ,  800 ] , [ 890 ,  810 ,  810 ,  820 ,  800 ,  770 ,  760 ,  740 ,  750 ,  760 ,  910 ,  920 ,  890 ,  860 ,  880 ,  720 ,  840 ,  850 ,  850 ,  780 ] , [ 850 ,  840 ,  780 ,  810 ,  760 ,  810 ,  790 ,  810 ,  820 ,  850 ,  870 ,  870 ,  810 ,  740 ,  810 ,  940 ,  950 ,  800 ,  810 ,  870 ] ] ; data. push ( echarts. dataTool. prepareBoxplotData ( blockBoxData) ) ; let  myChart =  echarts. init ( document. getElementById ( 'container' ) ) ; let  option =  { title:  { text:  '标题名字' , left:  10 , } , legend:  { y:  '10%' , data:  [  '红色盒子' ,  '黑色盒子' ] } , tooltip:  { trigger:  'item' , axisPointer:  { type:  'shadow' } } , grid:  { left:  '10%' , top:  '20%' , right:  '10%' , bottom:  '15%' } , xAxis:  { type:  'category' , data:  [ '第1组' , '第2组' , '第3组' , '第4组' ] , boundaryGap:  true , nameGap:  30 , splitArea:  { show:  true } , axisLabel:  { formatter:  '{value}' } , splitLine:  { show:  false } } , yAxis:  { type:  'value' , name:  'Value' , splitArea:  { show:  false } } , dataZoom:  [ { type:  'inside' , start:  0 , end:  20 } , { show:  true , height:  20 , type:  'slider' , top:  '90%' , xAxisIndex:  [ 0 ] , start:  0 , end:  20 } ] , series:  [ { name:  '红色盒子' , type:  'boxplot' , data:  data[ 0 ] . boxData, tooltip:  { formatter:  formatter} } , { name:  '黑色盒子' , type:  'boxplot' , data:  data[ 1 ] . boxData, tooltip:  { formatter:  formatter} } ] } ; function  formatter ( param)  { return  [ '类别名称: '  +  param. name, '上边界: '  +  param. data[ 0 ] , '下四分位数: '  +  param. data[ 1 ] , '中位数: '  +  param. data[ 2 ] , '上四分位数: '  +  param. data[ 3 ] , '下边界: '  +  param. data[ 4 ] ] . join ( '<br/>' ) } myChart. setOption ( option) ; } ) ; 
</ script>  
</ html>