plotcli-py 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. CLAUDE.md +51 -0
  2. LICENSE +21 -0
  3. PKG-INFO +358 -0
  4. README.md +340 -0
  5. main.py +6 -0
  6. plotcli-original/.Rbuildignore +18 -0
  7. plotcli-original/.github/workflows/deploy_docs.yml +43 -0
  8. plotcli-original/.gitignore +46 -0
  9. plotcli-original/DESCRIPTION +25 -0
  10. plotcli-original/NAMESPACE +60 -0
  11. plotcli-original/NEWS.md +112 -0
  12. plotcli-original/R/ascii_escape.r +13 -0
  13. plotcli-original/R/canvas.r +586 -0
  14. plotcli-original/R/class_functions.r +114 -0
  15. plotcli-original/R/geom_registry.r +1376 -0
  16. plotcli-original/R/ggplotcli.r +234 -0
  17. plotcli-original/R/ggplotcli_helpers.r +1099 -0
  18. plotcli-original/R/helper_functions.r +351 -0
  19. plotcli-original/R/plotcli.r +963 -0
  20. plotcli-original/R/plotcli_grid.r +1 -0
  21. plotcli-original/R/plotcli_wrappers.r +416 -0
  22. plotcli-original/R/zzz.r +15 -0
  23. plotcli-original/README.md +192 -0
  24. plotcli-original/docs/ascii.png +0 -0
  25. plotcli-original/docs/bar.png +0 -0
  26. plotcli-original/docs/block.png +0 -0
  27. plotcli-original/docs/boxplot.png +0 -0
  28. plotcli-original/docs/density.png +0 -0
  29. plotcli-original/docs/facet.png +0 -0
  30. plotcli-original/docs/facet_grid.png +0 -0
  31. plotcli-original/docs/generate_png.sh +137 -0
  32. plotcli-original/docs/heatmap.png +0 -0
  33. plotcli-original/docs/histogram.png +0 -0
  34. plotcli-original/docs/line.png +0 -0
  35. plotcli-original/docs/noborder.png +0 -0
  36. plotcli-original/docs/scatter.png +0 -0
  37. plotcli-original/docs/showcase.R +182 -0
  38. plotcli-original/inst/doc/ggplotcli.R +231 -0
  39. plotcli-original/inst/doc/ggplotcli.Rmd +329 -0
  40. plotcli-original/inst/doc/ggplotcli.html +1078 -0
  41. plotcli-original/inst/doc/plotcli_class.R +98 -0
  42. plotcli-original/inst/doc/plotcli_class.Rmd +121 -0
  43. plotcli-original/inst/doc/plotcli_class.html +564 -0
  44. plotcli-original/inst/doc/plotcli_wrappers.R +35 -0
  45. plotcli-original/inst/doc/plotcli_wrappers.Rmd +62 -0
  46. plotcli-original/inst/doc/plotcli_wrappers.html +546 -0
  47. plotcli-original/man/AsciiCanvas.Rd +116 -0
  48. plotcli-original/man/BlockCanvas.Rd +132 -0
  49. plotcli-original/man/BrailleCanvas.Rd +146 -0
  50. plotcli-original/man/Canvas.Rd +492 -0
  51. plotcli-original/man/GeomRegistry.Rd +9 -0
  52. plotcli-original/man/add_legend_to_output.Rd +12 -0
  53. plotcli-original/man/braille_dot_bit.Rd +29 -0
  54. plotcli-original/man/braille_set_dot.Rd +21 -0
  55. plotcli-original/man/bresenham.Rd +27 -0
  56. plotcli-original/man/build_plot_output.Rd +28 -0
  57. plotcli-original/man/build_plot_output_v2.Rd +41 -0
  58. plotcli-original/man/cat_plot_matrix.Rd +17 -0
  59. plotcli-original/man/cbind.plotcli.Rd +19 -0
  60. plotcli-original/man/cbind_plots.Rd +17 -0
  61. plotcli-original/man/color_to_term.Rd +18 -0
  62. plotcli-original/man/create_canvas.Rd +21 -0
  63. plotcli-original/man/create_panel_scales.Rd +29 -0
  64. plotcli-original/man/create_scales.Rd +27 -0
  65. plotcli-original/man/dot-geom_registry.Rd +16 -0
  66. plotcli-original/man/draw_border.Rd +12 -0
  67. plotcli-original/man/draw_grid.Rd +12 -0
  68. plotcli-original/man/extract_legend_info.Rd +12 -0
  69. plotcli-original/man/extract_plot_labels.Rd +12 -0
  70. plotcli-original/man/extract_plot_style.Rd +12 -0
  71. plotcli-original/man/format_axis_label.Rd +18 -0
  72. plotcli-original/man/format_four_chars.Rd +21 -0
  73. plotcli-original/man/geom_area_handler.Rd +12 -0
  74. plotcli-original/man/geom_bar_handler.Rd +12 -0
  75. plotcli-original/man/geom_boxplot_handler.Rd +13 -0
  76. plotcli-original/man/geom_density_handler.Rd +12 -0
  77. plotcli-original/man/geom_histogram_handler.Rd +12 -0
  78. plotcli-original/man/geom_hline_handler.Rd +12 -0
  79. plotcli-original/man/geom_line_handler.Rd +12 -0
  80. plotcli-original/man/geom_path_handler.Rd +12 -0
  81. plotcli-original/man/geom_point_handler.Rd +12 -0
  82. plotcli-original/man/geom_rect_handler.Rd +12 -0
  83. plotcli-original/man/geom_segment_handler.Rd +12 -0
  84. plotcli-original/man/geom_smooth_handler.Rd +12 -0
  85. plotcli-original/man/geom_text_handler.Rd +12 -0
  86. plotcli-original/man/geom_vline_handler.Rd +12 -0
  87. plotcli-original/man/get_color_hue.Rd +18 -0
  88. plotcli-original/man/get_data_subset.Rd +23 -0
  89. plotcli-original/man/get_facet_info.Rd +18 -0
  90. plotcli-original/man/get_geom_handler.Rd +17 -0
  91. plotcli-original/man/get_term_colors.Rd +21 -0
  92. plotcli-original/man/ggplotcli.Rd +83 -0
  93. plotcli-original/man/init_color_mapping.Rd +15 -0
  94. plotcli-original/man/is_braille.Rd +20 -0
  95. plotcli-original/man/is_geom_registered.Rd +17 -0
  96. plotcli-original/man/list_registered_geoms.Rd +14 -0
  97. plotcli-original/man/make_colored.Rd +23 -0
  98. plotcli-original/man/make_unique_names.Rd +20 -0
  99. plotcli-original/man/normalize_data.Rd +27 -0
  100. plotcli-original/man/pclib.Rd +48 -0
  101. plotcli-original/man/pclibx.Rd +46 -0
  102. plotcli-original/man/pclid.Rd +44 -0
  103. plotcli-original/man/pclih.Rd +50 -0
  104. plotcli-original/man/pclil.Rd +48 -0
  105. plotcli-original/man/pclis.Rd +48 -0
  106. plotcli-original/man/pixel_to_braille.Rd +23 -0
  107. plotcli-original/man/plotcli.Rd +598 -0
  108. plotcli-original/man/plotcli_bar.Rd +48 -0
  109. plotcli-original/man/plotcli_box.Rd +46 -0
  110. plotcli-original/man/plotcli_density.Rd +44 -0
  111. plotcli-original/man/plotcli_histogram.Rd +50 -0
  112. plotcli-original/man/plotcli_line.Rd +48 -0
  113. plotcli-original/man/plotcli_options.Rd +18 -0
  114. plotcli-original/man/plotcli_scatter.Rd +48 -0
  115. plotcli-original/man/plus-.plotcli.Rd +19 -0
  116. plotcli-original/man/rbind.plotcli.Rd +19 -0
  117. plotcli-original/man/rbind_plots.Rd +17 -0
  118. plotcli-original/man/register_geom.Rd +21 -0
  119. plotcli-original/man/remove_color_codes.Rd +21 -0
  120. plotcli-original/man/render_faceted_plot.Rd +25 -0
  121. plotcli-original/man/render_single_panel.Rd +12 -0
  122. plotcli-original/man/safe_aes_name.Rd +18 -0
  123. plotcli-original/tests/testthat/test-new-geoms.R +136 -0
  124. plotcli-original/tests/testthat/test-plotcli.R +69 -0
  125. plotcli-original/tests/testthat.R +4 -0
  126. plotcli-original/vignettes/ggplotcli.Rmd +329 -0
  127. plotcli-original/vignettes/plotcli_class.R +98 -0
  128. plotcli-original/vignettes/plotcli_class.Rmd +121 -0
  129. plotcli-original/vignettes/plotcli_wrappers.R +35 -0
  130. plotcli-original/vignettes/plotcli_wrappers.Rmd +62 -0
  131. plotcli.egg-info/PKG-INFO +11 -0
  132. plotcli.egg-info/SOURCES.txt +7 -0
  133. plotcli.egg-info/dependency_links.txt +1 -0
  134. plotcli.egg-info/entry_points.txt +3 -0
  135. plotcli.egg-info/top_level.txt +1 -0
  136. plotcli.py +978 -0
  137. plotcli_py-0.1.0.dist-info/METADATA +358 -0
  138. plotcli_py-0.1.0.dist-info/RECORD +143 -0
  139. plotcli_py-0.1.0.dist-info/WHEEL +4 -0
  140. plotcli_py-0.1.0.dist-info/entry_points.txt +2 -0
  141. plotcli_py-0.1.0.dist-info/licenses/LICENSE +21 -0
  142. pyproject.toml +31 -0
  143. uv.lock +8 -0
@@ -0,0 +1,329 @@
1
+ ---
2
+ title: "ggplotcli: Universal ggplot2 to Terminal Plotting"
3
+ author: "Claas Heuer"
4
+ date: "`r Sys.Date()`"
5
+ output: rmarkdown::html_vignette
6
+ vignette: >
7
+ %\VignetteIndexEntry{ggplotcli: Universal ggplot2 to Terminal Plotting}
8
+ %\VignetteEngine{knitr::rmarkdown}
9
+ %\VignetteEncoding{UTF-8}
10
+ ---
11
+
12
+ ```{r setup, include = FALSE}
13
+ knitr::opts_chunk$set(
14
+ collapse = TRUE,
15
+ comment = "#>"
16
+ )
17
+ ```
18
+
19
+ ## Introduction
20
+
21
+ `ggplotcli` is a universal converter that renders any ggplot2 plot in the terminal using Unicode/ASCII characters. It automatically extracts data, aesthetics, and styling from ggplot objects, supporting 15+ geom types, faceting, color aesthetics, and legends.
22
+
23
+ ## Basic Usage
24
+
25
+ ```{r}
26
+ library(plotcli)
27
+ library(ggplot2)
28
+
29
+ # Create a ggplot
30
+ p <- ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
31
+ geom_point() +
32
+ labs(title = "MPG vs Weight by Cylinders")
33
+
34
+ # Render in terminal
35
+ ggplotcli(p, width = 60, height = 16)
36
+ ```
37
+
38
+ ## Supported Geoms
39
+
40
+ ### Scatter Plots (geom_point)
41
+
42
+ ```{r}
43
+ p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
44
+ geom_point() +
45
+ labs(title = "Iris: Sepal Dimensions by Species")
46
+ ggplotcli(p, width = 60, height = 16)
47
+ ```
48
+
49
+ ### Line Plots (geom_line)
50
+
51
+ ```{r}
52
+ # Multiple colored lines
53
+ df <- data.frame(
54
+ x = rep(1:30, 2),
55
+ y = c(sin(1:30/4) * 10, cos(1:30/4) * 10),
56
+ type = rep(c("sin", "cos"), each = 30)
57
+ )
58
+ p <- ggplot(df, aes(x, y, color = type)) +
59
+ geom_line() +
60
+ labs(title = "Sine and Cosine Waves")
61
+ ggplotcli(p, width = 60, height = 12)
62
+ ```
63
+
64
+ ### Histograms (geom_histogram)
65
+
66
+ ```{r}
67
+ p <- ggplot(mtcars, aes(x = mpg, fill = factor(cyl))) +
68
+ geom_histogram(bins = 10, position = "dodge") +
69
+ labs(title = "MPG Distribution by Cylinders")
70
+ ggplotcli(p, width = 60, height = 12)
71
+ ```
72
+
73
+ ### Density Plots (geom_density)
74
+
75
+ ```{r}
76
+ p <- ggplot(mtcars, aes(x = mpg, color = factor(cyl))) +
77
+ geom_density() +
78
+ labs(title = "MPG Density by Cylinders")
79
+ ggplotcli(p, width = 60, height = 12)
80
+ ```
81
+
82
+ ### Bar Charts (geom_col)
83
+
84
+ ```{r}
85
+ df <- data.frame(
86
+ category = c("A", "B", "C", "D", "E", "F"),
87
+ value = c(25, 45, 30, 60, 35, 50)
88
+ )
89
+ p <- ggplot(df, aes(x = category, y = value, fill = category)) +
90
+ geom_col() +
91
+ labs(title = "Category Values")
92
+ ggplotcli(p, width = 60, height = 12)
93
+ ```
94
+
95
+ ### Boxplots (geom_boxplot)
96
+
97
+ Boxplots are rendered with box-drawing characters by default, showing whiskers, box (Q1-Q3), median line, and outliers:
98
+
99
+ ```{r}
100
+ set.seed(42)
101
+ df <- data.frame(
102
+ group = factor(rep(paste0("Group ", 1:6), each = 50)),
103
+ value = c(rnorm(50, 10, 3), rnorm(50, 5, 2), rnorm(50, 8, 4),
104
+ rnorm(50, 6, 2), rnorm(50, 12, 3), rnorm(50, 7, 2))
105
+ )
106
+ p <- ggplot(df, aes(x = group, y = value, fill = group)) +
107
+ geom_boxplot() +
108
+ labs(title = "Boxplot Colored by Group", y = "Value", x = "Group")
109
+ ggplotcli(p, width = 80, height = 20, boxplot_style = "ascii")
110
+ ```
111
+
112
+ You can also use Braille rendering for boxplots:
113
+
114
+ ```{r}
115
+ ggplotcli(p, width = 80, height = 20, boxplot_style = "braille")
116
+ ```
117
+
118
+ ## Combining Multiple Geoms
119
+
120
+ ```{r}
121
+ # Histogram with density overlay
122
+ p <- ggplot(mtcars, aes(x = mpg)) +
123
+ geom_histogram(aes(y = after_stat(density)), bins = 10, fill = "gray") +
124
+ geom_density(color = "red") +
125
+ labs(title = "Histogram with Density Overlay")
126
+ ggplotcli(p, width = 60, height = 12)
127
+ ```
128
+
129
+ ```{r}
130
+ # Points with smooth line
131
+ p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
132
+ geom_point(color = "gray") +
133
+ geom_smooth(method = "loess", color = "red") +
134
+ labs(title = "Scatter with LOESS Smooth")
135
+ suppressMessages(ggplotcli(p, width = 60, height = 12))
136
+ ```
137
+
138
+ ## Faceting
139
+
140
+ ### facet_wrap with Color Aesthetics
141
+
142
+ Faceting works seamlessly with color/fill aesthetics and legends:
143
+
144
+ ```{r}
145
+ mtcars$cyl_fac <- factor(mtcars$cyl)
146
+ p <- ggplot(mtcars, aes(x = wt, y = mpg, color = cyl_fac)) +
147
+ geom_point() +
148
+ facet_wrap(~cyl_fac) +
149
+ labs(title = "MPG vs Weight: Faceted by Cylinders")
150
+ ggplotcli(p, width = 75, height = 16)
151
+ ```
152
+
153
+ ### facet_grid
154
+
155
+ ```{r}
156
+ p <- ggplot(mtcars, aes(x = wt, y = mpg, color = factor(gear))) +
157
+ geom_point() +
158
+ facet_grid(am ~ cyl) +
159
+ labs(title = "MPG: AM (rows) x Cylinders (cols)")
160
+ ggplotcli(p, width = 80, height = 20)
161
+ ```
162
+
163
+ ## Styling Options
164
+
165
+ ### Borders and Grid Lines
166
+
167
+ ```{r}
168
+ p <- ggplot(mtcars, aes(x = hp, y = qsec)) +
169
+ geom_point(color = "cyan") +
170
+ labs(title = "Quarter Mile Time vs HP")
171
+
172
+ # With border
173
+ ggplotcli(p, width = 55, height = 12, border = TRUE)
174
+
175
+ # With grid
176
+ ggplotcli(p, width = 55, height = 12, grid = "major")
177
+
178
+ # Both
179
+ ggplotcli(p, width = 55, height = 12, border = TRUE, grid = "major")
180
+ ```
181
+
182
+ ### Theme Auto-Detection
183
+
184
+ ggplotcli automatically respects ggplot2 themes:
185
+
186
+ ```{r}
187
+ p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
188
+ geom_point(color = "blue") +
189
+ labs(title = "theme_bw() - Grid + Border")
190
+
191
+ # theme_bw has both grid and border
192
+ ggplotcli(p + theme_bw(), width = 60, height = 14, border = "auto", grid = "auto")
193
+
194
+ # theme_classic has border but no grid
195
+ ggplotcli(p + theme_classic() + labs(title = "theme_classic() - Border Only"),
196
+ width = 60, height = 14, border = "auto", grid = "auto")
197
+ ```
198
+
199
+ ## Canvas Types
200
+
201
+ Three rendering modes are available:
202
+
203
+ ```{r}
204
+ wave <- ggplot(data.frame(x = 1:25, y = sin(1:25/4)*8), aes(x, y)) +
205
+ geom_line(color = "green")
206
+
207
+ # Braille (highest resolution - 2x4 dots per character)
208
+ ggplotcli(wave + labs(title = "Braille Canvas (highest resolution)"),
209
+ width = 50, height = 8, canvas_type = "braille")
210
+
211
+ # Block (medium resolution - uses block characters)
212
+ ggplotcli(wave + labs(title = "Block Canvas (medium resolution)"),
213
+ width = 50, height = 8, canvas_type = "block")
214
+
215
+ # ASCII (basic, most compatible)
216
+ ggplotcli(wave + labs(title = "ASCII Canvas (most compatible)"),
217
+ width = 50, height = 8, canvas_type = "ascii")
218
+ ```
219
+
220
+ ## Color Mapping
221
+
222
+ ggplotcli intelligently maps ggplot2 colors to terminal colors (red, yellow, green, cyan, blue, magenta). The mapping prioritizes **color distinctness** over hue accuracy to maximize visual differentiation between groups.
223
+
224
+ ### Many Groups (8+)
225
+
226
+ Even with many groups, colors are distributed to minimize repetition:
227
+
228
+ ```{r}
229
+ set.seed(123)
230
+ df <- data.frame(
231
+ group = factor(rep(paste0("G", 1:8), each = 30)),
232
+ value = unlist(lapply(1:8, function(i) rnorm(30, mean = i * 2, sd = 1.5)))
233
+ )
234
+ p <- ggplot(df, aes(x = group, y = value, fill = group)) +
235
+ geom_boxplot() +
236
+ labs(title = "8 Groups with Optimized Color Distribution")
237
+ ggplotcli(p, width = 85, height = 18, boxplot_style = "ascii")
238
+ ```
239
+
240
+ ## Showcase: Maximum Complexity
241
+
242
+ ### Complex Faceted Boxplot
243
+
244
+ ```{r}
245
+ set.seed(42)
246
+ df <- data.frame(
247
+ treatment = factor(rep(c("Control", "Drug A", "Drug B"), each = 60)),
248
+ timepoint = factor(rep(rep(c("Baseline", "Week 4", "Week 8"), each = 20), 3)),
249
+ response = c(
250
+ rnorm(20, 50, 10), rnorm(20, 52, 10), rnorm(20, 51, 10), # Control
251
+ rnorm(20, 50, 10), rnorm(20, 65, 12), rnorm(20, 70, 11), # Drug A
252
+ rnorm(20, 50, 10), rnorm(20, 58, 11), rnorm(20, 62, 10) # Drug B
253
+ )
254
+ )
255
+
256
+ p <- ggplot(df, aes(x = timepoint, y = response)) +
257
+ geom_boxplot(aes(fill = treatment)) +
258
+ labs(title = "Treatment Response Over Time",
259
+ subtitle = "Faceted by treatment group",
260
+ x = "Timepoint", y = "Response") +
261
+ theme_bw()
262
+
263
+ ggplotcli(p, width = 100, height = 22, boxplot_style = "ascii")
264
+ ```
265
+
266
+ ### Multi-Layer Scientific Plot
267
+
268
+ ```{r}
269
+ # Simulated experiment data
270
+ set.seed(123)
271
+ x <- seq(0, 10, length.out = 50)
272
+ df <- data.frame(
273
+ x = rep(x, 3),
274
+ y = c(
275
+ 2 * x + rnorm(50, 0, 1.5),
276
+ 1.5 * x + 3 + rnorm(50, 0, 1.2),
277
+ x^1.2 + rnorm(50, 0, 1)
278
+ ),
279
+ group = rep(c("Linear", "Offset", "Power"), each = 50)
280
+ )
281
+
282
+ p <- ggplot(df, aes(x = x, y = y, color = group)) +
283
+ geom_point(alpha = 0.6) +
284
+ geom_smooth(method = "loess", se = FALSE) +
285
+ labs(title = "Multi-Group Regression Analysis",
286
+ subtitle = "Points with LOESS smoothing",
287
+ x = "Predictor", y = "Response") +
288
+ theme_minimal()
289
+
290
+ suppressMessages(ggplotcli(p, width = 70, height = 18))
291
+ ```
292
+
293
+ ### Dense Scatter with Facets
294
+
295
+ ```{r}
296
+ p <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
297
+ geom_point() +
298
+ facet_wrap(~Species) +
299
+ labs(title = "Iris Dataset: Sepal vs Petal Length",
300
+ subtitle = "Faceted by species with color legend") +
301
+ theme_bw()
302
+
303
+ ggplotcli(p, width = 80, height = 16)
304
+ ```
305
+
306
+ ## Supported Features Summary
307
+
308
+ | Feature | Status |
309
+ |---------|--------|
310
+ | geom_point | ✓ |
311
+ | geom_line, geom_path | ✓ |
312
+ | geom_bar, geom_col, geom_histogram | ✓ |
313
+ | geom_density | ✓ |
314
+ | geom_smooth | ✓ |
315
+ | geom_area | ✓ |
316
+ | geom_segment, geom_hline, geom_vline | ✓ |
317
+ | geom_rect | ✓ |
318
+ | geom_text | ✓ |
319
+ | geom_boxplot | ✓ |
320
+ | Color/fill aesthetics | ✓ |
321
+ | Legends (auto-generated) | ✓ |
322
+ | facet_wrap, facet_grid | ✓ |
323
+ | Titles, subtitles, captions | ✓ |
324
+ | Theme auto-detection | ✓ |
325
+ | Optimized color mapping | ✓ |
326
+ | Multiple canvas types | ✓ |
327
+ | geom_tile (heatmaps) | Planned |
328
+ | geom_violin | Planned |
329
+