Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/tool3/chartscii

πŸ“Š create beautiful ascii charts
https://github.com/tool3/chartscii

ascii ascii-chart chart javascript npm-package

Last synced: 2 months ago
JSON representation

πŸ“Š create beautiful ascii charts

Awesome Lists containing this project

README

        

# Chartscii 3.0!

![](./shellfies/chartscii_main.png)

[![](https://img.shields.io/static/v1?label=created%20with%20shellfie&message=πŸ“Έ&color=pink)](https://github.com/tool3/shellfie)

for command line usage see: [chartscii-cli](https://github.com/tool3/chartscii-cli)

Chartscii was rewritten from scratch in TypeScript!
It includes many new features, improvements and rich formatting capabilities.

# What’s new

βœ… Full width and height control.
βœ… New `padding` and `barSize` options!
βœ… New `orientation` option! vertical charts are here!
βœ… New rich styl3 formatting support!
βœ… New Emoji characters support! [\*](#unicode-issues)

# install

```bash
npm install chartscii
```

# usage

`chartscii` accepts an array of data objects, with optional labels, and outputs an ascii bar chart.

## usage example

```typescript
import Chartscii from "chartscii";

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const options = {
title: "chartscii",
width: 50,
theme: "pastel",
color: "pink",
colorLabels: true,
barSize: 2,
orientation: "vertical"
};
const chart = new Chartscii(data, options);
console.log(char.create());
```

![](./shellfies/chartscii_simple.png)

# Input

Chartscii accepts an array of data points to draw the chart.

This can be an array of numbers, or an array of chart points as explained below.

## number[]

If you provide an array of numbers, chartscii will draw each bar using the provided values.

Value is scaled to width/height of chart, depending on the orientation option.

### example

```tsx
import Chartscii from "chartscii";

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const chart = new Chartscii(data);
console.log(chart.create());
```

![](./shellfies//chartscii_dead_simple.png)

## ChartPoint[]

For maximum flexibility, provide an array of chart points. This will allow you to customize the following properties:

| name | description | type | default |
| ----- | ----------- | ------ | ------------- |
| label | bar label | string | point.value |
| value | bar value | number | N/A |
| color | bar color | string | options.color |

### example

```tsx
import Chartscii from "chartscii";

const data = [
{ label: "label", value: 2, color: "pink" },
{ label: "label", value: 2, color: "purple" },
{ label: "label", value: 2, color: "marine" }
];
const chart = new Chartscii(data, { colorLabels: true, valueLabels: true });
console.log(chart.create());
```

![](./shellfies/chartscii_chartpoint.png)

# Options

You can customize the look and size of the chart, as well as rich formatting for labels provided by `styl3`.

## default options

Chartscii accepts customization options as a second argument and will merge the provided options with the following one:

```tsx
const options: ChartOptions = {
percentage: false,
colorLabels: false,
sort: false,
reverse: false,
naked: false,
labels: true,
color: undefined,
fill: undefined,
width: 100,
height: 10,
padding: 0,
barSize: 1,
title: "",
char: "β–ˆ",
orientation: "horizontal",
theme: "",
structure: {
x: "═",
y: "β•’",
axis: "β•‘",
topLeft: "β•”",
bottomLeft: "β•š"
}
};
```

## customization options

| name | description | type | default |
| ----------- | ----------------------------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------- |
| percentage | calculate and show percentage data | `boolean` | `false` |
| colorLabels | color labels with provided color per label, or color provided to option | `boolean` | `false` |
| valueLabels | show values of each bar | `boolean` | `false` |
| sort | sort the input data | `boolean` | `false` |
| reverse | reverse the input data | `boolean` | `false` |
| naked | don’t print chart structure ascii characters | `boolean` | `false` |
| labels | show labels | `boolean` | `true` |
| color | fallback color or unified char bars color | `string` | `undefined` |
| fill | use this character to fill remaining chart bar space | `string` | `undefined` |
| scale | values are scaled proportionate to this value. otherwise the max will be calculated from the provided data. | `number` or `string` | `auto` |
| width | width of chart | `number` | `100` |
| height | height of chart | `number` | `10` |
| padding | padding between bars | `number` | `0` |
| barSize | size of each bar | `number` | `1` |
| title | chart title | `string` | `undefined` |
| char | use this character to draw the chart bars | `string` | `β–ˆ` |
| orientation | horizontal or vertical | `string` | `horizontal` |
| theme | `styl3`'s [themes](https://github.com/tool3/styl3?tab=readme-ov-file#themes) | `string` | `undefined` |
| structure | use these characters to draw the enclosing chart borders. | `object` | `{ x: '═', y: 'β•’', bottomLeft: 'β•š', axis: 'β•‘', topLeft: 'β•”' }` |

## chartscii + styl3 = ❀️

You can use `styl3`’s [formatting](https://github.com/tool3/styl3?tab=readme-ov-file#map) for cool themes, built-in color names and rich label formatting.

You should check out `styl3` for a full list of customization options.

### example

```tsx
const colors = [
"red",
"green",
"yellow",
"blue",
"purple",
"pink",
"cyan",
"orange"
];

const data = [];
for (let i = 0; i < colors.length; i++) {
const color = colors[i];
data.push({ value: i + 1, color, label: `@invert ${i}@`, theme: "pastel" });
}

const chart = new Chartscii(data, {
fill: "β–‘",
colorLabels: true,
orientation: "vertical"
});

console.log(chart.create());
```

![](./shellfies/chartscii_styl3.png)

# examples

here are some examples of charts using `styl3`'s formatting on the chart labels.

> [!TIP]
> you can run more examples from the `./examples/` directory of this repository using `ts-node`.
> for example `npx ts-node examples/loaders.ts`

## vertical

| options | chart |
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| beach theme with italic and bold labels with a bar size of 2 | ![](./shellfies/vertical/chartscii_beach_italic_bold_barsize.png) |
| pastel theme with bold and underlined labels with padding of 2 | ![](./shellfies/vertical/chartscii_pastel_bold_underline_padding.png) |
| lush theme with strikedout labels no padding and emoji | ![](./shellfies/vertical/chartscii_lush_strikeout_emoji.png) |
| lush theme with underlined labels no padding and no axis structure char | ![](./shellfies/vertical/chartscii_lush_underline_no_axis_structure.png) |
| standard theme with dimmed and italic labels and padding 1 | ![](./shellfies/vertical/chartscii_standard_dimmed_italic_padding_structure.png) |
| pastel theme with inverted and underlined labels with a dark fill character | ![](./shellfies/vertical/chartscii_pastel_inverted_underline_dark_fill.png) |

## horizontal

| options | chart |
| --------------------------------------------------------------------- | ------------------------------------------------------------------- |
| pastel theme with bold labels and percentage | ![](./shellfies/horizontal/chartscii_pastel_bold_percentage.png) |
| lush theme with inverted labels and naked chart | ![](./shellfies/horizontal/chartscii_pastel_lush_invert_naked.png) |
| beach theme with underlined labels and different structure characters | ![](./shellfies/horizontal/chartscii_beach_underline_structure.png) |
| pastel theme with padding of 1 and custom char | ![](./shellfies/horizontal/chartscii_pastel_char.png) |
| pastel theme with naked chart to create multiple loaders | ![](./shellfies/horizontal/chartscii_loaders.png) |

# Unicode issues

Unfortunately, there are some known issues with specific unicode characters width.
This means that some emoji/unicode characters renders as 2 characters wide (or more) instead of 1, which is not a problem in itself.
The problem is that Javscript determines this length as 1, which creates an issue with label alignment, or drawing the chart bars correctly.

> [!WARNING]
> If you have issues with label alignment, or the chart bars aren't spaced correctly - you are probably using an emoji/unicode character which produce the wrong width in javascript.

If you encounter this issue unfortunately the current solution is to simply use a different emoji.
(For example: πŸ”₯ works well while βœ… will result in a misaligned chart).
PRs for this problem are more than welcome.