Console Table and Graph/Plot Libraries
Copyright © 2018 Teal Dulcet
These header only libraries use box-drawing, Braille, fraction and other Unicode characters and terminal colors and formatting to output tables and graphs/plots to the console. All the tables and graphs are created with a single (one) function call and they do not require any special data structures.
❤️ Please visit tealdulcet.com to support these libraries and my other software development.
Complete versions of all of the examples below and more can be found in the tables.cpp file.
Compile with: g++ -Wall -g -O3 tables.cpp -o tables
.
Run with: ./tables
.
#include "tables.hpp"
using namespace std;
int main()
{
size_t rows = 5;
size_t columns = 5;
char ***array;
// Allocate and set array
tableoptions aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
table(rows, columns, array, NULL, NULL, aoptions);
// Deallocate array
return 0;
}
Table cells can contain Unicode characters, but not newlines and tabs.
#include "tables.hpp"
using namespace std;
int main()
{
size_t rows = 4;
size_t columns = 4;
const char* headerrow[] = {"Header row/column 1", "Header row 2", "Header row 3", "Header row 4", "Header row 5"};
const char* headercolumn[] = {"Header column 2", "Header column 3", "Header column 4", "Header column 5"};
char ***array;
// Allocate and set array
tableoptions aoptions;
aoptions.headerrow = true;
aoptions.headercolumn = true;
table(rows, columns, array, headerrow, headercolumn, aoptions);
// Deallocate array
return 0;
}
Output same as example above.
#include "tables.hpp"
using namespace std;
int main()
{
size_t rows = 5;
size_t columns = 5;
double **array; // array can be any data type
// Allocate and set array
table(rows, columns, array, NULL, NULL, tabledefaultoptions);
// Deallocate array
return 0;
}
#include <algorithm>
#include "tables.hpp"
using namespace std;
int dimensions; // Number of columns
int sortdimension; // Column to sort by
template <typename T>
bool compare(const T *a, const T *b)
{
if (a[sortdimension] == b[sortdimension])
for (int i = 0; i < dimensions; ++i)
if (sortdimension != i and a[i] != b[i])
return a[i] < b[i];
return a[sortdimension] < b[sortdimension];
}
int main()
{
size_t rows = 5;
size_t columns = 5;
int **array; // array can be any data type
// Allocate and set array
dimensions = columns;
sortdimension = 0;
sort(array, array + rows, compare<int>);
table(rows, columns, array, NULL, NULL, tabledefaultoptions);
// Deallocate array
return 0;
}
#include "tables.hpp"
using namespace std;
double afunction(double x)
{
return x + 1;
}
int main()
{
double xmin = -10;
double xmax = 10;
double xscl = 2;
tableoptions aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, afunction, aoptions);
return 0;
}
#include <cmath>
#include "tables.hpp"
using namespace std;
double function1(double x)
{
return 2 * x;
}
double function2(double x)
{
return pow(x, 2);
}
int main()
{
double xmin = -10;
double xmax = 10;
double xscl = 2;
size_t numfunctions = 2;
// Function parameter and return value can be any data type, as long as they are the same
double (*functions[])(double) = {function1, function2};
tableoptions aoptions;
aoptions.headerrow = true;
table(xmin, xmax, xscl, numfunctions, functions, aoptions);
return 0;
}
Option: headerrow
Default value: false
Header rows are bolded, centered and have a border.
Option: headercolumn
Default value: false
Header columns are bolded, centered and have a border.
Option: tableborder
Default value: true
Option: cellborder
Default value: false
Option: padding
Default value: 1
Option: alignment
Values:
left
(default)right
Option: boolalpha
Default value: false
Option: title
Default value: NULL
The title is word wrapped based on the current width of the terminal, using this solution. Handles newlines, tabs and Unicode characters.
Option: style
Values:
- C++ Text Table (must specify every cell individually in their data structure, limited options, no Unicode support, no header row or column support)
- Cpp Console Table (must specify every cell individually in their data structure, no Unicode support, no header row or column support)
- ConsoleTable (requires C++11, must specify entire row at once in their data structure, no header column support)
Complete versions of all of the examples below and more can be found in the graphs.cpp file.
Compile with: g++ -Wall -g -O3 graphs.cpp -o graphs
.
Run with: ./graphs
.
If height
is 0
, it will be set to the current height of the terminal (number of rows times four). If width
is 0
, it will be set to the current width of the terminal (number of columns times two).
#include "graphs.hpp"
using namespace std;
int main()
{
size_t height = 160;
size_t width = 160;
long double xmin = -20;
long double xmax = 20;
long double ymin = -20;
long double ymax = 20;
size_t rows = 10;
double **array; // array can be any data type, but must have exactly two columns
// Allocate and set array
graph(height, width, xmin, xmax, ymin, ymax, rows, array, graphdefaultoptions);
// Deallocate array
return 0;
}
If xmin
and xmax
are both 0
, they will be set to the respective minimum and maximum values of x in the array. If ymin
and ymax
are both 0
, they will be set to the respective minimum and maximum values of y in the array.
#include "graphs.hpp"
using namespace std;
double afunction(double x)
{
return x + 1;
}
int main()
{
size_t height = 160;
size_t width = 160;
long double xmin = -20;
long double xmax = 20;
long double ymin = -20;
long double ymax = 20;
graph(height, width, xmin, xmax, ymin, ymax, afunction, graphdefaultoptions);
return 0;
}
#include "graphs.hpp"
using namespace std;
double function1(double x)
{
return 2 * x;
}
double function2(double x)
{
return pow(x, 2);
}
int main()
{
size_t height = 160;
size_t width = 160;
long double xmin = -20;
long double xmax = 20;
long double ymin = -20;
long double ymax = 20;
size_t numfunctions = 2;
// Function parameter and return value can be any data type, as long as they are the same
double (*functions[])(double) = {function1, function2};
graph(height, width, xmin, xmax, ymin, ymax, numfunctions, functions, graphdefaultoptions);
return 0;
}
Option: border
Default value: true
Option: axislabel
Default value: true
Requires border
to be true
.
Option: axisunitslabel
Default value: true
Requires border
and axislabel
to be true
.
Option: title
Default value: NULL
The title is word wrapped based on the current width of the terminal, using this solution. Handles newlines, tabs and Unicode characters.
Option: style
Values:
Option: color
Values:
- System default
- Black
- Red (default)
- Green
- Yellow
- Blue
- Cyan
- Light gray
- Dark gray
- Light red
- Light green
- Light yellow
- Light blue
- Light cyan
- White
See here for examples of the colors.
Only used for plots and when graphing a single function.
When graphing multiple functions, colors 2
- 14
are used inorder. Color 0
is used where the functions cross.
- C++ terminal plotting library (requires C++14, based on UnicodePlots.jl, no documentation and very difficult to use, although supports animations)
Pull requests welcome! Ideas for contributions:
Both:
- Add more options
- Add an option to print a border around graphs/plots
- Add options to word wrap and truncate long text in table cells
- Add option to center text in table cells
- Add more examples
- Improve the performance
- Handle newlines and tabs in the tables
- Handle formatted text in the table and graph/plot titles
- Support more graph/plot colors
- Support 24-bit color
- Support combining colors when functions cross
- Update the
-t, --table
options of column command from util-linux to use the Table library - Create a new CLI tool that uses the Graph library
- Port to other languages (C, Java, Rust, etc.)
C++:
- Handle formatted text in the tables
- Support plotting multiple arrays of different sizes