Skip to content
master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Build Status

Tables and Graphs

C++ 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.

Tables

Usage

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.

Output char array as table

#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.

Output array as table with separate header row and column

#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.

Output array as table

#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;
}

Output sorted array as table

#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;
}

Output single function as table

#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;
}

Output multiple functions as table

#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;
}

Options

Header row

Option: headerrow
Default value: false

Header rows are bolded and centered.

Header column

Option: headercolumn
Default value: false

Header columns are bolded and centered.

Table border

Option: tableborder
Default value: true

Cell border

Option: cellborder
Default value: false

Requires tableborder to be true.

Cell padding

Option: padding
Default value: 1

Alignment

Option: alignment
Values:

  • left (default)
  • right

bool to alpha

Option: boolalpha
Default value: false

Title

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.

Border style

Option: style
Values:

  1. ASCII

  2. Basic

  3. Light (default)

  4. Heavy

  5. Double

  6. Light Dashed

  7. Heavy Dashed

Other C++ Console Tables Libraries

  • 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)

Graphs/Plots

Usage

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).

Output array as plot

#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.

Output single function as graph

#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;
}

Output multiple functions as graph

#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;
}

Options

Border/Axis

Option: border
Default value: true

Axis labels

Option: axislabel
Default value: true

Requires border to be true.

Axis units labels

Option: axisunitslabel
Default value: true

Requires border and axislabel to be true.

Title

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.

Axis/Border style

Option: style
Values:

  1. ASCII

  2. Basic

  3. Light (default)

  4. Heavy

  5. Double

  6. Light Dashed

  7. Heavy Dashed

Graph/Plot Color

Option: color
Values:

  1. System default
  2. Black
  3. Red (default)
  4. Green
  5. Yellow
  6. Blue
  7. Cyan
  8. Light gray
  9. Dark gray
  10. Light red
  11. Light green
  12. Light yellow
  13. Light blue
  14. Light cyan
  15. 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.

Plot

Graph

Other C++ Console Graphs/Plots Libraries

Contributing

Pull requests welcome! Ideas for contributions:

  • 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 more examples
  • Improve the performance
  • Handle newlines, tabs and formatted text in the tables
  • Handle formatted text in the table and graph/plot titles
  • Support more graph/plot colors
    • Support combining colors when functions cross
  • Support plotting multiple arrays of different sizes
  • 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.)

About

C++ Console Table and Graph/Plot Libraries

Resources

License

Releases

No releases published

Packages

No packages published

Languages