@@ -15,12 +15,17 @@ public static class AsciiChart
1515 /// <param name="options">The plot options.</param>
1616 /// <returns>The ASCII Chart.</returns>
1717 public static string Plot ( IEnumerable < double > series , Options options = null )
18+ {
19+ return Plot ( new [ ] { series } , options ) ;
20+ }
21+
22+ public static string Plot ( IEnumerable < IEnumerable < double > > data , Options options = null )
1823 {
1924 options = options ?? new Options ( ) ;
2025
21- var seriesList = series . ToList ( ) ;
22- var min = seriesList . Where ( v => ! double . IsNaN ( v ) ) . Min ( ) ;
23- var max = seriesList . Max ( ) ;
26+ var dataList = data . ToList ( ) ;
27+ var min = dataList . SelectMany ( s => s ) . Where ( v => ! double . IsNaN ( v ) ) . Min ( ) ;
28+ var max = dataList . SelectMany ( s => s ) . Max ( ) ;
2429
2530 var range = Math . Abs ( max - min ) ;
2631 var ratio = range == 0 ? 0 : ( options . Height ?? range ) / range ;
@@ -29,52 +34,56 @@ public static string Plot(IEnumerable<double> series, Options options = null)
2934 var rows = Math . Abs ( max2 - min2 ) ;
3035
3136 var columnIndexOfFirstDataPoint = options . AxisLabelRightMargin + NumberOfNonDataColumns ;
32- var width = seriesList . Count + columnIndexOfFirstDataPoint ;
37+ var width = dataList . Max ( s => s . Count ( ) ) + columnIndexOfFirstDataPoint ;
3338
3439 var resultArray = CreateAndFill2dArray ( rows , width , options . Fill . ToString ( ) ) ;
3540
3641 var yAxisLabels = GetYAxisLabels ( max , range , rows , options ) ;
3742 ApplyYAxisLabels ( resultArray , yAxisLabels , columnIndexOfFirstDataPoint ) ;
3843
39- var rowIndex0 = Math . Round ( seriesList [ 0 ] * ratio , MidpointRounding . AwayFromZero ) - min2 ;
40- if ( ! double . IsNaN ( rowIndex0 ) )
41- {
42- resultArray [ ( int ) ( rows - rowIndex0 ) ] [ columnIndexOfFirstDataPoint - 1 ] = "┼" ;
43- }
44-
45- for ( var x = 0 ; x < seriesList . Count - 1 ; x ++ )
44+ foreach ( var series in dataList )
4645 {
47- var rowIndex1 = Math . Round ( seriesList [ x + 1 ] * ratio , MidpointRounding . AwayFromZero ) - min2 ;
48- if ( double . IsNaN ( rowIndex0 ) && double . IsNaN ( rowIndex1 ) )
46+ var seriesList = series . ToList ( ) ;
47+ var rowIndex0 = Math . Round ( seriesList [ 0 ] * ratio , MidpointRounding . AwayFromZero ) - min2 ;
48+ if ( ! double . IsNaN ( rowIndex0 ) )
4949 {
50- continue ;
50+ resultArray [ ( int ) ( rows - rowIndex0 ) ] [ columnIndexOfFirstDataPoint - 1 ] = "┼" ;
5151 }
5252
53- if ( double . IsNaN ( rowIndex0 ) )
54- {
55- resultArray [ ( int ) ( rows - rowIndex1 ) ] [ x + columnIndexOfFirstDataPoint ] = "╶" ;
56- }
57- else if ( double . IsNaN ( rowIndex1 ) )
58- {
59- resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = "╴" ;
60- }
61- else if ( rowIndex0 == rowIndex1 )
62- {
63- resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = "─" ;
64- }
65- else
53+ for ( var x = 0 ; x < seriesList . Count - 1 ; x ++ )
6654 {
67- resultArray [ ( int ) ( rows - rowIndex1 ) ] [ x + columnIndexOfFirstDataPoint ] = rowIndex0 > rowIndex1 ? "╰" : "╭" ;
68- resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = rowIndex0 > rowIndex1 ? "╮" : "╯" ;
69- var from = Math . Min ( rowIndex0 , rowIndex1 ) ;
70- var to = Math . Max ( rowIndex0 , rowIndex1 ) ;
71- for ( var y = from + 1 ; y < to ; y ++ )
55+ var rowIndex1 = Math . Round ( seriesList [ x + 1 ] * ratio , MidpointRounding . AwayFromZero ) - min2 ;
56+ if ( double . IsNaN ( rowIndex0 ) && double . IsNaN ( rowIndex1 ) )
7257 {
73- resultArray [ ( int ) ( rows - y ) ] [ x + columnIndexOfFirstDataPoint ] = "│" ;
58+ continue ;
7459 }
75- }
7660
77- rowIndex0 = rowIndex1 ;
61+ if ( double . IsNaN ( rowIndex0 ) )
62+ {
63+ resultArray [ ( int ) ( rows - rowIndex1 ) ] [ x + columnIndexOfFirstDataPoint ] = "╶" ;
64+ }
65+ else if ( double . IsNaN ( rowIndex1 ) )
66+ {
67+ resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = "╴" ;
68+ }
69+ else if ( rowIndex0 == rowIndex1 )
70+ {
71+ resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = "─" ;
72+ }
73+ else
74+ {
75+ resultArray [ ( int ) ( rows - rowIndex1 ) ] [ x + columnIndexOfFirstDataPoint ] = rowIndex0 > rowIndex1 ? "╰" : "╭" ;
76+ resultArray [ ( int ) ( rows - rowIndex0 ) ] [ x + columnIndexOfFirstDataPoint ] = rowIndex0 > rowIndex1 ? "╮" : "╯" ;
77+ var from = Math . Min ( rowIndex0 , rowIndex1 ) ;
78+ var to = Math . Max ( rowIndex0 , rowIndex1 ) ;
79+ for ( var y = from + 1 ; y < to ; y ++ )
80+ {
81+ resultArray [ ( int ) ( rows - y ) ] [ x + columnIndexOfFirstDataPoint ] = "│" ;
82+ }
83+ }
84+
85+ rowIndex0 = rowIndex1 ;
86+ }
7887 }
7988
8089 return ToString ( resultArray ) ;
0 commit comments