17
17
* You should have received a copy of the GNU General Public License
18
18
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
*
20
- * Date: 2016 -10-29T20:51Z
20
+ * Date: 2017 -10-30T17:49Z
21
21
*/
22
22
23
23
( function ( window ) {
@@ -904,6 +904,186 @@ Origami.text = function(text, x, y, style) {
904
904
return this ;
905
905
} ;
906
906
907
+ function ChartBar ( config ) {
908
+ var ctx = this . paper . ctx ,
909
+ width = this . paper . width ,
910
+ height = this . paper . height ;
911
+
912
+ if ( config . frame )
913
+ ctx . clearRect ( 0 , 0 , this . paper . width , this . paper . height ) ;
914
+
915
+ var animation = config . animation ;
916
+
917
+ var xPadding = 40 ;
918
+ var yPadding = 40 ;
919
+ var sets = config . datasets ;
920
+
921
+ var gridLines = {
922
+ vertical : true ,
923
+ horizontal : true
924
+ } ;
925
+
926
+ function getMaxOfArray ( numArray ) {
927
+ return Math . max . apply ( null , numArray ) ;
928
+ }
929
+
930
+ function getMinOfArray ( numArray ) {
931
+ return Math . min . apply ( null , numArray ) ;
932
+ }
933
+
934
+ function getMaxAndMin ( ) {
935
+ var max = 0 ,
936
+ min = 0 ;
937
+
938
+ for ( var i = 0 ; i < config . datasets . length ; i ++ ) {
939
+ var biggest , lowest ;
940
+ biggest = getMaxOfArray ( config . datasets [ i ] . data ) ;
941
+ lowest = getMinOfArray ( config . datasets [ i ] . data ) ;
942
+
943
+ if ( biggest > max ) {
944
+ max = biggest ;
945
+ }
946
+ if ( lowest < min ) {
947
+ min = lowest ;
948
+ }
949
+ }
950
+ return {
951
+ max : max ,
952
+ min : min
953
+ } ;
954
+ }
955
+
956
+ var maxAndMin = getMaxAndMin ( ) ;
957
+ var maxY = Math . round ( maxAndMin . max ) ;
958
+ var minY = Math . round ( maxAndMin . min ) ;
959
+
960
+ var xScale = Math . floor ( ( width - ( xPadding * 3 ) / 2 ) ) / config . labels . length ;
961
+
962
+ function getXPixel ( i ) {
963
+ return xPadding + xScale * i ;
964
+ }
965
+
966
+ var yRange = maxY - minY ;
967
+ var unRoundedTickGap = yRange / 10 ;
968
+ var magnitude = Math . ceil ( Math . log10 ( unRoundedTickGap ) ) ;
969
+ var roundedTickGap = ( ( Math . round ( unRoundedTickGap / Math . pow ( 10 , magnitude - 1 ) ) / 10 ) * Math . pow ( 10 , magnitude ) ) ;
970
+ var lowerBound = roundedTickGap * Math . floor ( minY / roundedTickGap ) ;
971
+ var upperBound = roundedTickGap * Math . floor ( 1 + maxY / roundedTickGap ) ;
972
+ var yScale = ( height - ( ( 3 / 2 ) * yPadding ) ) / ( upperBound - lowerBound ) ;
973
+
974
+ function getYPixel ( val ) {
975
+ return height - ( yScale * ( val - lowerBound ) + yPadding ) ;
976
+ }
977
+
978
+ var gridLinesColor = '#e7e7e7' ;
979
+ if ( config . gridLinesColor ) {
980
+ gridLinesColor = config . gridLinesColor ;
981
+ }
982
+
983
+ if ( config . gridLines ) {
984
+ if ( config . gridLines . vertical === false )
985
+ gridLines . vertical = false ;
986
+
987
+ if ( config . gridLines . horizontal === false )
988
+ gridLines . horizontal = false ;
989
+ }
990
+
991
+ ctx . fillStyle = '#5e5e5e' ;
992
+ if ( config . labelColor ) {
993
+ ctx . fillStyle = config . labelColor ;
994
+ }
995
+
996
+ ctx . font = 'normal 11px Helvetica' ;
997
+ ctx . globalAlpha =<
8000
/span> 1 ;
998
+
999
+ // axes
1000
+ ctx . beginPath ( ) ;
1001
+ ctx . strokeStyle = gridLinesColor ;
1002
+ ctx . lineWidth = 1.6 ;
1003
+ ctx . moveTo ( xPadding , yPadding / 2 ) ;
1004
+ ctx . lineTo ( xPadding , height - yPadding ) ;
1005
+ ctx . lineTo ( width - xPadding / 2 , height - yPadding ) ;
1006
+ ctx . stroke ( ) ;
1007
+
1008
+ // vertical gridlines and label
1009
+ ctx . textAlign = "center" ;
1010
+ ctx . textBaseline = "alphabetic" ;
1011
+ for ( var i = 0 ; i < config . labels . length ; i ++ ) {
1012
+ if ( gridLines . vertical ) {
1013
+ ctx . beginPath ( ) ;
1014
+ ctx . lineWidth = 0.8 ;
1015
+ ctx . strokeStyle = gridLinesColor ;
1016
+ ctx . moveTo ( getXPixel ( i ) , height - yPadding + 5 ) ;
1017
+ ctx . lineTo ( getXPixel ( i ) , yPadding / 2 ) ;
<
8000
/code>
1018
+ ctx . stroke ( ) ;
1019
+ }
1020
+
1021
+ ctx . fillText ( config . labels [ i ] , ( getXPixel ( i ) + getXPixel ( i + 1 ) ) / 2 , height - yPadding + 20 ) ;
1022
+ }
1023
+
1024
+ // horizontal gridlines and data
1025
+ ctx . textAlign = "right"
1026
+ ctx . textBaseline = "middle" ;
1027
+ for ( var i = lowerBound ; i <= upperBound ; i += roundedTickGap ) {
1028
+ ctx . beginPath ( ) ;
1029
+ if ( i != 0 )
1030
+ ctx . lineWidth = 0.8 ;
1031
+ else
1032
+ ctx . lineWidth = 2 ;
1033
+ ctx . strokeStyle = gridLinesColor ;
1034
+ ctx . moveTo ( xPadding - 5 , getYPixel ( i ) ) ;
1035
+ ctx . lineTo ( width - ( xPadding / 2 ) , getYPixel ( i ) ) ;
1036
+ ctx . stroke ( ) ;
1037
+ ctx . fillText ( i , xPadding - 10 , getYPixel ( i ) ) ;
1038
+ }
1039
+
1040
+ var barWidth = ( 0.75 * ( getXPixel ( 1 ) - getXPixel ( 0 ) ) ) / ( config . datasets . length ) ;
1041
+ var barPadding = 0.05 * ( getXPixel ( 1 ) - getXPixel ( 0 ) ) ;
1042
+ if ( config . datasets . length > 1 )
1043
+ var barSpacing = parseFloat ( ( 0.15 * ( getXPixel ( 1 ) - getXPixel ( 0 ) ) ) / ( config . datasets . length - 1 ) ) ;
1044
+ else
1045
+ var barSpacing = 0 ;
1046
+
1047
+ // drawing bars
1048
+ for ( var i = 0 ; i < config . labels . length ; i ++ )
1049
+ {
1050
+ var x = getXPixel ( i ) + barPadding ;
1051
+ for ( var j = 0 ; j < config . datasets . length ; j ++ )
1052
+ {
1053
+ var value = config . datasets [ j ] . data [ i ] ;
1054
+ ctx . beginPath ( ) ;
1055
+ ctx . globalAlpha = 0.5 ;
1056
+ ctx . fillStyle = "orange" ;
1057
+ if ( config . datasets [ j ] . fillColor )
1058
+ ctx . fillStyle = config . datasets [ j ] . fillColor
1059
+ ctx . fillRect ( x , getYPixel ( 0 ) , barWidth , getYPixel ( value ) - getYPixel ( 0 ) ) ;
1060
+ ctx . lineWidth = 2 ;
1061
+ if ( config . datasets [ j ] . borderWidth )
1062
+ ctx . lineWidth = config . datasets [ j ] . borderWidth ;
1063
+ ctx . strokeStyle = "orange" ;
1064
+ if ( config . datasets [ j ] . borderColor ) {
1065
+ if ( typeof ( config . datasets [ j ] . borderColor ) == "string" )
1066
+ ctx . strokeStyle = config . datasets [ j ] . borderColor ;
1067
+ else if ( typeof ( config . datasets [ j ] . borderColor ) == "object" )
1068
+ ctx . strokeStyle = config . datasets [ j ] . borderColor [ i ] ;
1069
+ }
1070
+ ctx . moveTo ( x , getYPixel ( 0 ) ) ;
1071
+ ctx . lineTo ( x , getYPixel ( value ) ) ;
1072
+ ctx . lineTo ( x + barWidth , getYPixel ( value ) ) ;
1073
+ ctx . lineTo ( x + barWidth , getYPixel ( 0 ) ) ;
1074
+ ctx . stroke ( ) ;
1075
+ x += barWidth + barSpacing ;
1076
+ }
1077
+ }
1078
+
1079
+ }
1080
+
1081
+ Screen . prototype . chartBar = ChartBar ;
1082
+
1083
+ Origami . chartBar = function ( config ) {
1084
+ queue ( 'chartBar' , config ) ;
1085
+ return this ;
1086
+ } ;
907
1087
function ChartLine ( config ) {
908
1088
var ctx = this . paper . ctx ,
909
1089
width = this . paper . width ,
@@ -931,6 +1111,10 @@ function ChartLine(config) {
931
1111
horizontal : true
932
1112
} ;
933
1113
1114
+ var maxAndMin = getMaxAndMin ( ) ;
1115
+ var maxY = Math . round ( maxAndMin . max ) ;
1116
+ var minY = Math . round ( maxAndMin . min ) ;
1117
+
934
1118
var gridLinesColor = '#e7e7e7' ;
935
1119
if ( config . gridLinesColor ) {
936
1120
gridLinesColor = config . gridLinesColor ;
@@ -965,17 +1149,17 @@ function ChartLine(config) {
965
1149
ctx . stroke ( ) ;
966
1150
}
967
1151
968
- ctx . fillText ( config . labels [ i ] , getXPixel ( i ) - config . labels [ i ] . length * 2.5 , height - yPadding + 22 ) ;
1152
+ var str = String ( config . labels [ i ] )
1153
+ ctx . fillText ( str , getXPixel ( i ) - str . length * 2.5 , height - yPadding + 22 ) ;
969
1154
}
970
1155
971
1156
// Data
972
1157
ctx . textAlign = "right"
973
1158
ctx . textBaseline = "middle" ;
974
- var maxY = getMaxY ( ) ;
975
- var gridItems = 10 ;
976
- var variance = Math . round ( Math . round ( maxY / gridItems ) / 10 ) * 10 ;
1159
+ var gridItems = config . tense || 7 ;
1160
+ var variance = Math . round ( Math . round ( ( maxY - minY ) / gridItems ) / 10 ) * 10 ;
977
1161
978
- for ( var i = 0 ; i < maxY ; i += variance ) {
1162
+ for ( var i = minY + variance ; i < maxY ; i += variance ) {
979
1163
if ( gridLines . horizontal ) {
980
1164
ctx . beginPath ( ) ;
981
1165
ctx . lineWidth = 0.8 ;
@@ -991,25 +1175,50 @@ function ChartLine(config) {
991
1175
return Math . max . apply ( null , numArray ) ;
992
1176
}
993
1177
994
- function getMaxY ( ) {
995
- var max = 0 ;
1178
+ function getMinOfArray ( numArray ) {
1179
+ return Math . min . apply ( null , numArray ) ;
1180
+ }
1181
+
1182
+ function getMaxAndMin ( ) {
1183
+ var max = 0 ,
1184
+ min = 0 ;
996
1185
997
1186
for ( var i = 0 ; i < sets . length ; i ++ ) {
998
- var m = getMaxOfArray ( sets [ i ] . data ) ;
999
- if ( m > max ) {
1000
- max = m ;
1187
+ var biggest , lowerst ;
1188
+ if ( typeof ( sets [ i ] . data [ 0 ] ) === 'object' ) {
1189
+ biggest = getMaxOfArray ( sets [ i ] . data . map ( function ( x ) {
1190
+ return x [ 1 ]
1191
+ } ) ) ;
1192
+ lowerst = getMinOfArray ( sets [ i ] . data . map ( function ( x ) {
1193
+ return x [ 1 ]
1194
+ } ) ) ;
1195
+ } else {
1196
+ biggest = getMaxOfArray ( sets [ i ] . data ) ;
1197
+ lowerst = getMinOfArray ( sets [ i ] . data ) ;
1198
+ }
1199
+ if ( biggest > max ) {
1200
+ max = biggest ;
1201
+ }
1202
+ if ( lowerst < min ) {
1203
+ min = lowerst ;
1001
1204
}
1002
1205
}
1206
+
1003
1207
max += yPadding - max % 10 ;
1004
- return max ;
1208
+ min -= yPadding + min % 10 ;
1209
+ return {
1210
+ max : max ,
1211
+ min : min
1212
+ } ;
1005
1213
}
1006
1214
1007
1215
function getXPixel ( val ) {
1008
- return ( ( width - xPadding ) / config . labels . length ) * val + xPadding ;
1216
+ return parseFloat ( ( ( width - xPadding ) / config . labels . length ) * val + xPadding ) ;
1009
1217
}
1010
1218
1011
1219
function getYPixel ( val ) {
1012
- return height - ( ( ( height - yPadding ) / getMaxY ( ) ) * val ) - yPadding ;
1220
+ var scale = maxY / ( maxY - minY ) ;
1221
+ return parseFloat ( ( height - ( ( ( height - yPadding ) / maxY ) * val ) ) * scale ) ;
1013
1222
}
1014
1223
1015
1224
if ( animation ) {
@@ -1048,8 +1257,11 @@ function ChartLine(config) {
1048
1257
ctx . strokeStyle = line . borderColor ;
1049
1258
ctx . moveTo ( getXPixel ( 0 ) , getYPixel ( set . data [ 0 ] ) ) ;
1050
1259
1051
- for ( var x = 1 ; x < set . data . length ; x ++ ) {
1052
- ctx . lineTo ( getXPixel ( x ) , getYPixel ( set . data [ x ] ) ) ;
1260
+ for ( var x = 0 ; x < set . data . length ; x ++ ) {
1261
+ if ( typeof ( set . data [ x ] ) === 'object' )
1262
+ ctx . lineTo ( getXPixel ( set . data [ x ] [ 0 ] ) , getYPixel ( set . data [ x ] [ 1 ] ) ) ;
1263
+ else
1264
+ ctx . lineTo ( getXPixel ( x ) , getYPixel ( set . data [ x ] ) ) ;
1053
1265
}
1054
1266
1055
1267
ctx . stroke ( ) ;
@@ -1068,7 +1280,11 @@ function ChartLine(config) {
1068
1280
for ( var z = 0 ; z < set . data . length ; z ++ ) {
1069
1281
ctx . beginPath ( ) ;
1070
1282
ctx . fillStyle = ( set . pointsColor ) ? set . pointsColor : 'rgb(75,75,75)' ;
1071
- ctx . arc ( getXPixel ( z ) , getYPixel ( set . data [ z ] ) , 4 , 0 , Math . PI * 2 , true ) ;
1283
+ if ( typeof ( set . data [ z ] ) === 'object' )
1284
+ ctx . arc ( getXPixel ( set . data [ z ] [ 0 ] ) , getYPixel ( set . data [ z ] [ 1 ] ) , 4 , 0 , Math . PI * 2 , true ) ;
1285
+ else
1286
+ ctx . arc ( getXPixel ( z ) , getYPixel ( set . data [ z ] ) , 4 , 0 , Math . PI * 2 , true ) ;
1287
+
1072
1288
ctx . fill ( ) ;
1073
1289
ctx . closePath ( ) ;
1074
1290
ctx . beginPath ( ) ;
0 commit comments