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.
par Mansour Ayouni · dans le dépôt depuis le 2025-06-08 · essai de fonction · domaine Graphisme
Cet article est écrit en anglais, comme la bibliothèque.
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:
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:
ochart {
SetTopChar("●")
SetBarChar("┃")
SetBarWidth(1)
Show()
}illustration
↑ │ ● ● │ ┃ ● ┃ ● │ ┃ ┃ ┃ ● ┃ │ ┃ ┃ ┃ ┃ ┃ │ ┃ ┃ ● ┃ ┃ ● ┃ │ ┃ ┃ ┃ ┃ ┃ ┃ ┃ │ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ╰──────────────────────> X1 X2 X3 X4 X5 X6 X7
Enhanced Analysis: Values and Averages
Statistical insights integrate directly into visualizations:
oPlot = new stzVBarPlot([
:Q1 = 9, :Q2 = 25, :Q3 = 15, :Q4 = 32, :Q5 = 20
])
oPlot {
AddValues()
AddAverage()
SetBarWidth(1)
SetTopChar("▲")
Show()
}illustration
↑ │ 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:
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:
oPlot = new stzHBarPlot([ :Warda = 5, :Yessmina = 8, :Folla = 3 ]) oPlot.AddPercent() oPlot.Show()
illustration
^
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:
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:
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:
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:
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:
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.
Citer
Mansour Ayouni. « Softanza Ploting System: Where AsciiArt Meets DataViz ». Softanza narrations, 2025. https://mayouni.github.io/stzsite/fr/narrations/stz-plotting-system-narration.html
Non exécuté : son code touche aux fichiers, au réseau, à l'horloge ou au hasard. L'article est publié tel qu'il est écrit ; ses blocs sont des illustrations. Le code des articles est du code Haro. Là où un article a été écrit avant que la langue prenne son nom actuel, le nom a été changé et rien d'autre. Genre, domaine et série lus dans le nom du fichier, année tirée du premier commit : dérivés, jusqu'à ce que l'article porte son propre en-tête. Le fichier sur GitHub(s'ouvre dans un nouvel onglet)

