scitex 2.15.2__py3-none-any.whl → 2.15.4__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 (77) hide show
  1. scitex/_mcp_resources/__init__.py +2 -0
  2. scitex/_mcp_resources/_scholar.py +148 -0
  3. scitex/_mcp_tools/scholar.py +50 -99
  4. scitex/_mcp_tools/social.py +15 -232
  5. scitex/_mcp_tools/writer.py +7 -17
  6. scitex/canvas/mcp_server.py +16 -3
  7. scitex/capture/mcp_server.py +16 -2
  8. scitex/cli/audio.py +90 -20
  9. scitex/cli/capture.py +120 -0
  10. scitex/cli/introspect.py +19 -12
  11. scitex/cli/plt.py +78 -21
  12. scitex/cli/scholar/__init__.py +160 -2
  13. scitex/cli/scholar/_crossref_scitex.py +25 -266
  14. scitex/cli/scholar/_openalex_scitex.py +55 -0
  15. scitex/cli/social.py +63 -22
  16. scitex/cli/stats.py +121 -3
  17. scitex/cli/writer.py +49 -423
  18. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +90 -0
  19. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +1571 -0
  20. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +6262 -0
  21. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +1274 -0
  22. scitex/dev/plt/data/mpl/dir_ax.txt +459 -0
  23. scitex/introspect/_list_api.py +5 -2
  24. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  25. scitex/scholar/__init__.py +14 -9
  26. scitex/scholar/_mcp/crossref_tool_schemas.py +133 -0
  27. scitex/scholar/_mcp/openalex_handlers.py +212 -0
  28. scitex/scholar/_mcp/openalex_tool_schemas.py +96 -0
  29. scitex/scholar/_mcp/tool_schemas.py +16 -1
  30. scitex/scholar/data/.gitkeep +0 -0
  31. scitex/scholar/data/README.md +44 -0
  32. scitex/scholar/data/bib_files/bibliography.bib +1952 -0
  33. scitex/scholar/data/bib_files/neurovista.bib +277 -0
  34. scitex/scholar/data/bib_files/neurovista_enriched.bib +441 -0
  35. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +441 -0
  36. scitex/scholar/data/bib_files/neurovista_processed.bib +338 -0
  37. scitex/scholar/data/bib_files/openaccess.bib +89 -0
  38. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +2178 -0
  39. scitex/scholar/data/bib_files/pac.bib +698 -0
  40. scitex/scholar/data/bib_files/pac_enriched.bib +1061 -0
  41. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  42. scitex/scholar/data/bib_files/pac_titles.txt +75 -0
  43. scitex/scholar/data/bib_files/paywalled.bib +98 -0
  44. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +58 -0
  45. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +87 -0
  46. scitex/scholar/data/bib_files/seizure_prediction.bib +694 -0
  47. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  48. scitex/scholar/data/bib_files/test_complete_enriched.bib +437 -0
  49. scitex/scholar/data/bib_files/test_final_enriched.bib +437 -0
  50. scitex/scholar/data/bib_files/test_seizure.bib +46 -0
  51. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  52. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  53. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  54. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  55. scitex/scholar/data/impact_factor.db +0 -0
  56. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  57. scitex/scholar/local_dbs/__init__.py +31 -0
  58. scitex/scholar/local_dbs/crossref_scitex.py +30 -0
  59. scitex/scholar/local_dbs/openalex_scitex.py +30 -0
  60. scitex/scholar/mcp_server.py +59 -4
  61. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  62. scitex/stats/mcp_server.py +16 -3
  63. scitex/template/mcp_server.py +16 -3
  64. scitex/ui/mcp_server.py +16 -3
  65. scitex/writer/__init__.py +43 -34
  66. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/METADATA +22 -3
  67. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/RECORD +70 -38
  68. scitex/scholar/crossref_scitex.py +0 -367
  69. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +0 -462
  70. scitex/scholar/url_finder/.tmp/open_url/README.md +0 -223
  71. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +0 -694
  72. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +0 -1160
  73. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +0 -344
  74. scitex/scholar/url_finder/.tmp/open_url/__init__.py +0 -24
  75. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/WHEEL +0 -0
  76. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/entry_points.txt +0 -0
  77. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/licenses/LICENSE +0 -0
scitex/cli/writer.py CHANGED
@@ -1,453 +1,79 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- SciTeX Writer Commands - LaTeX Manuscript Management
3
+ SciTeX Writer CLI - Thin wrapper delegating to scitex-writer package.
4
4
 
5
- Provides manuscript project initialization and compilation.
5
+ All commands are delegated to scitex-writer CLI for maintainability.
6
6
  """
7
7
 
8
+ import subprocess
8
9
  import sys
9
- from pathlib import Path
10
10
 
11
11
  import click
12
12
 
13
+ # Check if scitex-writer package is available
14
+ try:
15
+ import scitex_writer
13
16
 
14
- @click.group(
15
- context_settings={"help_option_names": ["-h", "--help"]},
16
- invoke_without_command=True,
17
- )
18
- @click.option("--help-recursive", is_flag=True, help="Show help for all subcommands")
19
- @click.pass_context
20
- def writer(ctx, help_recursive):
21
- """
22
- Manuscript writing and LaTeX compilation
23
-
24
- \b
25
- Provides manuscript project management:
26
- - Initialize new manuscript projects
27
- - Compile manuscript, supplementary, and revision documents
28
- - Watch mode for auto-recompilation
29
- - Project structure management
30
- """
31
- if help_recursive:
32
- _print_help_recursive(ctx)
33
- ctx.exit(0)
34
- elif ctx.invoked_subcommand is None:
35
- click.echo(ctx.get_help())
36
-
37
-
38
- def _print_help_recursive(ctx):
39
- """Print help for all commands recursively."""
40
- fake_parent = click.Context(click.Group(), info_name="scitex")
41
- parent_ctx = click.Context(writer, info_name="writer", parent=fake_parent)
42
-
43
- click.secho("━━━ scitex writer ━━━", fg="cyan", bold=True)
44
- click.echo(writer.get_help(parent_ctx))
45
-
46
- for name in sorted(writer.list_commands(ctx) or []):
47
- cmd = writer.get_command(ctx, name)
48
- if cmd is None:
49
- continue
50
- click.echo()
51
- click.secho(f"━━━ scitex writer {name} ━━━", fg="cyan", bold=True)
52
- with click.Context(cmd, info_name=name, parent=parent_ctx) as sub_ctx:
53
- click.echo(cmd.get_help(sub_ctx))
54
-
55
-
56
- @writer.command()
57
- @click.argument("project_dir", type=click.Path())
58
- @click.option(
59
- "--git-strategy",
60
- "-g",
61
- type=click.Choice(["child", "parent", "origin", "none"], case_sensitive=False),
62
- default="child",
63
- help="Git initialization strategy (default: child)",
64
- )
65
- @click.option("--branch", "-b", help="Specific branch of template to clone")
66
- @click.option("--tag", "-t", help="Specific tag/release of template to clone")
67
- def clone(project_dir, git_strategy, branch, tag):
68
- """
69
- Clone a new writer project from template
70
-
71
- \b
72
- Arguments:
73
- PROJECT_DIR Path to project directory (will be created)
17
+ HAS_WRITER_PKG = True
18
+ except ImportError:
19
+ HAS_WRITER_PKG = False
74
20
 
75
- \b
76
- Git Strategies:
77
- child - Create isolated git in project directory (default)
78
- parent - Use parent git repository
79
- origin - Preserve template's original git history
80
- none - Disable git initialization
81
21
 
82
- \b
83
- Examples:
84
- scitex writer clone my_paper
85
- scitex writer clone ./papers/my_paper
86
- scitex writer clone my_paper --git-strategy parent
87
- scitex writer clone my_paper --branch develop
88
- scitex writer clone my_paper --tag v1.0.0
89
- """
90
- try:
91
- from scitex.writer._clone_writer_project import clone_writer_project
92
-
93
- # Validate mutual exclusivity of branch and tag
94
- if branch and tag:
95
- click.echo("Error: Cannot specify both --branch and --tag", err=True)
96
- sys.exit(1)
97
-
98
- # Convert git_strategy 'none' to None
99
- if git_strategy and git_strategy.lower() == "none":
100
- git_strategy = None
101
-
102
- click.echo(f"Cloning writer project: {project_dir}")
103
-
104
- # Clone writer project
105
- result = clone_writer_project(
106
- project_dir=project_dir,
107
- git_strategy=git_strategy,
108
- branch=branch,
109
- tag=tag,
22
+ def _require_writer_pkg():
23
+ """Check if scitex-writer package is available."""
24
+ if not HAS_WRITER_PKG:
25
+ click.secho(
26
+ "scitex-writer package not installed. "
27
+ "Install with: pip install scitex-writer",
28
+ fg="red",
29
+ err=True,
110
30
  )
111
-
112
- if result:
113
- project_path = Path(project_dir)
114
- click.echo()
115
- click.secho(
116
- f"✓ Successfully cloned project at {project_path.absolute()}",
117
- fg="green",
118
- )
119
- click.echo()
120
- click.echo("Project structure:")
121
- click.echo(f" {project_dir}/")
122
- click.echo(
123
- " ├── 00_shared/ # Shared resources (figures, bibliography)"
124
- )
125
- click.echo(" ├── 01_manuscript/ # Main manuscript")
126
- click.echo(" ├── 02_supplementary/ # Supplementary materials")
127
- click.echo(" ├── 03_revision/ # Revision documents")
128
- click.echo(" └── scripts/ # Compilation scripts")
129
- click.echo()
130
- click.echo("Next steps:")
131
- click.echo(f" cd {project_dir}")
132
- click.echo(" # Edit your manuscript in 01_manuscript/contents/")
133
- click.echo(" scitex writer compile manuscript")
134
- else:
135
- click.secho("✗ Failed to clone project", fg="red", err=True)
136
- sys.exit(1)
137
-
138
- except Exception as e:
139
- click.secho(f"Error: {e}", fg="red", err=True)
140
- sys.exit(1)
141
-
142
-
143
- @writer.command()
144
- @click.argument(
145
- "document",
146
- type=click.Choice(
147
- ["manuscript", "supplementary", "revision"], case_sensitive=False
148
- ),
149
- default="manuscript",
150
- )
151
- @click.option(
152
- "--dir",
153
- "-d",
154
- type=click.Path(exists=True),
155
- help="Project directory (defaults to current directory)",
156
- )
157
- @click.option(
158
- "--track-changes", is_flag=True, help="Enable change tracking (revision only)"
159
- )
160
- @click.option(
161
- "--timeout",
162
- type=int,
163
- default=300,
164
- help="Compilation timeout in seconds (default: 300)",
165
- )
166
- def compile(document, dir, track_changes, timeout):
167
- """
168
- Compile LaTeX document to PDF
169
-
170
- \b
171
- Arguments:
172
- DOCUMENT Document type to compile (manuscript|supplementary|revision)
173
-
174
- \b
175
- Examples:
176
- scitex writer compile manuscript
177
- scitex writer compile manuscript --dir ./my_paper
178
- scitex writer compile revision --track-changes
179
- scitex writer compile supplementary --timeout 600
180
- """
181
- from scitex.writer import Writer
182
-
183
- project_dir = Path(dir) if dir else Path.cwd()
184
-
185
- # Check if this is a Writer project before trying to attach
186
- required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
187
- missing = [d for d in required_dirs if not (project_dir / d).exists()]
188
-
189
- if missing:
190
- click.echo(f"Not a Writer project: {project_dir.absolute()}")
191
- click.echo(f"Missing directories: {', '.join(missing)}")
192
- click.echo()
193
- click.echo("To create a new project, run:")
194
- click.echo(" scitex writer clone <project-name>")
195
- return # Exit gracefully with code 0
196
-
197
- try:
198
- writer = Writer(project_dir)
199
-
200
- click.echo(f"Compiling {document} in {project_dir}...")
201
- click.echo()
202
-
203
- # Compile based on document type
204
- if document == "manuscript":
205
- result = writer.compile_manuscript(timeout=timeout)
206
- elif document == "supplementary":
207
- result = writer.compile_supplementary(timeout=timeout)
208
- elif document == "revision":
209
- result = writer.compile_revision(
210
- track_changes=track_changes, timeout=timeout
211
- )
212
-
213
- if result.success:
214
- click.secho("✓ Compilation successful!", fg="green")
215
- click.echo(f"PDF: {result.output_pdf}")
216
- else:
217
- click.secho(
218
- f"✗ Compilation failed (exit code {result.exit_code})",
219
- fg="red",
220
- err=True,
221
- )
222
- if result.errors:
223
- click.echo()
224
- click.echo("Errors:")
225
- for error in result.errors[:10]: # Show first 10 errors
226
- click.echo(f" - {error}")
227
- sys.exit(result.exit_code)
228
-
229
- except Exception as e:
230
- click.secho(f"Error: {e}", fg="red", err=True)
231
31
  sys.exit(1)
232
32
 
233
33
 
234
- @writer.command()
235
- @click.option(
236
- "--dir",
237
- "-d",
238
- type=click.Path(exists=True),
239
- help="Project directory (defaults to current directory)",
34
+ @click.command(
35
+ context_settings={
36
+ "help_option_names": ["-h", "--help"],
37
+ "ignore_unknown_options": True,
38
+ "allow_extra_args": True,
39
+ "allow_interspersed_args": False,
40
+ },
240
41
  )
241
- def info(dir):
242
- """
243
- Show project information
244
-
245
- \b
246
- Examples:
247
- scitex writer info
248
- scitex writer info --dir ./my_paper
249
- """
250
- from scitex.writer import Writer
251
-
252
- project_dir = Path(dir) if dir else Path.cwd()
253
-
254
- # Check if this is a Writer project before trying to attach
255
- required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
256
- missing = [d for d in required_dirs if not (project_dir / d).exists()]
257
-
258
- if missing:
259
- click.echo(f"Not a Writer project: {project_dir.absolute()}")
260
- click.echo(f"Missing directories: {', '.join(missing)}")
261
- return # Exit gracefully with code 0
262
-
263
- try:
264
- writer = Writer(project_dir)
265
-
266
- click.echo(f"Project: {writer.project_name}")
267
- click.echo(f"Location: {writer.project_dir.absolute()}")
268
- click.echo(f"Git root: {writer.git_root}")
269
- click.echo()
270
- click.echo("Documents:")
271
- click.echo(f" - Manuscript: {writer.manuscript.root}")
272
- click.echo(f" - Supplementary: {writer.supplementary.root}")
273
- click.echo(f" - Revision: {writer.revision.root}")
274
- click.echo()
275
-
276
- # Check for compiled PDFs
277
- click.echo("Compiled PDFs:")
278
- for doc_type in ["manuscript", "supplementary", "revision"]:
279
- pdf = writer.get_pdf(doc_type)
280
- if pdf:
281
- click.secho(f" ✓ {doc_type}: {pdf}", fg="green")
282
- else:
283
- click.echo(f" - {doc_type}: not compiled")
284
-
285
- except Exception as e:
286
- click.secho(f"Error: {e}", fg="red", err=True)
287
- sys.exit(1)
288
-
289
-
290
- @writer.group()
291
- def mcp():
42
+ @click.argument("args", nargs=-1, type=click.UNPROCESSED)
43
+ @click.pass_context
44
+ def writer(ctx, args):
292
45
  """
293
- MCP (Model Context Protocol) tools for writer module.
46
+ Manuscript writing and LaTeX compilation (delegates to scitex-writer)
294
47
 
295
48
  \b
296
- Examples:
297
- scitex writer mcp list-tools # List available MCP tools
298
- scitex writer mcp usage # Show tool usage and parameters
299
- """
300
- pass
301
-
302
-
303
- @mcp.command("list-tools")
304
- @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
305
- def list_tools(as_json: bool):
306
- """
307
- List available MCP tools for writer module.
49
+ Commands (from scitex-writer):
50
+ compile Compile LaTeX to PDF
51
+ bib Bibliography management
52
+ tables Table management
53
+ figures Figure management
54
+ guidelines IMRAD writing guidelines
55
+ prompts AI prompts (Asta integration)
56
+ mcp MCP server commands
308
57
 
309
58
  \b
310
59
  Examples:
311
- scitex writer mcp list-tools
312
- scitex writer mcp list-tools --json
313
- """
314
- from scitex.writer._mcp.tool_schemas import get_tool_schemas
315
-
316
- tools = get_tool_schemas()
317
-
318
- if as_json:
319
- import json
320
-
321
- output = {
322
- "module": "writer",
323
- "count": len(tools),
324
- "tools": [
325
- {
326
- "name": t.name,
327
- "description": t.description,
328
- "parameters": list(t.inputSchema.get("properties", {}).keys()),
329
- "required": t.inputSchema.get("required", []),
330
- }
331
- for t in tools
332
- ],
333
- }
334
- click.echo(json.dumps(output, indent=2))
335
- else:
336
- click.secho(
337
- f"SciTeX Writer MCP Tools ({len(tools)} total)", fg="cyan", bold=True
338
- )
339
- click.echo()
340
-
341
- for tool in tools:
342
- click.secho(f" {tool.name}", fg="green", bold=True)
343
- # First line of description
344
- desc = tool.description.split("\n")[0] if tool.description else ""
345
- click.echo(f" {desc}")
346
-
347
- # Parameters
348
- props = tool.inputSchema.get("properties", {})
349
- required = tool.inputSchema.get("required", [])
350
- if props:
351
- params = []
352
- for pname, pinfo in props.items():
353
- req_marker = "*" if pname in required else ""
354
- params.append(f"{pname}{req_marker}")
355
- click.echo(f" Parameters: {', '.join(params)}")
356
- click.echo()
357
-
358
-
359
- @mcp.command("usage")
360
- @click.argument("tool_name", required=False)
361
- def usage(tool_name: str):
362
- """
363
- Show detailed usage for writer MCP tools.
60
+ scitex writer compile manuscript ./my-paper
61
+ scitex writer bib list ./my-paper
62
+ scitex writer tables add ./my-paper data.csv
63
+ scitex writer figures list ./my-paper
64
+ scitex writer guidelines get abstract
65
+ scitex writer prompts asta ./my-paper --section introduction
364
66
 
365
67
  \b
366
- Examples:
367
- scitex writer mcp usage # Show all tools
368
- scitex writer mcp usage compile_manuscript # Show specific tool
68
+ For full help:
69
+ scitex writer --help
70
+ scitex-writer --help
369
71
  """
370
- from scitex.writer._mcp.tool_schemas import get_tool_schemas
371
-
372
- tools = get_tool_schemas()
373
-
374
- if tool_name:
375
- # Find specific tool
376
- tool = next((t for t in tools if t.name == tool_name), None)
377
- if not tool:
378
- click.secho(f"Tool '{tool_name}' not found", fg="red", err=True)
379
- click.echo(f"Available tools: {', '.join(t.name for t in tools)}")
380
- raise SystemExit(1)
381
- tools = [tool]
382
-
383
- for tool in tools:
384
- click.secho(f"━━━ {tool.name} ━━━", fg="cyan", bold=True)
385
- click.echo()
386
- click.echo(f"Description: {tool.description}")
387
- click.echo()
72
+ _require_writer_pkg()
388
73
 
389
- props = tool.inputSchema.get("properties", {})
390
- required = tool.inputSchema.get("required", [])
391
-
392
- if props:
393
- click.secho("Parameters:", bold=True)
394
- for pname, pinfo in props.items():
395
- req = " (required)" if pname in required else ""
396
- ptype = pinfo.get("type", "any")
397
- pdesc = pinfo.get("description", "")
398
- default = pinfo.get("default")
399
- default_str = f" [default: {default}]" if default is not None else ""
400
-
401
- click.echo(f" {pname}: {ptype}{req}{default_str}")
402
- if pdesc:
403
- click.echo(f" {pdesc}")
404
- click.echo()
405
-
406
-
407
- @writer.command()
408
- @click.option(
409
- "--dir",
410
- "-d",
411
- type=click.Path(exists=True),
412
- help="Project directory (defaults to current directory)",
413
- )
414
- def watch(dir):
415
- """
416
- Watch for file changes and auto-recompile
417
-
418
- \b
419
- Examples:
420
- scitex writer watch
421
- scitex writer watch --dir ./my_paper
422
- """
423
- from scitex.writer import Writer
424
-
425
- project_dir = Path(dir) if dir else Path.cwd()
426
-
427
- # Check if this is a Writer project before trying to attach
428
- required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
429
- missing = [d for d in required_dirs if not (project_dir / d).exists()]
430
-
431
- if missing:
432
- click.echo(f"Not a Writer project: {project_dir.absolute()}")
433
- click.echo(f"Missing directories: {', '.join(missing)}")
434
- return # Exit gracefully with code 0
435
-
436
- try:
437
- writer = Writer(project_dir)
438
-
439
- click.echo(f"Watching {project_dir} for changes...")
440
- click.echo("Press Ctrl+C to stop")
441
- click.echo()
442
-
443
- writer.watch()
444
-
445
- except KeyboardInterrupt:
446
- click.echo()
447
- click.echo("Stopped watching")
448
- except Exception as e:
449
- click.secho(f"Error: {e}", fg="red", err=True)
450
- sys.exit(1)
74
+ # Delegate to scitex-writer CLI
75
+ cmd = ["scitex-writer"] + list(args)
76
+ sys.exit(subprocess.call(cmd))
451
77
 
452
78
 
453
79
  # EOF
@@ -0,0 +1,90 @@
1
+ # Timestamp: "2025-12-21 12:37:14 (ywatanabe)"
2
+ # File: ./src/scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml
3
+
4
+ basic:
5
+ - plot # Line/marker plots
6
+ - scatter # Scatter plots
7
+ - bar # Vertical bar charts
8
+ - barh # Horizontal bar charts
9
+ - stem # Stem plots
10
+ - step # Step plots
11
+ - fill # Filled polygons
12
+ - fill_between # Fill between y-values
13
+ - fill_betweenx # Fill between x-values
14
+
15
+ statistical:
16
+ - hist # Histogram
17
+ - hist2d # 2D histogram
18
+ - boxplot # Box and whisker plots
19
+ - bxp # Box plot from precomputed stats
20
+ - violinplot # Violin plots
21
+ - violin # Single violin
22
+ - errorbar # Error bar plots
23
+ - pie # Pie charts
24
+ - ecdf # Empirical cumulative distribution
25
+
26
+ image:
27
+ - imshow # Display image/array
28
+ - matshow # Display matrix
29
+ - pcolor # Pseudocolor plot
30
+ - pcolormesh # Pseudocolor mesh (faster)
31
+ - pcolorfast # Pseudocolor (fastest)
32
+ - contour # Contour lines
33
+ - contourf # Filled contours
34
+ - hexbin # Hexagonal binning
35
+ - spy # Sparsity pattern
36
+
37
+ vector:
38
+ - quiver # Arrow/vector field
39
+ - streamplot # Streamlines
40
+ - barbs # Wind barbs
41
+
42
+ spectral:
43
+ - specgram # Spectrogram
44
+ - psd # Power spectral density
45
+ - csd # Cross spectral density
46
+ - cohere # Coherence
47
+ - acorr # Autocorrelation
48
+ - xcorr # Cross-correlation
49
+ - angle_spectrum # Phase angle spectrum
50
+ - magnitude_spectrum # Magnitude spectrum
51
+ - phase_spectrum # Phase spectrum
52
+
53
+ triangulation:
54
+ - tricontour # Triangular contour lines
55
+ - tricontourf # Triangular filled contours
56
+ - tripcolor # Triangular pseudocolor
57
+ - triplot # Triangular grid lines
58
+
59
+ composite:
60
+ - stackplot # Stacked area plots
61
+ - stairs # Stair/step plots
62
+ - eventplot # Event sequence plots
63
+ - broken_barh # Broken horizontal bars
64
+
65
+ log_scale:
66
+ - loglog # Log-log scale plot
67
+ - semilogx # Semi-log x scale
68
+ - semilogy # Semi-log y scale
69
+
70
+ annotation:
71
+ - annotate # Text with arrow annotation
72
+ - text # Text at position
73
+ - arrow # Arrow patch
74
+ - axhline # Horizontal line across axes
75
+ - axvline # Vertical line across axes
76
+ - hlines # Horizontal lines at y positions
77
+ - vlines # Vertical lines at x positions
78
+ - axhspan # Horizontal span (shaded region)
79
+ - axvspan # Vertical span (shaded region)
80
+ - axline # Infinite line
81
+
82
+ decoration:
83
+ - legend # Add legend
84
+ - grid # Add grid
85
+ - table # Add table
86
+ - clabel # Contour labels
87
+ - bar_label # Bar chart labels
88
+ - quiverkey # Quiver key/legend
89
+
90
+ # EOF