Softanza
StartFrançais
Softanza
Research · narration

Softanza Ploting System: Where AsciiArt Meets DataViz

Data visualization turns raw numbers into understanding. The Softanza Ploting System elevates that idea by transforming numbers into expressive, text-based visual stories. Built entirely with ASCII characters, it integrates effortlessly into terminals, logs, reports, or any text-based environment.

by Mansour Ayouni · in the repository since 2025-06-08 · feature essay · area Graphics

Introduction

At Softanza, we believe every chart should provide actionable insight, not just decoration. Our charts serve four fundamental purposes in data visualization: comparison, composition, distribution, and relationship:

  • Bar Plots are ideal for comparison – "Which value is bigger?"
  • Multi-bar Plots handle complex comparisons – "How do multiple metrics compare across categories?"
  • Surface Plots highlight composition – "What are the parts of this whole?"
  • Histograms show distribution – "How are values spread out?"
  • Scatter Plots uncover relationships – "How do variables relate to one another?"

This article guides you through a practical and pragmatic approach to data visualization, grounded in many years of hand-on experience in the field of data analytics.

The Foundation: Vertical Bar Plots for Comparison

Creating basic comparison visualizations is straightforward:

Haro
oPlot = new stzPlot([ 5, 4, 2, 5, 3, 2, 4 ])
ochart.Show()

illustration

This transforms data into recognizable patterns:

↑                       
│ ██       ██           
│ ██ ██    ██       ██  
│ ██ ██    ██ ██    ██  
│ ██ ██    ██ ██    ██  
│ ██ ██ ██ ██ ██ ██ ██  
│ ██ ██ ██ ██ ██ ██ ██  
│ ██ ██ ██ ██ ██ ██ ██  
╰──────────────────────>
  X1 X2 X3 X4 X5 X6 X7  

Customization options provide visual refinement:

Haro
ochart {
    SetTopChar("●")
    SetBarChar("┃")
    SetBarWidth(1)
    Show()
}

illustration

Promised output
↑                       
│ ●        ●            
│ ┃  ●     ┃        ●   
│ ┃  ┃     ┃  ●     ┃   
│ ┃  ┃     ┃  ┃     ┃   
│ ┃  ┃  ●  ┃  ┃  ●  ┃   
│ ┃  ┃  ┃  ┃  ┃  ┃  ┃   
│ ┃  ┃  ┃  ┃  ┃  ┃  ┃   
╰──────────────────────>
  X1 X2 X3 X4 X5 X6 X7  

Enhanced Analysis: Values and Averages

Statistical insights integrate directly into visualizations:

Haro
oPlot = new stzVBarPlot([
    :Q1 = 9, :Q2 = 25, :Q3 = 15, :Q4 = 32, :Q5 = 20
])

oPlot {
    AddValues()
    AddAverage()
    SetBarWidth(1)
    SetTopChar("▲")
    Show()
}

illustration

Promised output
↑                       
│          32           
│    25    ▲            
│    ▲     █  20        
│----█--15-█--▲--- 20.2 
│    █  ▲  █  █         
│ 9  █  █  █  █         
│ ▲  █  █  █  █         
│ █  █  █  █  █         
╰────────────────>      
  Q1 Q2 Q3 Q4 Q5      

The horizontal average line at 20.2 reveals which quarters performed above or below mean.

Global Perspective: Percentage Analysis

Percentage functionality provides crucial context for diverse datasets:

Haro
oPlot = new stzVBarPlot([
    :Mali = 42, :Niger = 18, :Egypt = 73, :Bosnia = 29,
    :Brazil = 35, :France = 70, :Spain = 14, :SouthKorea = 34
])

oPlot {
    AddLabels()
    AddPercent()
    SetHeight(5)
    Show()
}

illustration

This creates a normalized view that reveals relative proportions:

↑                                                          
│             23.2%               22.2%                    
│              ██                   ██                     
│ 13.3%        ██          11.1%    ██           10.8%     
│  ██   5.7%   ██    9.2%    ██     ██             ██      
│  ██    ██    ██     ██     ██     ██   4.4%      ██      
│  ██    ██    ██     ██     ██     ██    ██       ██      
╰─────────────────────────────────────────────────────────>
  Mali  Niger Egypt Bosnia Brazil France Spain Southkorea  

Horizontal Perspectives: Alternative Viewpoints

Sometimes, the most insightful perspective comes from changing your viewpoint. Horizontal bar charts excel when category names are long or when you want to emphasize ranking:

Haro
oPlot = new stzHBarPlot([ :Warda = 5, :Yessmina = 8, :Folla = 3 ])
oPlot.AddPercent()
oPlot.Show()

illustration

Promised output
         ^                         
   Warda │ ▇▇▇▇▇▇▇▇▇▇▇▇ 31.2%      
Yessmina │ ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 50%  
   Folla │ ▇▇▇▇▇▇▇ 18.8%           
         ╰───────────────────>   

This format immediately highlights Yessmina's leadership position while maintaining clear proportional relationships.

Multi-Dimensional Analysis: Complex Comparisons

Multi-bar charts handle simultaneous metric comparisons:

Haro
oPlot = new stzMultiBarPlot([
    :Sales = [ :Q1=25, :Q2=35, :Q3=30, :Q4=40 ],
    :Costs = [ :Q1=15, :Q2=20, :Q3=18, :Q4=22 ],
    :Profit = [ :Q1=10, :Q2=15, :Q3=12, :Q4=14 ]
])

oPlot {
    SetBarWidth(1)
    SetBarSpace(2)
    SetCategorySpace(5)
    AddValues()
    SetLegend(FALSE)
    Show()
}

illustration

This produces a comprehensive quarterly analysis:

↑                                              
│            35                      40        
│             █          30           █        
│25           █           █           █        
│ █           █ 20        █ 18        █ 22     
│ █ 15        █  ▒ 15     █  ▒ 12     █  ▒ 14  
│ █  ▒ 10     █  ▒  ▓     █  ▒  ▓     █  ▒  ▓  
│ █  ▒  ▓     █  ▒  ▓     █  ▒  ▓     █  ▒  ▓  
│ █  ▒  ▓     █  ▒  ▓     █  ▒  ▓     █  ▒  ▓  
╰─────────────────────────────────────────────>
    Q1          Q2          Q3          Q4     

The visual immediately reveals that while sales grew consistently, the profit margin remained relatively stable, suggesting effective cost management.

Compositional Insights: Understanding the Whole

When your goal shifts from comparison to understanding how parts relate to the whole, Softanza's surface charts provide an innovative treemap-like visualization:

Haro
oPlot = new stzSurfacePlot([
    :Sales = 45, :Marketing = 25, :Dev = 20, :Support = 10
])
oPlot.AddPercent().AddLegend().AddValues().Show()

illustration

Output:

╭──────────────────────────┬───────────╮
│                          │           │
│          Sales           │   Dev     │
│        45 (45%)          │ 20 (20%)  │
│                          │           │
│                          │           │
│                          │           │
├──────────────────────────┼───────────┤
│        Marketing         │ Support   │
│        25 (25%)          │ 10 (10%)  │
│                          │           │
╰──────────────────────────┴───────────╯

This format excels at showing organizational structure, budget allocation, or any scenario where understanding proportional relationships is crucial.

Statistical Distribution: Histograms for Deep Insights

Moving beyond simple comparison and composition, Softanza addresses the critical need for understanding data distribution through sophisticated histogram functionality:

Haro
aScores = [
    85, 92, 78, 88, 95, 82, 90, 87, 93, 86, 
    79, 91, 84, 89, 96, 83, 88, 92, 87, 85
]

oPlot = new stzHistogram(aScores)
oPlot {
    UseFrequency()
    AddPercent()
    Show()
}

illustration

Output:

^                                          
│                       25%                
│                20%    ██     20%         
│                ██     ██     ██     15%  
│  10%    10%    ██     ██     ██     ██   
│  ██     ██     ██     ██     ██     ██   
│  ██     ██     ██     ██     ██     ██   
╰──────────────────────────────────────────>
   78     81     84     87     90     93   
   81     84     87     90     93     96  

This histogram reveals the distribution shape, showing that most scores cluster around the 87-90 range, with the distribution being roughly normal. Such insights are impossible to glean from simple summary statistics alone.

Relationship Analysis: Scatter Plots for Correlation

Understanding relationships between variables is fundamental to data analysis. Softanza's scatter plots provide clear correlation visualization:

Haro
oPlot = new stzScatterPlot([ 
    :Ali = [10, 25], :Ben = [15, 30], 
    :Tom = [20, 22], :Maiga = [25, 35] 
])
oPlot.AddGrid()
oPlot.AddLabels()
oPlot.Show()

illustration

Output:

    X
    ▲
    │                                     
 35 ┼----------------------------● Maiga  
    │                            ⁞        
    │                            ⁞        
    │                            ⁞        
 30 ┼---------● Ben              ⁞        
    │         ⁞                  ⁞        
    │         ⁞                  ⁞        
 25 ┼● Ali    ⁞                  ⁞        
 22 ┼⁞--------⁞--------● Tom     ⁞        
    ╰┼────────┼────────┼─────────┼──► Y       
    10       15       20        25       

The grid lines make it easy to read precise values while the overall pattern reveals correlations—in this case, Tom appears to be an outlier in the otherwise positive relationship between X and Y variables.

Practical Intelligence: Automatic Formatting

One of Softanza's most thoughtful features is its automatic data formatting. When dealing with large numbers, the system intelligently converts them to more readable formats:

Haro
aSalaries = [
    45000, 52000, 48000, 67000, 55000, 49000, 58000, 
    62000, 51000, 46000, 59000, 53000, 47000, 61000, 
    56000, 50000, 54000, 48000, 60000, 57000
]

oPlot = new stzHistogram(aSalaries)
oPlot {
    SetClassCount(6)
    AddPercent()
    SetBarChar("▓")
    Show()
}

illustration

output:

^                                                      
│   25%                                                
│   ▓▓       20%               20%                     
│   ▓▓       ▓▓       15%      ▓▓       15%            
│   ▓▓       ▓▓       ▓▓       ▓▓       ▓▓             
│   ▓▓       ▓▓       ▓▓       ▓▓       ▓▓       5%    
│   ▓▓       ▓▓       ▓▓       ▓▓       ▓▓       ▓▓    
╰──────────────────────────────────────────────────────>
   45.0K    48.7K    52.3K    56.0K    59.7K    63.3K  
   48.7K    52.3K    56.0K    59.7K    63.3K    67.0K  

Notice how the system automatically converts thousands to "K" notation, dramatically improving readability without losing precision.

Softanza Advantages

Comparison with ASCII Ploting Solutions

Feature Softanza UniPlot asciicharts spark blessed termgraph
Language Haro Python JavaScript Various Node.js Python
Bar Plots ✅ Full ✅ Basic ✅ Basic ❌ ✅ Basic ✅ Basic
Multi-Bar Plots ✅ Advanced ❌ ❌ ❌ ❌ ❌
Histograms ✅ Full ✅ Basic ❌ ❌ ❌ ❌
Scatter Plots ✅ Full ✅ Basic ❌ ❌ ❌ ❌
Surface Plots ✅ Unique ❌ ❌ ❌ ❌ ❌
Automatic Formatting ✅ Advanced ❌ ❌ ❌ ❌ ✅ Basic
Statistical Integration ✅ Built-in ❌ ❌ ❌ ❌ ❌
Customizable Characters ✅ Full ✅ Limited ✅ Limited ❌ ✅ Limited ✅ Basic
Grid Support ✅ ✅ ❌ ❌ ✅ ❌
Percentage Display ✅ ❌ ❌ ❌ ❌ ❌
Value Labels ✅ ❌ ❌ ❌ ❌ ❌
Average Lines ✅ ❌ ❌ ❌ ❌ ❌

Future Horizons: Expanding the Analytical Toolkit

Planned extensions include:

Time Series Analysis: Line charts for trend analysis, revealing patterns and seasonality impossible to detect in static comparisons.

Enhanced Composition: Stacked bar charts and pie charts for deeper compositional insights across multiple categories.

Advanced Distribution: Box plots displaying median, quartiles, and outliers for rich statistical insights.

Specialized Analytics: Waterfall charts for financial analysis, dot plots for precise comparisons, and heatmaps for correlation matrices.

Dashboard Monitoring: Gauge charts for real-time KPI monitoring and performance dashboards.

Conclusion

The Softanza Ploting System prioritizes understanding over aesthetics, accessibility over complexity, and purpose over decoration. By combining ASCII art's universal readability with sophisticated analytical capabilities, it creates powerful data exploration tools that work everywhere.

Whether comparing quarterly performance, understanding demographics, or exploring correlations, Softanza provides the right analytical tool while maintaining core principles: simplicity in interface, sophistication in analysis, and clarity in communication.

Cite

Mansour Ayouni. "Softanza Ploting System: Where AsciiArt Meets DataViz". Softanza narrations, 2025. https://mayouni.github.io/stzsite/en/narrations/stz-plotting-system-narration.html

Not run: its code touches files, the network, the clock or chance. The article is published as written; its blocks are illustrations. The code of the articles is Haro code. Where an article was written before the language took its present name, the name was changed and nothing else. Genre, area and series read from the file's name, the year from its first commit: derived, until the article carries its own header. The file on GitHub(opens in a new tab)