Full Code of vega/altair for AI

main 98de0277c912 cached
535 files
7.1 MB
1.9M tokens
4110 symbols
1 requests
Download .txt
Showing preview only (7,526K chars total). Download the full file or copy to clipboard to get everything.
Repository: vega/altair
Branch: main
Commit: 98de0277c912
Files: 535
Total size: 7.1 MB

Directory structure:
gitextract_edckvuj_/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── dependabot.yaml
│   ├── pull_request_template.md
│   ├── release.yml
│   └── workflows/
│       ├── build-free-threaded.yml
│       ├── build.yml
│       ├── check-pr.yml
│       ├── docbuild.yml
│       ├── lint.yml
│       └── weekly.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── NOTES_FOR_MAINTAINERS.md
├── README.md
├── RELEASING.md
├── altair/
│   ├── __init__.py
│   ├── _magics.py
│   ├── datasets/
│   │   ├── __init__.py
│   │   ├── _cache.py
│   │   ├── _constraints.py
│   │   ├── _data.py
│   │   ├── _exceptions.py
│   │   ├── _loader.py
│   │   ├── _metadata/
│   │   │   └── metadata.parquet
│   │   ├── _reader.py
│   │   ├── _readimpl.py
│   │   └── _typing.py
│   ├── expr/
│   │   ├── __init__.py
│   │   ├── consts.py
│   │   ├── core.py
│   │   └── funcs.py
│   ├── jupyter/
│   │   ├── __init__.py
│   │   ├── js/
│   │   │   ├── README.md
│   │   │   └── index.js
│   │   └── jupyter_chart.py
│   ├── py.typed
│   ├── theme.py
│   ├── typing/
│   │   └── __init__.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── _dfi_types.py
│   │   ├── _importers.py
│   │   ├── _show.py
│   │   ├── _transformed_data.py
│   │   ├── _vegafusion_data.py
│   │   ├── compiler.py
│   │   ├── core.py
│   │   ├── data.py
│   │   ├── deprecation.py
│   │   ├── display.py
│   │   ├── execeval.py
│   │   ├── html.py
│   │   ├── mimebundle.py
│   │   ├── plugin_registry.py
│   │   ├── save.py
│   │   ├── schemapi.py
│   │   ├── selection.py
│   │   └── server.py
│   └── vegalite/
│       ├── __init__.py
│       ├── api.py
│       ├── data.py
│       ├── display.py
│       ├── schema.py
│       └── v6/
│           ├── __init__.py
│           ├── api.py
│           ├── compiler.py
│           ├── data.py
│           ├── display.py
│           ├── schema/
│           │   ├── __init__.py
│           │   ├── _config.py
│           │   ├── _typing.py
│           │   ├── channels.py
│           │   ├── core.py
│           │   ├── mixins.py
│           │   ├── vega-lite-schema.json
│           │   └── vega-themes.json
│           └── theme.py
├── doc/
│   ├── .gitignore
│   ├── _static/
│   │   ├── altair-gallery.css
│   │   ├── altair-plot.css
│   │   ├── chart.html
│   │   ├── custom.css
│   │   └── theme_overrides.css
│   ├── _templates/
│   │   ├── class.rst
│   │   ├── navbar-project.html
│   │   └── sidebar-logo.html
│   ├── about/
│   │   ├── citing.rst
│   │   ├── code_of_conduct.rst
│   │   ├── governance.rst
│   │   ├── roadmap.rst
│   │   └── versioning.rst
│   ├── case_studies/
│   │   ├── exploring-weather.rst
│   │   ├── index.rst
│   │   └── numpy-tooltip-images.rst
│   ├── conf.py
│   ├── getting_started/
│   │   ├── getting_help.rst
│   │   ├── installation.rst
│   │   ├── overview.rst
│   │   ├── project_philosophy.rst
│   │   ├── resources.rst
│   │   └── starting.rst
│   ├── index.rst
│   ├── releases/
│   │   └── changes.rst
│   └── user_guide/
│       ├── api.rst
│       ├── compound_charts.rst
│       ├── configuration.rst
│       ├── custom_renderers.rst
│       ├── customization.rst
│       ├── data.rst
│       ├── data_transformers.rst
│       ├── display_frontends.rst
│       ├── encodings/
│       │   ├── channel_options.rst
│       │   ├── channels.rst
│       │   └── index.rst
│       ├── interactions/
│       │   ├── bindings_widgets.rst
│       │   ├── expressions.rst
│       │   ├── index.rst
│       │   ├── jupyter_chart.rst
│       │   └── parameters.rst
│       ├── internals.rst
│       ├── large_datasets.rst
│       ├── marks/
│       │   ├── arc.rst
│       │   ├── area.rst
│       │   ├── bar.rst
│       │   ├── boxplot.rst
│       │   ├── circle.rst
│       │   ├── errorband.rst
│       │   ├── errorbar.rst
│       │   ├── geoshape.rst
│       │   ├── image.rst
│       │   ├── index.rst
│       │   ├── line.rst
│       │   ├── point.rst
│       │   ├── rect.rst
│       │   ├── rule.rst
│       │   ├── square.rst
│       │   ├── text.rst
│       │   ├── tick.rst
│       │   └── trail.rst
│       ├── saving_charts.rst
│       ├── scale_resolve.rst
│       ├── times_and_dates.rst
│       └── transform/
│           ├── aggregate.rst
│           ├── bin.rst
│           ├── calculate.rst
│           ├── density.rst
│           ├── extent.rst
│           ├── filter.rst
│           ├── flatten.rst
│           ├── fold.rst
│           ├── impute.rst
│           ├── index.rst
│           ├── joinaggregate.rst
│           ├── loess.rst
│           ├── lookup.rst
│           ├── pivot.rst
│           ├── quantile.rst
│           ├── regression.rst
│           ├── sample.rst
│           ├── stack.rst
│           ├── timeunit.rst
│           └── window.rst
├── paper/
│   ├── paper.bib
│   └── paper.md
├── pyproject.toml
├── sphinxext/
│   ├── __init__.py
│   ├── altairgallery.py
│   ├── code_ref.py
│   ├── schematable.py
│   └── utils.py
├── tests/
│   ├── __init__.py
│   ├── altair_theme_test.py
│   ├── examples_arguments_syntax/
│   │   ├── __init__.py
│   │   ├── airport_connections.py
│   │   ├── annual_weather_heatmap.py
│   │   ├── anscombe_plot.py
│   │   ├── area_chart_gradient.py
│   │   ├── area_faceted.py
│   │   ├── bar_and_line_with_dual_axis.py
│   │   ├── bar_chart_faceted_compact.py
│   │   ├── bar_chart_horizontal.py
│   │   ├── bar_chart_sorted.py
│   │   ├── bar_chart_with_highlighted_bar.py
│   │   ├── bar_chart_with_highlighted_segment.py
│   │   ├── bar_chart_with_labels.py
│   │   ├── bar_chart_with_labels_measured_luminance.py
│   │   ├── bar_chart_with_mean_line.py
│   │   ├── bar_chart_with_negatives.py
│   │   ├── bar_chart_with_range.py
│   │   ├── bar_chart_with_single_threshold.py
│   │   ├── bar_faceted_stacked.py
│   │   ├── bar_rounded.py
│   │   ├── bar_with_rolling_mean.py
│   │   ├── beckers_barley_facet.py
│   │   ├── beckers_barley_wrapped_facet.py
│   │   ├── boxplot.py
│   │   ├── bubble_plot.py
│   │   ├── bump_chart.py
│   │   ├── calculate_residuals.py
│   │   ├── candlestick_chart.py
│   │   ├── choropleth.py
│   │   ├── choropleth_repeat.py
│   │   ├── co2_concentration.py
│   │   ├── comet_chart.py
│   │   ├── cumulative_count_chart.py
│   │   ├── dendrogram.py
│   │   ├── density_repeat.py
│   │   ├── density_stack.py
│   │   ├── deviation_ellipses.py
│   │   ├── distributions_and_medians_of_likert_scale_ratings.py
│   │   ├── distributions_faceted_histogram.py
│   │   ├── diverging_stacked_bar_chart.py
│   │   ├── donut_chart.py
│   │   ├── dot_dash_plot.py
│   │   ├── empirical_cumulative_distribution_function.py
│   │   ├── errorbars_with_ci.py
│   │   ├── errorbars_with_std.py
│   │   ├── falkensee.py
│   │   ├── filled_step_chart.py
│   │   ├── gantt_chart.py
│   │   ├── gapminder_bubble_plot.py
│   │   ├── groupby-map.py
│   │   ├── grouped_bar_chart.py
│   │   ├── grouped_bar_chart2.py
│   │   ├── grouped_bar_chart_horizontal.py
│   │   ├── grouped_bar_chart_overlapping_bars.py
│   │   ├── grouped_bar_chart_with_error_bars.py
│   │   ├── heat_lane.py
│   │   ├── hexbins.py
│   │   ├── histogram_gradient_color.py
│   │   ├── histogram_heatmap.py
│   │   ├── histogram_responsive.py
│   │   ├── histogram_scatterplot.py
│   │   ├── histogram_with_a_global_mean_overlay.py
│   │   ├── horizon_graph.py
│   │   ├── horizontal_stacked_bar_chart.py
│   │   ├── interactive_aggregation.py
│   │   ├── interactive_bar_select_highlight.py
│   │   ├── interactive_brush.py
│   │   ├── interactive_column_selection.py
│   │   ├── interactive_cross_highlight.py
│   │   ├── interactive_layered_crossfilter.py
│   │   ├── interactive_legend.py
│   │   ├── interactive_reorder_stacked_bars.py
│   │   ├── interactive_scatter_plot.py
│   │   ├── interval_selection.py
│   │   ├── interval_selection_map_quakes.py
│   │   ├── iowa_electricity.py
│   │   ├── isotype.py
│   │   ├── isotype_emoji.py
│   │   ├── isotype_grid.py
│   │   ├── lasagna_plot.py
│   │   ├── layer_line_color_rule.py
│   │   ├── layered_area_chart.py
│   │   ├── layered_bar_chart.py
│   │   ├── layered_chart_bar_mark.py
│   │   ├── layered_chart_with_dual_axis.py
│   │   ├── layered_heatmap_text.py
│   │   ├── layered_histogram.py
│   │   ├── line_chart_with_arrows.py
│   │   ├── line_chart_with_color_datum.py
│   │   ├── line_chart_with_cumsum.py
│   │   ├── line_chart_with_cumsum_faceted.py
│   │   ├── line_chart_with_custom_legend.py
│   │   ├── line_chart_with_datum.py
│   │   ├── line_chart_with_generator.py
│   │   ├── line_chart_with_interpolation.py
│   │   ├── line_chart_with_points.py
│   │   ├── line_chart_with_points_stroked.py
│   │   ├── line_custom_order.py
│   │   ├── line_percent.py
│   │   ├── line_with_ci.py
│   │   ├── line_with_last_value_labeled.py
│   │   ├── line_with_log_scale.py
│   │   ├── london_tube.py
│   │   ├── maps_faceted_species.py
│   │   ├── mosaic_with_labels.py
│   │   ├── multi_series_line.py
│   │   ├── multifeature_scatter_plot.py
│   │   ├── multiline_highlight.py
│   │   ├── multiline_tooltip.py
│   │   ├── multiline_tooltip_standard.py
│   │   ├── multiple_interactions.py
│   │   ├── natural_disasters.py
│   │   ├── normalized_stacked_area_chart.py
│   │   ├── normalized_stacked_bar_chart.py
│   │   ├── normed_parallel_coordinates.py
│   │   ├── one_dot_per_zipcode.py
│   │   ├── pacman_chart.py
│   │   ├── parallel_coordinates.py
│   │   ├── percentage_of_total.py
│   │   ├── pie_chart.py
│   │   ├── pie_chart_with_labels.py
│   │   ├── point_map.py
│   │   ├── polar_bar_chart.py
│   │   ├── poly_fit_regression.py
│   │   ├── pyramid.py
│   │   ├── radial_chart.py
│   │   ├── ranged_dot_plot.py
│   │   ├── ridgeline_plot.py
│   │   ├── scatter_faceted.py
│   │   ├── scatter_href.py
│   │   ├── scatter_linked_brush.py
│   │   ├── scatter_linked_table.py
│   │   ├── scatter_marginal_hist.py
│   │   ├── scatter_matrix.py
│   │   ├── scatter_point_paths_hover.py
│   │   ├── scatter_qq.py
│   │   ├── scatter_tooltips.py
│   │   ├── scatter_with_histogram.py
│   │   ├── scatter_with_labels.py
│   │   ├── scatter_with_layered_histogram.py
│   │   ├── scatter_with_loess.py
│   │   ├── scatter_with_minimap.py
│   │   ├── scatter_with_rolling_mean.py
│   │   ├── scatter_with_shaded_area.py
│   │   ├── seattle_weather_interactive.py
│   │   ├── select_detail.py
│   │   ├── select_mark_area.py
│   │   ├── selection_histogram.py
│   │   ├── selection_layer_bar_month.py
│   │   ├── selection_zorder.py
│   │   ├── simple_bar_chart.py
│   │   ├── simple_heatmap.py
│   │   ├── simple_histogram.py
│   │   ├── simple_line_chart.py
│   │   ├── simple_scatter_with_errorbars.py
│   │   ├── simple_stacked_area_chart.py
│   │   ├── slider_cutoff.py
│   │   ├── slope_graph.py
│   │   ├── sorted_error_bars_with_ci.py
│   │   ├── stacked_bar_chart.py
│   │   ├── stacked_bar_chart_sorted_segments.py
│   │   ├── stacked_bar_chart_with_text.py
│   │   ├── stem_and_leaf.py
│   │   ├── step_chart.py
│   │   ├── streamgraph.py
│   │   ├── strip_plot.py
│   │   ├── strip_plot_jitter.py
│   │   ├── table_bubble_plot_github.py
│   │   ├── top_k_items.py
│   │   ├── top_k_letters.py
│   │   ├── top_k_with_others.py
│   │   ├── trail_marker.py
│   │   ├── us_employment.py
│   │   ├── us_incomebrackets_by_state_facet.py
│   │   ├── us_population_over_time.py
│   │   ├── us_population_over_time_facet.py
│   │   ├── us_population_pyramid_over_time.py
│   │   ├── us_state_capitals.py
│   │   ├── violin_plot.py
│   │   ├── waterfall_chart.py
│   │   ├── wheat_wages.py
│   │   ├── wilkinson-dot-plot.py
│   │   ├── wind_vector_map.py
│   │   ├── window_rank.py
│   │   ├── world_map.py
│   │   └── world_projections.py
│   ├── examples_methods_syntax/
│   │   ├── __init__.py
│   │   ├── airport_connections.py
│   │   ├── annual_weather_heatmap.py
│   │   ├── anscombe_plot.py
│   │   ├── area_faceted.py
│   │   ├── bar_chart_faceted_compact.py
│   │   ├── bar_chart_sorted.py
│   │   ├── bar_chart_with_labels_measured_luminance.py
│   │   ├── bar_chart_with_range.py
│   │   ├── bar_chart_with_single_threshold.py
│   │   ├── beckers_barley_facet.py
│   │   ├── beckers_barley_wrapped_facet.py
│   │   ├── bump_chart.py
│   │   ├── calculate_residuals.py
│   │   ├── candlestick_chart.py
│   │   ├── co2_concentration.py
│   │   ├── comet_chart.py
│   │   ├── cumulative_count_chart.py
│   │   ├── density_repeat.py
│   │   ├── density_stack.py
│   │   ├── deviation_ellipses.py
│   │   ├── distributions_and_medians_of_likert_scale_ratings.py
│   │   ├── distributions_faceted_histogram.py
│   │   ├── diverging_stacked_bar_chart.py
│   │   ├── donut_chart.py
│   │   ├── errorbars_with_ci.py
│   │   ├── errorbars_with_std.py
│   │   ├── falkensee.py
│   │   ├── gapminder_bubble_plot.py
│   │   ├── groupby-map.py
│   │   ├── grouped_bar_chart2.py
│   │   ├── grouped_bar_chart_overlapping_bars.py
│   │   ├── grouped_bar_chart_with_error_bars.py
│   │   ├── heat_lane.py
│   │   ├── hexbins.py
│   │   ├── histogram_gradient_color.py
│   │   ├── histogram_heatmap.py
│   │   ├── histogram_responsive.py
│   │   ├── histogram_scatterplot.py
│   │   ├── histogram_with_a_global_mean_overlay.py
│   │   ├── horizon_graph.py
│   │   ├── interactive_aggregation.py
│   │   ├── interactive_bar_select_highlight.py
│   │   ├── interactive_column_selection.py
│   │   ├── interactive_cross_highlight.py
│   │   ├── interactive_layered_crossfilter.py
│   │   ├── interactive_legend.py
│   │   ├── interval_selection.py
│   │   ├── interval_selection_map_quakes.py
│   │   ├── iowa_electricity.py
│   │   ├── isotype.py
│   │   ├── isotype_emoji.py
│   │   ├── isotype_grid.py
│   │   ├── lasagna_plot.py
│   │   ├── layered_area_chart.py
│   │   ├── layered_bar_chart.py
│   │   ├── layered_chart_with_dual_axis.py
│   │   ├── layered_heatmap_text.py
│   │   ├── layered_histogram.py
│   │   ├── line_chart_with_color_datum.py
│   │   ├── line_chart_with_cumsum.py
│   │   ├── line_chart_with_cumsum_faceted.py
│   │   ├── line_chart_with_custom_legend.py
│   │   ├── line_custom_order.py
│   │   ├── line_percent.py
│   │   ├── line_with_ci.py
│   │   ├── line_with_last_value_labeled.py
│   │   ├── line_with_log_scale.py
│   │   ├── london_tube.py
│   │   ├── maps_faceted_species.py
│   │   ├── mosaic_with_labels.py
│   │   ├── multifeature_scatter_plot.py
│   │   ├── multiline_highlight.py
│   │   ├── multiline_tooltip.py
│   │   ├── multiline_tooltip_standard.py
│   │   ├── multiple_interactions.py
│   │   ├── natural_disasters.py
│   │   ├── normalized_stacked_area_chart.py
│   │   ├── normalized_stacked_bar_chart.py
│   │   ├── pacman_chart.py
│   │   ├── parallel_coordinates.py
│   │   ├── percentage_of_total.py
│   │   ├── pie_chart.py
│   │   ├── pie_chart_with_labels.py
│   │   ├── polar_bar_chart.py
│   │   ├── poly_fit_regression.py
│   │   ├── pyramid.py
│   │   ├── radial_chart.py
│   │   ├── ranged_dot_plot.py
│   │   ├── ridgeline_plot.py
│   │   ├── scatter_linked_table.py
│   │   ├── scatter_marginal_hist.py
│   │   ├── scatter_point_paths_hover.py
│   │   ├── scatter_with_layered_histogram.py
│   │   ├── scatter_with_minimap.py
│   │   ├── scatter_with_rolling_mean.py
│   │   ├── seattle_weather_interactive.py
│   │   ├── select_detail.py
│   │   ├── simple_scatter_with_errorbars.py
│   │   ├── sorted_error_bars_with_ci.py
│   │   ├── stacked_bar_chart_sorted_segments.py
│   │   ├── stacked_bar_chart_with_text.py
│   │   ├── stem_and_leaf.py
│   │   ├── streamgraph.py
│   │   ├── strip_plot_jitter.py
│   │   ├── top_k_items.py
│   │   ├── top_k_letters.py
│   │   ├── top_k_with_others.py
│   │   ├── us_employment.py
│   │   ├── us_population_over_time.py
│   │   ├── us_population_over_time_facet.py
│   │   ├── us_population_pyramid_over_time.py
│   │   ├── us_state_capitals.py
│   │   ├── violin_plot.py
│   │   ├── wheat_wages.py
│   │   ├── wilkinson-dot-plot.py
│   │   ├── wind_vector_map.py
│   │   └── window_rank.py
│   ├── expr/
│   │   ├── __init__.py
│   │   └── test_expr.py
│   ├── test_datasets.py
│   ├── test_examples.py
│   ├── test_jupyter_chart.py
│   ├── test_magics.py
│   ├── test_toplevel.py
│   ├── test_transformed_data.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── test_compiler.py
│   │   ├── test_core.py
│   │   ├── test_data.py
│   │   ├── test_deprecation.py
│   │   ├── test_execeval.py
│   │   ├── test_html.py
│   │   ├── test_mimebundle.py
│   │   ├── test_plugin_registry.py
│   │   ├── test_schemapi.py
│   │   ├── test_server.py
│   │   ├── test_to_values_narwhals.py
│   │   └── test_utils.py
│   └── vegalite/
│       ├── __init__.py
│       ├── test_common.py
│       └── v6/
│           ├── __init__.py
│           ├── schema/
│           │   ├── __init__.py
│           │   └── test_channels.py
│           ├── test_alias.py
│           ├── test_api.py
│           ├── test_data.py
│           ├── test_display.py
│           ├── test_geo_interface.py
│           ├── test_layer_props.py
│           ├── test_params.py
│           ├── test_renderers.py
│           └── test_theme.py
└── tools/
    ├── __init__.py
    ├── cleanup_nightlies.py
    ├── codemod.py
    ├── datasets/
    │   ├── __init__.py
    │   ├── datapackage.py
    │   ├── models.py
    │   └── npm.py
    ├── fs.py
    ├── generate_api_docs.py
    ├── generate_nightly_version.py
    ├── generate_schema_wrapper.py
    ├── markup.py
    ├── schemapi/
    │   ├── __init__.py
    │   ├── codegen.py
    │   ├── schemapi.py
    │   └── utils.py
    ├── sync_website.py
    ├── update_init_file.py
    ├── vega_expr.py
    └── versioning.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* text=auto eol=lf


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug report
description: Report something that is broken
labels: ["bug", "needs-triage"]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!
        
        Note that since Altair is a Python wrapper around the Vega-Lite visualization grammar, [most bugs should be reported directly to Vega-Lite](https://github.com/vega/vega-lite/issues). You can click the Action Button (`...`) of your Altair chart and "Open in Vega Editor" to see if you get the same error in the Vega Editor.
        
        If you can't reproduce the bug in the Vega Editor, then make sure you are using [the latest version of Altair](https://github.com/vega/altair/releases) and search for duplicate issues before filling out the form below.
  - type: textarea
    id: what-happened
    attributes:
      label: What happened?
      description: |
        Describe what happened and how to reproduce the bug.
        Include the full code and data to reproduce it. Use a simple toy data set, e.g. from `altair.datasets`.
    validations:
      required: true
  - type: textarea
    id: desired-behavior
    attributes:
      label: What would you like to happen instead?
      description: Describe the expected/desired behavior.
  - type: input
    id: altair-version
    attributes:
      label: Which version of Altair are you using?
      description: Use `alt.__version__` to find out


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Question
    url: https://stackoverflow.com/tags/altair
    about: Please ask questions such as "How do I do X?" or "Why does this not work?" on Stack Overflow using the `altair` tag.
  - name: Discussion
    url: https://github.com/vega/altair/discussions
    about: If you want to discuss a topic or ask a question that is not a good fit for Stack Overflow, please open a new disscussion here on GitHub.


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.yml
================================================
name: Feature request
description: Suggest an improvement
labels: ["enhancement"]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to suggest a new feature!
        
        Note that since Altair is a Python wrapper around the Vega-Lite visualization grammar, [most feature requests should be reported directly to Vega-Lite](https://github.com/vega/vega-lite/issues). You can click the Action Button (`...`) of your Altair chart and "Open in Vega Editor" to see the Vega-Lite chart specification.
        
        If you believe this feature is more relevant for Altair than Vega-Lite, then make sure to search for duplicate issues before filling out the form below.
  - type: textarea
    id: what-happened
    attributes:
      label: What is your suggestion?
      description: Describe the feature's goal, motivating use cases, and its expected behavior.
    validations:
      required: true
  - type: textarea
    id: alternative-solutions
    attributes:
      label: Have you considered any alternative solutions?


================================================
FILE: .github/dependabot.yaml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"
    groups:
      github-actions:
        patterns:
          - "*"
    commit-message:
      prefix: "ci"


================================================
FILE: .github/pull_request_template.md
================================================
<!-- Click "Preview" to read this message; then delete it. -->

## Thanks for contributing to Altair! 🎉

Please follow these guidelines:

### 1. **PR Description**
   - Briefly describe the changes and their purpose. For help, check this [guide](https://medium.com/@greenberg/writing-pull-requests-your-coworkers-might-enjoy-reading-9d0307e93da3).

### 2. **Tests & Docs**
   - Include unit tests and update documentation for new features.

### 3. **Commit Message**
   - Use [semantic commit messages](https://www.conventionalcommits.org/), e.g., `"feat: Add embed_options to charts"`.
   - Add `!` for breaking changes (e.g., `"fix!: Raise error when embed_options is None"`).

### 4. **PR Title Types**
   - **feat**: New feature
   - **fix**: Bug fix
   - **docs**: Documentation changes
   - **style**: Code style changes (no functionality change)
   - **refactor**: Code restructuring
   - **perf**: Performance improvements
   - **test**: Add or fix tests
   - **build**: Changes to build system or dependencies
   - **ci**: CI configuration changes
   - **chore**: Miscellaneous tasks
   - **revert**: Reverts a commit


================================================
FILE: .github/release.yml
================================================
changelog:
  categories:
    - title: Breaking
      labels:
        - breaking
    - title: Deprecation
      labels:
        - deprecation
    - title: Enhancements
      labels:
        - enhancement
    - title: Bug Fixes
      labels:
        - bug
    - title: Maintainance
      labels:
        - maintainance
    - title: Documentation
      labels:
        - documentation
    - title: Other Changes
      labels:
        - "*"


================================================
FILE: .github/workflows/build-free-threaded.yml
================================================
name: build-free-threaded

on:
  workflow_dispatch:  # Manual trigger only; no automatic CI runs

env:
  UV_SYSTEM_PYTHON: 1

jobs:
  free-threaded:
    runs-on: ubuntu-latest
    name: py 3.14t free-threaded
    steps:
      - uses: actions/checkout@v6
      - name: Set up Python 3.14t
        uses: actions/setup-python@v6
        with:
          python-version: "3.14t"
      - name: Install uv
        uses: astral-sh/setup-uv@v7
      - name: Install targeted dependencies
        run: |
          set -xe
          uv pip install -e .
          # From [project.optional-dependencies].dev in pyproject.toml
          uv pip install pytest
          uv pip install pytest-cov
          uv pip install pytest-run-parallel
          # uv pip install hatch>=1.13.0
          # uv pip install ruff>=0.9.5
          # uv pip install 'duckdb>=1.0; python_version<"3.14"'
          # uv pip install ipython
          # uv pip install ipykernel
          # uv pip install pandas>=1.1.3
          # uv pip install pyarrow-stubs
          # uv pip install 'pytest-xdist[psutil]~=3.5'
          # uv pip install mistune
          # uv pip install mypy
          # uv pip install pandas-stubs
          # uv pip install types-jsonschema
          # uv pip install types-setuptools
          # uv pip install geopandas>=0.14.3
          # uv pip install polars>=0.20.3
          # uv pip install taskipy>=1.14.1
          # uv pip install tomli>=2.2.1
      - name: Run pytest with pytest-run-parallel
        run: |
          uv run pytest -o addopts= --pyargs --doctest-modules --doctest-ignore-import-errors --iterations=8 --parallel-threads=auto tests



================================================
FILE: .github/workflows/build.yml
================================================
name: build

on: [push, pull_request]

env:
  UV_SYSTEM_PYTHON: 1

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
        required-dependencies: ["minimum", "latest"]

    name: py ${{ matrix.python-version }} with ${{ matrix.required-dependencies }} required deps
    steps:
      - uses: actions/checkout@v6
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install uv
        uses: astral-sh/setup-uv@v7

      # Install dependencies from pyproject.toml (latest versions for all matrix jobs)
      - name: Install dependencies
        run: uv pip install -e ".[dev, all]"

      # Install minimum required versions for compatibility testing (only for 'minimum' matrix value)
      - name: Pin minimum dependency versions
        if: ${{ matrix.required-dependencies == 'minimum' }}
        run: |
          # Keep in sync with versions in `pyproject.toml`
          uv pip install jsonschema==3.0 narwhals==1.27.1 typing_extensions==4.12.0 setuptools==81.0.0
      - name: Maybe uninstall optional dependencies
        # We uninstall pyarrow and vegafusion for one job to test that we have not
        # accidentally introduced a hard dependency on these libraries.
        # Uninstalling for Python 3.10 is an arbitrary choice.
        # Also see https://github.com/vega/altair/pull/3114
        if: ${{ matrix.python-version == '3.10' }}
        run: |
          uv pip uninstall pyarrow vegafusion vl-convert-python anywidget
      - name: Maybe install lowest supported pandas version
        # We install the lowest supported pandas version for one job to test that
        # it still works. Downgrade to the oldest versions of pandas and numpy that include
        # Python 3.10 wheels, so only run this job for Python 3.10
        if: ${{ matrix.python-version == '3.10' }}
        run: |
          uv pip install pandas==1.3.4 numpy==1.21.2
      - name: Test that schema generation has no effect
        run: |
          uv pip install vl-convert-python
          python tools/generate_schema_wrapper.py
          # This gets the paths of all files which were either deleted, modified
          # or are not yet tracked by Git
          files=$(git ls-files --deleted --modified --others --exclude-standard)
          # Exclude dataset metadata that is regenerated by the script; parquet output
          # can differ across platforms/Polars versions (binary non-determinism).
          exclude_pattern='altair/datasets/_metadata/metadata\.parquet'
          files_filtered=$(echo "$files" | grep -v -E "^${exclude_pattern}$" || true)
          # Depending on the shell it can happen that 'files' contains empty
          # lines which are filtered out in the for loop below
          files_cleaned=()
          while IFS= read -r i; do
            # Skip empty items
            [ -z "$i" ] && continue
            files_cleaned+=("$i")
          done <<< "$files_filtered"
          if [ ${#files_cleaned[@]} -gt 0 ]; then
              echo "The code generation modified the following files:"
              printf '%s\n' "${files_cleaned[@]}"
              git diff
              exit 1
          fi
      - name: Test with pytest
        run: |
          uv run pytest --pyargs --numprocesses=logical --doctest-modules --doctest-ignore-import-errors tests
      - name: Validate Vega-Lite schema
        run: |
          # We install all 'format' dependencies of jsonschema as check-jsonschema
          # only does the 'format' checks which are installed.
          # We can always use the latest jsonschema version here.
          # uri-reference check is disabled as the URIs in the Vega-Lite schema do
          # not conform RFC 3986.
          uv pip install 'jsonschema[format]' check-jsonschema --upgrade
          uv run check-jsonschema --check-metaschema altair/vegalite/v6/schema/vega-lite-schema.json --disable-formats uri-reference
      - name: Show installed versions
        run: uv pip list


================================================
FILE: .github/workflows/check-pr.yml
================================================
name: "Lint PR"

on:
  pull_request_target:
    types:
      - opened
      - edited
      - synchronize

permissions:
  pull-requests: read

jobs:
  main:
    name: Validate PR title
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/docbuild.yml
================================================
name: docbuild

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - name: Set up Python 3.12
      uses: actions/setup-python@v6
      with:
        python-version: "3.12"
    - name: Install uv
      uses: astral-sh/setup-uv@v7
      with:
        enable-cache: true
        cache-dependency-glob: |
          **/uv.lock
          **/pyproject.toml
    - name: Install dependencies
      run: uv sync --all-extras
    - name: Build docs
      run: |
        mkdir -p doc/_images
        uv run sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html
    - name: Run doctests
      run: |
        uv run sphinx-build -b doctest -d doc/_build/doctrees doc doc/_build/doctest

        


================================================
FILE: .github/workflows/lint.yml
================================================
name: lint

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    name: ruff-mypy
    steps:
    - name: "Set up Python"
      uses: actions/setup-python@v6
      with:
        python-version: "3.12"
    - uses: actions/checkout@v6
    - name: Install uv
      uses: astral-sh/setup-uv@v7
      with:
        enable-cache: true
        cache-dependency-glob: |
          **/uv.lock
          **/pyproject.toml
    # Installing all dependencies and not just the linters as mypy needs them for type checking
    - name: Install dependencies
      run: uv sync --all-extras
    - name: ruff check (lint)
      run: |        
        uv run ruff check
    - name: ruff format
      run: |
        uv run ruff format --check --diff
    - name: mypy (type check)
      run: |
        uv run mypy altair tests


================================================
FILE: .github/workflows/weekly.yml
================================================
---
name: Weekly Build and Publish
'on':
  schedule:
    - cron: '0 3 * * 1'  # Weekly on Mondays at 3am UTC
  workflow_dispatch:
    inputs:
      force_build:
        description: 'Force build even if no changes detected'
        type: boolean
        default: false
        required: false
env:
  UV_SYSTEM_PYTHON: 1
jobs:
  check-changes:
    runs-on: ubuntu-latest
    outputs:
      has-changes: '${{ steps.check.outputs.has-changes }}'
      last-weekly-tag: '${{ steps.check.outputs.last-weekly-tag }}'
      current-commit: '${{ steps.check.outputs.current-commit }}'
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Check for changes since last weekly build
        id: check
        run: |
          # Get the latest weekly release tag
          LATEST_WEEKLY_TAG=$(git tag --list "weekly-*" --sort=-version:refname | head -n 1)

          if [ -z "$LATEST_WEEKLY_TAG" ]; then
            echo "No weekly tags found, will build (first time)"
            echo "has-changes=true" >> $GITHUB_OUTPUT
            echo "last-weekly-tag=" >> $GITHUB_OUTPUT
            echo "current-commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
            exit 0
          fi

          # Get the commit hash from the latest weekly tag
          LATEST_WEEKLY_COMMIT=$(git rev-list -n 1 "$LATEST_WEEKLY_TAG")
          CURRENT_COMMIT=$(git rev-parse HEAD)

          echo "last-weekly-tag=${LATEST_WEEKLY_TAG}" >> $GITHUB_OUTPUT
          echo "current-commit=${CURRENT_COMMIT}" >> $GITHUB_OUTPUT

          # Check if there are any commits since the last weekly build
          if [ "$LATEST_WEEKLY_COMMIT" = "$CURRENT_COMMIT" ]; then
            echo "No changes since last weekly build"
            echo "has-changes=false" >> $GITHUB_OUTPUT
          else
            echo "Changes detected since last weekly build"
            echo "has-changes=true" >> $GITHUB_OUTPUT
          fi
  weekly-build:
    needs: check-changes
    if: needs.check-changes.outputs.has-changes == 'true' || github.event.inputs.force_build == 'true'
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version:
          - '3.10'
          - '3.11'
          - '3.12'
          - '3.13'
    name: 'Test py ${{ matrix.python-version }}'
    steps:
      - uses: actions/checkout@v6
      - name: 'Set up Python ${{ matrix.python-version }}'
        uses: actions/setup-python@v6
        with:
          python-version: '${{ matrix.python-version }}'
      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          enable-cache: true
          cache-dependency-glob: |
            **/uv.lock
            **/pyproject.toml
      - name: Install dependencies
        run: |
          uv sync --all-extras
      - name: Test with pytest
        run: |
          uv run task test
  weekly-publish:
    needs:
      - check-changes
      - weekly-build
    if: needs.check-changes.outputs.has-changes == 'true' || github.event.inputs.force_build == 'true'
    runs-on: ubuntu-latest
    environment:
      name: pypi
      url: https://pypi.org/p/altair
    permissions:
      contents: write
      id-token: write
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.12'
      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          enable-cache: true
          cache-dependency-glob: |
            **/uv.lock
            **/pyproject.toml
      - name: Install dependencies
        run: |
          uv sync --all-extras
      - name: Generate weekly version and tag
        id: version
        run: |
          # Generate weekly version based on current date and commit
          # Get base version from altair/__init__.py
          BASE_VERSION=$(grep '__version__ = ' altair/__init__.py | sed 's/__version__ = "\(.*\)"/\1/')
          DATE=$(date +%Y%m%d)
          COMMIT=$(git rev-parse --short HEAD)
          COMMIT_SHA=$(git rev-parse HEAD)
          # PEP 440 compliant dev version - handle cases where base version already has 'dev'
          if [[ "$BASE_VERSION" == *"dev" ]]; then
            # If base version already has 'dev', replace it with proper dev format
            VERSION=$(echo "$BASE_VERSION" | sed 's/dev$/.dev'${DATE}'/')
          else
            # If base version doesn't have 'dev', add it
            VERSION="${BASE_VERSION}.dev${DATE}"
          fi
          TAG_NAME="weekly-${DATE}-${COMMIT}"
          echo "Generated weekly version: ${VERSION}"
          echo "Generated tag name: ${TAG_NAME}"
          echo "version=${VERSION}" >> $GITHUB_OUTPUT
          echo "tag_name=${TAG_NAME}" >> $GITHUB_OUTPUT
          echo "commit_sha=${COMMIT_SHA}" >> $GITHUB_OUTPUT
      - name: Update version files
        run: |
          # Update version in __init__.py
          sed -i "s/__version__ = .*/__version__ = \"${{ steps.version.outputs.version }}\"/" altair/__init__.py
          # Update version in conf.py
          sed -i "s/release = .*/release = \"${{ steps.version.outputs.version }}\"/" doc/conf.py
      - name: Build package
        run: |
          uv run task build
      - name: Generate dependency snapshot
        id: deps
        run: |
          # Get current dependencies
          uv pip freeze > current_deps.txt

          # Check if we can compare with previous weekly release
          LATEST_WEEKLY_TAG="${{ needs.check-changes.outputs.last-weekly-tag }}"
          if [ -n "$LATEST_WEEKLY_TAG" ]; then
            echo "Comparing dependencies with previous tag: ${LATEST_WEEKLY_TAG}"
            # Try to get previous uv.lock from git history
            if git show ${LATEST_WEEKLY_TAG}:uv.lock > previous_uv.lock 2>/dev/null; then
              if diff -u previous_uv.lock uv.lock > dependency_changes.txt 2>&1; then
                echo "No dependency changes detected"
                echo "dependency_changes=false" >> $GITHUB_OUTPUT
                # Ensure the artifact has content even when there are no changes
                if [ ! -s dependency_changes.txt ]; then
                  echo "No dependency changes detected" > dependency_changes.txt
                fi
              else
                echo "Dependency changes detected"
                echo "dependency_changes=true" >> $GITHUB_OUTPUT
              fi
            else
              echo "No previous uv.lock found at ${LATEST_WEEKLY_TAG}" > dependency_changes.txt
              echo "dependency_changes=false" >> $GITHUB_OUTPUT
            fi
          else
            echo "First weekly build - no previous dependencies to compare" > dependency_changes.txt
            echo "dependency_changes=false" >> $GITHUB_OUTPUT
          fi
      - name: Generate binary file checksums
        id: checksums
        run: |
          # Find all binary files in the project (with proper parentheses for OR operations)
          find . \( -name "*.csv.gz" -o -name "*.parquet" -o -name "*.json.gz" \) -type f | while read file; do
            sha256sum "$file" >> binary_checksums.txt
            echo "Processed: $file"
          done

          # Ensure file exists even if no binary files found
          touch binary_checksums.txt

          # Note: We cannot compare with previous checksums since binary_checksums.txt
          # is generated during the workflow and not committed to git.
          # Instead, we just upload the current checksums for reference.
          echo "Generated checksums for $(wc -l < binary_checksums.txt) binary files" > binary_changes.txt
          echo "binary_changes=false" >> $GITHUB_OUTPUT
      - name: Prepare release assets
        run: |
          # Ensure all text files exist to avoid upload errors
          touch dependency_changes.txt current_deps.txt binary_checksums.txt binary_changes.txt

          # List files that will be uploaded
          echo "Release assets:"
          ls -lh dist/
          ls -lh *.txt 2>/dev/null || echo "No text files"
      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          verbose: true
          skip-existing: true
      - name: Create GitHub release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ steps.version.outputs.tag_name }}
          name: Weekly Build ${{ steps.version.outputs.version }}
          body: |
            ## Weekly Pre-Release Build of Altair

            This is a pre-release version for testing purposes.

            ### Build Information

            **Version:** ${{ steps.version.outputs.version }}
            **Tag:** ${{ steps.version.outputs.tag_name }}
            **Previous Weekly Tag:** ${{ needs.check-changes.outputs.last-weekly-tag || 'None (first build)' }}

            ## Installation

            ### From PyPI (recommended)

            Install the latest weekly build directly from PyPI:

            ```bash
            pip install altair==${{ steps.version.outputs.version }}
            # or
            uv pip install altair==${{ steps.version.outputs.version }}
            ```

            _Note_: Weekly builds publish timestamped development versions (for example `${{ steps.version.outputs.version }}`) to PyPI. When you pin that exact version, `pip` installs the dev build automatically, without the need for a `--pre` flag.

            ### From GitHub Repository (direct install)

            Install directly from the tagged commit without downloading the wheel:

            **Command line (pip or uv):**
            ```bash
            pip install git+https://github.com/${{ github.repository }}.git@${{ steps.version.outputs.tag_name }}
            # or
            uv pip install git+https://github.com/${{ github.repository }}.git@${{ steps.version.outputs.tag_name }}
            ```

            _Note_: Installing directly from the `weekly-...` tag will surface the base development version (without the timestamp suffix) because the version file edits are not committed.

            **Add to pyproject.toml (pip/uv):**
            ```toml
            [project]
            dependencies = [
                "altair @ git+https://github.com/${{ github.repository }}.git@${{ steps.version.outputs.tag_name }}",
            ]
            ```

            **Add to pixi.toml (pixi):**
            ```toml
            [pypi-dependencies]
            altair = { git = "https://github.com/${{ github.repository }}.git", rev = "${{ steps.version.outputs.tag_name }}" }
            ```

            ### From GitHub Release (manual download)

            Download the wheel file from the assets below and install:

            ```bash
            pip install altair-${{ steps.version.outputs.version }}-py3-none-any.whl
            ```

            ## Testing & Feedback

            **Please note:** This is a testing version. If you encounter any issues or unexpected behavior, we would greatly appreciate if you [open an issue](https://github.com/${{ github.repository }}/issues) to report it. Your feedback helps improve Altair!
          draft: false
          prerelease: true
          files: |
            dist/*.whl
            dist/*.tar.gz
            dependency_changes.txt
            current_deps.txt
            binary_checksums.txt
            binary_changes.txt
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Cleanup old weekly releases
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Wait a moment to ensure the new release is fully created
          sleep 5

          # Get all weekly releases sorted by creation date (newest first)
          echo "Fetching all weekly releases..."
          WEEKLY_RELEASES=$(gh release list --limit 100 --json tagName,isPrerelease,createdAt --jq '.[] | select(.tagName | startswith("weekly-")) | .tagName' | head -n 100)

          # Count total weekly releases (handle empty list)
          if [ -z "$WEEKLY_RELEASES" ]; then
            echo "No weekly releases found"
            exit 0
          fi

          TOTAL_WEEKLY=$(echo "$WEEKLY_RELEASES" | wc -l | tr -d ' ')
          echo "Found ${TOTAL_WEEKLY} weekly releases"

          # Keep only the 7 most recent, delete the rest
          if [ "$TOTAL_WEEKLY" -gt 7 ]; then
            echo "Keeping 7 most recent weekly releases, deleting $(($TOTAL_WEEKLY - 7)) old ones..."
            echo "$WEEKLY_RELEASES" | tail -n +8 | while read -r tag; do
              if [ -n "$tag" ]; then
                echo "Deleting release and tag: $tag"
                gh release delete "$tag" --yes --cleanup-tag 2>&1 || echo "Warning: Failed to delete $tag, continuing..."
              fi
            done
            echo "Cleanup complete!"
          else
            echo "Only ${TOTAL_WEEKLY} weekly releases found, no cleanup needed (keeping max 7)"
          fi


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# C extensions
*.so

# Distribution / packaging
.Python
env/
venv
.venv
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover

# Translations
*.mo
*.pot

# Django stuff:
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# emacs backups
*~
\#*\#

.ipynb_checkpoints
.idea/*
tools/_build
Untitled*.ipynb
.mypy*
.pytest_cache
*.DS_Store

# VSCode
.vscode

# hatch, doc generation
data.json

# type stubs
typings/

# Zed editor
.zed


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

As a project of the Vega Organization, we use the [Vega Code of Conduct](https://github.com/vega/.github/blob/main/CODE_OF_CONDUCT.md).


================================================
FILE: CONTRIBUTING.md
================================================
# Feedback and Contribution

We welcome any input, feedback, bug reports, and contributions via [Altair's
GitHub Repository](http://github.com/vega/altair/). In particular, we
welcome companion efforts from other visualization libraries to render the
Vega-Lite specifications output by Altair. We see this portion of the effort
as much bigger than Altair itself: the Vega and Vega-Lite specifications are
perhaps the best existing candidates for a principled *lingua franca* of data
visualization.

We are also seeking contributions of additional Jupyter notebook-based examples
in our separate GitHub repository: https://github.com/altair-viz/altair_notebooks.

All contributions, suggestions, and feedback you submitted are accepted under the [Project's license](./LICENSE). You represent that if you do not own copyright in the code that you have the authority to submit it under the [Project's license](./LICENSE). All feedback, suggestions, or contributions are not confidential. The Project abides by the Vega Organization's [code of conduct](https://github.com/vega/.github/blob/main/CODE_OF_CONDUCT.md) and [governance](https://github.com/vega/.github/blob/main/project-docs/GOVERNANCE.md).

## How To Contribute Code to Vega-Altair

### Setting Up Your Environment

Fork the Altair repository on GitHub and then clone the fork to you local
machine. For more details on forking see the [GitHub
Documentation](https://help.github.com/en/articles/fork-a-repo).

```cmd
git clone https://github.com/YOUR-USERNAME/altair.git
```

To keep your fork up to date with changes in this repo,
you can [use the fetch upstream button on GitHub](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork).


[Install `uv`](https://docs.astral.sh/uv/getting-started/installation/), or update to the latest version:

```cmd
uv self update
```
Install Python:

```cmd
uv python install 3.12
```

Initialize a new virtual environment:

```cmd
cd altair/
uv venv -p 3.12
```

Activate your environment:

<details><summary>macOS/Linux</summary>
<p>

```bash
source .venv/bin/activate
```

</p>
</details> 

<details><summary>Windows</summary>
<p>

```cmd
.venv\Scripts\activate
```

</p>
</details> 

Install the project with all development dependencies:
```cmd
uv sync --all-extras
```

> [!TIP]
> If you're new to `uv`, check out their [Getting started](https://docs.astral.sh/uv/getting-started/) guide for help

### Creating a Branch

Once your local environment is up-to-date, you can create a new git branch
which will contain your contribution
(always create a new branch instead of making changes to the main branch):

```cmd
git switch -c <your-branch-name>
```

With this branch checked-out, make the desired changes to the package.

A large part of Altair's code base is automatically generated.
After you have made your manual changes,
make sure to run the following to see if there are any changes
to the automatically generated files: 

```bash
uv run task generate-schema-wrapper
```

For information on how to update the Vega-Lite version that Altair uses,
please read [the maintainers' notes](NOTES_FOR_MAINTAINERS.md).

### Testing your Changes

Before submitting your changes to the main Altair repository,
it is recommended that you run the Altair test suite,
which includes a number of tests to validate the correctness of your code:

```bash
uv run task test
```


This also runs the [`ruff`](https://ruff.rs/) linter and formatter as well as [`mypy`](https://mypy-lang.org/) as type checker.


Study the output of any failed tests and try to fix the issues
before proceeding to the next section.

#### Failures on specific python version(s)

By default, `uv run task test` will run the test suite against the currently active python version.
Two useful variants for debugging failures that only appear *after* you've submitted your PR:

```bash
# Test against all python version(s) in the matrix
uv run task test-all
# Test against our minimum required version
uv run task test-min
```

See [hatch test](https://hatch.pypa.io/latest/cli/reference/#hatch-test) docs for other options.

#### Changes to `__all__`
If `test_completeness_of__all__` fails, you may need to run:

```bash
uv run task update-init-file
```
However, this test usually indicates *unintentional* addition(s) to the top-level `alt.` namespace that will need resolving first.

### Creating a Pull Request

When you are happy with your changes, you can commit them to your branch by running

```cmd
git add <modified-file>
git commit -m "Some descriptive message about your change"
git push origin <your-branch-name>
```

You will then need to submit a pull request (PR) on GitHub asking to merge
your example branch into the main Altair repository. For details on creating a PR see GitHub
documentation [Creating a pull
request](https://help.github.com/en/articles/creating-a-pull-request). You can
add more details about your example in the PR such as motivation for the
example or why you thought it would be a good addition.  You will get feed back
in the PR discussion if anything needs to be changed. To make changes continue
to push commits made in your local example branch to origin and they will be
automatically shown in the PR. 

Hopefully your PR will be answered in a timely manner and your contribution will
help others in the future.

## How To Contribute Documentation to Vega-Altair

Altair documentation is written in [reStructuredText](http://docutils.sourceforge.net/rst.html)
and compiled into html pages using [Sphinx](http://www.sphinx-doc.org/en/master/).
Contributing to the documentation requires some extra dependencies and 
we have some conventions and plugins that are used to help navigate the docs and 
generate great Altair visualizations. 

Note that the [Altair website](https://altair-viz.github.io/)
is only updated when a new version is released so your contribution might not show
up for a while.

### Adding Examples

We are always interested in new examples contributed from the community. These
could be everything from simple one-panel scatter and line plots, to more
complicated layered or stacked plots, to more advanced interactive features.
Before submitting a new example check the [Altair Example
Gallery](https://altair-viz.github.io/gallery/index.html) to make sure that
your idea has not already been implemented. 

Once you have an example you would like to add there are a few guide lines to follow.
Every example should:
- have a `arguments_syntax` and `methods_syntax` implementation. Each implementation 
  must be saved as a stand alone script in the `tests/examples_arguments_syntax` 
  and `tests/examples_methods_syntax` directories.
- have a descriptive docstring, which will eventually be extracted for the
  documentation website.
- contain a category tag.
- define a chart variable with the main chart object (This will be used both in
  the unit tests to confirm that the example executes properly, and also
  eventually used to display the visualization on the documentation website).
- not make any external calls to download data within the script (i.e. don't
  use urllib). You can define your data directly within the example file,
  generate your data using pandas and numpy, or you can use data
  available in the `altair.datasets` module.

The easiest way to get started would be to adapt examples from the [Vega-Lite
example gallery](https://vega.github.io/vega-lite/examples/) which are missing
in the Altair gallery. Or you can feel free to be creative and build your own
visualizations.

Often it is convenient to draft an example outside of the main repository, such
as [Google Colab](https://colab.research.google.com/), to avoid difficulties
when working with git. Once you have an example you would like to add, follow the
same contribution procedure outlined above.

Some additional notes:

- The format and style of new contributions should generally match that of existing examples.
- The file docstring will be rendered into HTML via
  [reStructuredText](http://docutils.sourceforge.net/rst.html), so use that
  format for any hyperlinks or text styling. In particular, be sure you include
  a title in the docstring underlined with `---`, and be sure that the size of
  the underline exactly matches the size of the title text.
- If your example fits into a chart type but involves significant configuration
  it should be in the `Case Studies` category.
- For consistency all data used for a visualization should be assigned to the
  variable `source`. Then `source` is passed to the `alt.Chart` object.
  If the example requires multiple dataframes then this does not apply. See
  other examples for guidance. 
- Example code should not require downloading external datasets. We suggest
  using the `altair.datasets` module if possible.
  If you are using the `altair.datasets` module there are multiple ways to refer
  to a data source. The data can be referenced directly, such as `source = data.penguins()`, or it can be referenced by URL, such as `source =
  data.movies.url`. This is to ensure that Altair's automated test suite does
  not depend on availability of external HTTP resources.
- If VlConvert does not support PNG export of the chart (e.g. in the case of emoji),
  then add the name of the example to the `SVG_EXAMPLES` set in 
  `tests/examples_arguments_syntax/__init__.py` and `tests/examples_methods_syntax/__init__.py`

### Building the Documentation Locally

The process to build the documentation locally consists of three steps:

1. **Clean** (remove) any previously generated documentation files.
2. **Build** the documentation in HTML format.
3. View the documentation using a *local* Python testing **server**.

Steps 1 & 2 can be run as a single command, followed by step 3:
```cmd
uv run task doc-clean-build
uv run task doc-serve
```

> [!TIP]
> If these commands were not available for you, make sure you've [set up your environment](#setting-up-your-environment)


To view the documentation, open your browser and go to `http://localhost:8000`. To stop the server, use `^C` (control+c) in the terminal.

---

Part of MVG-0.1-beta.
Made with love by GitHub. Licensed under the [CC-BY 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/).


================================================
FILE: LICENSE
================================================
Copyright (c) 2015-2025, Vega-Altair Developers
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of vega-altair nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



================================================
FILE: NOTES_FOR_MAINTAINERS.md
================================================
# Notes for Maintainers of Altair

## Auto-generating the Python code

The core Python API for Altair can be found in the following locations:

- ``altair/vegalite/v6/schema/``

All the files within these directories are created automatically by running
the following script:

```bash
uv run task generate-schema-wrapper
```

This script does a couple things:

- downloads the appropriate schema files from the specified vega-lite
  release versions & copies the JSON file to the appropriate ``schema``
  directory
- generates basic low-level schemapi wrappers from the definitions within
  the schema: this is put in the ``schema/core.py`` file
- generates a second layer of higher level wrappers for some vega-lite
  functionality; this is put in ``schema/channels.py`` and ``schema/mixins.py``

The script output is designed to be deterministic; if the vega-lite version
is not changed, then running the script should overwrite the schema wrappers
with identical copies.

## Updating Vega versions
All versions are maintained in [pyproject.toml](pyproject.toml).

### Python Packages

Projects which publish a package to PyPI are listed with a version bound in one of the following tables:

- [`project.dependencies`](https://packaging.python.org/en/latest/specifications/pyproject-toml/#dependencies-optional-dependencies): Published dependencies.
- [`project.optional-dependencies`](https://packaging.python.org/en/latest/specifications/pyproject-toml/#dependencies-optional-dependencies): Published optional dependencies, or "extras".
- [`dependency-groups`](https://peps.python.org/pep-0735/): Local dependencies for development.

> [!NOTE]
> All are currently declared in sub-tables of `project.optional-dependencies`.

The lower version bounds defined here are reused for [altair/utils/_importers.py](altair/utils/_importers.py).

#### `vl-convert`

We need to ensure that [vl-convert](https://github.com/vega/vl-convert) includes support for the new Vega-Lite version. 
Check the [vl-convert releases](https://github.com/vega/vl-convert/releases) to find the minimum
version of `vl-convert` that includes support for the desired version of Vega-Lite (and [open
an issue](https://github.com/vega/vl-convert/issues) if this version hasn't been
included in a released yet).

### Javascript/other

Additional version constraints, including for [`Vega-Lite`](https://github.com/vega/vega-lite) itself are declared in `[tool.altair.vega]`.

Whereas the [previous dependencies](#python-packages) are used primarily at *install-time*; this group is embedded into `altair` for use at *runtime* or when [generating the python code](#auto-generating-the-python-code):

```toml
[tool.altair.vega]
vega-datasets     = "..." # https://github.com/vega/vega-datasets
vega-embed        = "..." # https://github.com/vega/vega-embed
vega-lite         = "..." # https://github.com/vega/vega-lite
```

Some examples of where these propagate to:
- [altair/jupyter/js/index.js](altair/jupyter/js/index.js)
- [altair/utils/_importers.py](altair/utils/_importers.py)
- [tools/generate_schema_wrapper.py](tools/generate_schema_wrapper.py)
- [tools/versioning.py](tools/versioning.py)
- [altair/utils/schemapi.py](https://github.com/vega/altair/blob/0e23fd33e9a755bab0ef73a856340c48c14897e6/altair/utils/schemapi.py#L1619-L1640)

> [!IMPORTANT]
> When updating **any** of these versions, be sure to [re-generate the python code](#auto-generating-the-python-code).

#### Updating the Vega-Lite version

The Vega-Lite version for the Python code propagates to `tools.generate_schema_wrapper.SCHEMA_VERSION`.

This will update all of the automatically-generated files in the ``schema``
directory for each version, but please note that it will *not* update other
pieces (for example, the core of the Altair API, including methods and
doc strings within ``altair/vegalite/v6/api.py``).
These additional methods have fairly good test coverage, so running the test
suite should identify any inconsistencies:

```bash
uv run task test
```

Generally, minor version updates (e.g. Vega-Lite 2.3->2.4) have been relatively
painless, maybe requiring the addition of a few chart methods or modification
of some docstrings.
Major version updates (e.g. Vega-Lite 1.X->2.X) have required substantial
rewrites, because the internal structure of the schema changed appreciably.

## Releasing the Package

To cut a new release of Altair, follow the steps outlined in
[RELEASING.md](RELEASING.md).

## Web analytics
We use the privacy-friendly [plausible.io](https://plausible.io/) for tracking usage statistics of our documentation.
It is hosted on [https://views.scientific-python.org](https://views.scientific-python.org). You can view the stats [here](https://views.scientific-python.org/altair-viz.github.io). To get an account to edit the settings of the web tracking, ask another maintainer.

================================================
FILE: README.md
================================================
# Vega-Altair <a href="https://altair-viz.github.io/"><img align="right" src="https://altair-viz.github.io/_static/altair-logo-light.png" height="50"></img></a>

[![github actions](https://github.com/vega/altair/workflows/build/badge.svg)](https://github.com/vega/altair/actions?query=workflow%3Abuild)
[![typedlib_mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://www.mypy-lang.org)
[![JOSS Paper](https://joss.theoj.org/papers/10.21105/joss.01057/status.svg)](https://joss.theoj.org/papers/10.21105/joss.01057)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/altair)](https://pypi.org/project/altair)

**Vega-Altair** is a declarative statistical visualization library for Python. With Vega-Altair, you can spend more time understanding your data and its meaning. Vega-Altair's
API is simple, friendly and consistent and built on top of the powerful
[Vega-Lite](https://github.com/vega/vega-lite) JSON specification. This elegant
simplicity produces beautiful and effective visualizations with a minimal amount of code. 

*Vega-Altair was originally developed by [Jake Vanderplas](https://github.com/jakevdp) and [Brian
Granger](https://github.com/ellisonbg) in close collaboration with the [UW
Interactive Data Lab](https://idl.cs.washington.edu/).*
*The Vega-Altair open source project is not affiliated with Altair Engineering, Inc.*

## Documentation

See [Vega-Altair's Documentation Site](https://altair-viz.github.io) as well as the [Tutorial Notebooks](https://github.com/altair-viz/altair_notebooks). You can
run the notebooks directly in your browser by clicking on one of the following badges:

[![Binder](https://beta.mybinder.org/badge.svg)](https://beta.mybinder.org/v2/gh/altair-viz/altair_notebooks/master)
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/altair-viz/altair_notebooks/blob/master/notebooks/Index.ipynb)

## Example

Here is an example using Vega-Altair to quickly visualize and display a dataset with the native Vega-Lite renderer in the JupyterLab:

```python
import altair as alt

# load a simple dataset as a pandas DataFrame
from altair.datasets import data
cars = data.cars()

alt.Chart(cars).mark_point().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
)
```

![Vega-Altair Visualization](https://raw.githubusercontent.com/altair-viz/altair/main/images/cars.png)

One of the unique features of Vega-Altair, inherited from Vega-Lite, is a declarative grammar of not just visualization, but _interaction_. 
With a few modifications to the example above we can create a linked histogram that is filtered based on a selection of the scatter plot.

```python 
import altair as alt
from altair.datasets import data

source = data.cars()

brush = alt.selection_interval()

points = alt.Chart(source).mark_point().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color=alt.when(brush).then("Origin").otherwise(alt.value("lightgray"))
).add_params(
    brush
)

bars = alt.Chart(source).mark_bar().encode(
    y='Origin',
    color='Origin',
    x='count(Origin)'
).transform_filter(
    brush
)

points & bars
```

![Vega-Altair Visualization Gif](https://raw.githubusercontent.com/altair-viz/altair/main/images/cars_scatter_bar.gif)

## Features

* Carefully-designed, declarative Python API.
* Auto-generated internal Python API that guarantees visualizations are type-checked and
  in full conformance with the [Vega-Lite](https://github.com/vega/vega-lite)
  specification.
* Display visualizations in JupyterLab, Jupyter Notebook, Visual Studio Code, on GitHub and
  [nbviewer](https://nbviewer.jupyter.org/), and many more.
* Export visualizations to various formats such as PNG/SVG images, stand-alone HTML pages and the
[Online Vega-Lite Editor](https://vega.github.io/editor/#/).
* Serialize visualizations as JSON files.

## Installation

Vega-Altair can be installed with:
```bash
pip install altair
```

If you are using the conda package manager, the equivalent is:
```bash
conda install altair -c conda-forge
```

For full installation instructions, please see [the documentation](https://altair-viz.github.io/getting_started/installation.html).

## Getting Help

If you have a question that is not addressed in the documentation, 
you can post it on [StackOverflow](https://stackoverflow.com/questions/tagged/altair) using the `altair` tag.
For bugs and feature requests, please open a [Github Issue](https://github.com/vega/altair/issues).

## Development
[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![pytest](https://img.shields.io/badge/logo-pytest-blue?logo=pytest&labelColor=5c5c5c&label=%20)](https://github.com/pytest-dev/pytest)

For information on how to contribute your developments back to the Vega-Altair repository, see
[`CONTRIBUTING.md`](https://github.com/vega/altair/blob/main/CONTRIBUTING.md)

## Citing Vega-Altair

[![JOSS Paper](https://joss.theoj.org/papers/10.21105/joss.01057/status.svg)](https://joss.theoj.org/papers/10.21105/joss.01057)

If you use Vega-Altair in academic work, please consider citing https://joss.theoj.org/papers/10.21105/joss.01057 as

```bib
@article{VanderPlas2018,
    doi = {10.21105/joss.01057},
    url = {https://doi.org/10.21105/joss.01057},
    year = {2018},
    publisher = {The Open Journal},
    volume = {3},
    number = {32},
    pages = {1057},
    author = {Jacob VanderPlas and Brian Granger and Jeffrey Heer and Dominik Moritz and Kanit Wongsuphasawat and Arvind Satyanarayan and Eitan Lees and Ilia Timofeev and Ben Welsh and Scott Sievert},
    title = {Altair: Interactive Statistical Visualizations for Python},
    journal = {Journal of Open Source Software}
}
```
Please additionally consider citing the [Vega-Lite](https://vega.github.io/vega-lite/) project, which Vega-Altair is based on: https://dl.acm.org/doi/10.1109/TVCG.2016.2599030

```bib
@article{Satyanarayan2017,
    author={Satyanarayan, Arvind and Moritz, Dominik and Wongsuphasawat, Kanit and Heer, Jeffrey},
    title={Vega-Lite: A Grammar of Interactive Graphics},
    journal={IEEE transactions on visualization and computer graphics},
    year={2017},
    volume={23},
    number={1},
    pages={341-350},
    publisher={IEEE}
} 
```


================================================
FILE: RELEASING.md
================================================
1. Check all [Vega project](https://github.com/orgs/vega/repositories?type=source) versions are up-to-date. See [NOTES_FOR_MAINTAINERS.md](NOTES_FOR_MAINTAINERS.md)


2. Make sure to have [set up your environment](CONTRIBUTING.md#setting-up-your-environment).
   Update your environment with the latest dependencies:
   
        uv sync --all-extras

3. Make certain your branch is in sync with head, and that you have no uncommitted modifications. If you work on a fork, replace `origin` with `upstream`:
 
        git checkout main
        git pull origin main
        git status  # Should show "nothing to commit, working tree clean"

4. Do a [clean doc build](CONTRIBUTING.md#building-the-documentation-locally):
   
   Navigate to http://localhost:8000 and ensure it looks OK (particularly
   do a visual scan of the gallery thumbnails).

5. Create a new release branch:
       
        git switch -c version_6.0.0

6. Update version to, e.g. 6.0.0:

   - in ``altair/__init__.py``
   - in ``doc/conf.py``

7. Commit changes and push:

        git add . -u
        git commit -m "chore: Bump version to 6.0.0"
        git push

8. Merge release branch into main, make sure that all required checks pass

9.  Switch to main, If you work on a fork, replace `origin` with `upstream`:

        git switch main
        git pull origin main
        
10. Build a source distribution and universal wheel, 
    publish to PyPI (Requires correct PyPI owner permissions and [UV_PUBLISH_TOKEN](https://docs.astral.sh/uv/configuration/environment/#uv_publish_token)):

        uv run task publish

11. Build and publish docs (Requires write-access to [altair-viz/altair-viz.github.io](https://github.com/altair-viz/altair-viz.github.io)):

        uv run task doc-publish-clean-build

12. On main, tag the release. If you work on a fork, replace `origin` with `upstream`:

       git tag -a v6.0.0 -m "Version 6.0.0 release"
       git push origin v6.0.0

13. Create a new branch:
       
       git switch -c maint_6.1.0dev

14. Update version and add 'dev' suffix, e.g. 6.1.0dev:

    - in ``altair/__init__.py``
    - in ``doc/conf.py``

15. Commit changes and push:

        git add . -u
        git commit -m "chore: Bump version to 6.1.0dev"
        git push
        
16. Merge maintenance branch into main

17. Double-check that a conda-forge pull request is generated from the updated
    pip package by the conda-forge bot (may take up to several hours):
    https://github.com/conda-forge/altair-feedstock/pulls

18. Publish a new release in https://github.com/vega/altair/releases/


================================================
FILE: altair/__init__.py
================================================
# ruff: noqa
__version__ = "6.1.0dev"

# The content of __all__ is automatically written by
# tools/update_init_file.py. Do not modify directly.
__all__ = [
    "Aggregate",
    "AggregateOp",
    "AggregateTransform",
    "AggregatedFieldDef",
    "Align",
    "AllSortString",
    "AltairDeprecationWarning",
    "Angle",
    "AngleDatum",
    "AngleValue",
    "AnyMark",
    "AnyMarkConfig",
    "AreaConfig",
    "ArgmaxDef",
    "ArgminDef",
    "AutoSizeParams",
    "AutosizeType",
    "Axis",
    "AxisConfig",
    "AxisOrient",
    "AxisResolveMap",
    "BBox",
    "BarConfig",
    "BaseTitleNoValueRefs",
    "Baseline",
    "Bin",
    "BinExtent",
    "BinParams",
    "BinTransform",
    "BindCheckbox",
    "BindDirect",
    "BindInput",
    "BindRadioSelect",
    "BindRange",
    "Binding",
    "BinnedTimeUnit",
    "Blend",
    "BoxPlot",
    "BoxPlotConfig",
    "BoxPlotDef",
    "BrushConfig",
    "CalculateTransform",
    "Categorical",
    "ChainedWhen",
    "Chart",
    "ChartDataType",
    "Color",
    "ColorDatum",
    "ColorDef",
    "ColorName",
    "ColorScheme",
    "ColorValue",
    "Column",
    "CompositeMark",
    "CompositeMarkDef",
    "CompositionConfig",
    "ConcatChart",
    "ConcatSpecGenericSpec",
    "ConditionalAxisColor",
    "ConditionalAxisLabelAlign",
    "ConditionalAxisLabelBaseline",
    "ConditionalAxisLabelFontStyle",
    "ConditionalAxisLabelFontWeight",
    "ConditionalAxisNumber",
    "ConditionalAxisNumberArray",
    "ConditionalAxisPropertyAlignnull",
    "ConditionalAxisPropertyColornull",
    "ConditionalAxisPropertyFontStylenull",
    "ConditionalAxisPropertyFontWeightnull",
    "ConditionalAxisPropertyTextBaselinenull",
    "ConditionalAxisPropertynumberArraynull",
    "ConditionalAxisPropertynumbernull",
    "ConditionalAxisPropertystringnull",
    "ConditionalAxisString",
    "ConditionalMarkPropFieldOrDatumDef",
    "ConditionalMarkPropFieldOrDatumDefTypeForShape",
    "ConditionalParameterMarkPropFieldOrDatumDef",
    "ConditionalParameterMarkPropFieldOrDatumDefTypeForShape",
    "ConditionalParameterStringFieldDef",
    "ConditionalParameterValueDefGradientstringnullExprRef",
    "ConditionalParameterValueDefTextExprRef",
    "ConditionalParameterValueDefnumber",
    "ConditionalParameterValueDefnumberArrayExprRef",
    "ConditionalParameterValueDefnumberExprRef",
    "ConditionalParameterValueDefstringExprRef",
    "ConditionalParameterValueDefstringnullExprRef",
    "ConditionalPredicateMarkPropFieldOrDatumDef",
    "ConditionalPredicateMarkPropFieldOrDatumDefTypeForShape",
    "ConditionalPredicateStringFieldDef",
    "ConditionalPredicateValueDefAlignnullExprRef",
    "ConditionalPredicateValueDefColornullExprRef",
    "ConditionalPredicateValueDefFontStylenullExprRef",
    "ConditionalPredicateValueDefFontWeightnullExprRef",
    "ConditionalPredicateValueDefGradientstringnullExprRef",
    "ConditionalPredicateValueDefTextBaselinenullExprRef",
    "ConditionalPredicateValueDefTextExprRef",
    "ConditionalPredicateValueDefnumber",
    "ConditionalPredicateValueDefnumberArrayExprRef",
    "ConditionalPredicateValueDefnumberArraynullExprRef",
    "ConditionalPredicateValueDefnumberExprRef",
    "ConditionalPredicateValueDefnumbernullExprRef",
    "ConditionalPredicateValueDefstringExprRef",
    "ConditionalPredicateValueDefstringnullExprRef",
    "ConditionalStringFieldDef",
    "ConditionalValueDefGradientstringnullExprRef",
    "ConditionalValueDefTextExprRef",
    "ConditionalValueDefnumber",
    "ConditionalValueDefnumberArrayExprRef",
    "ConditionalValueDefnumberExprRef",
    "ConditionalValueDefstringExprRef",
    "ConditionalValueDefstringnullExprRef",
    "Config",
    "CsvDataFormat",
    "Cursor",
    "Cyclical",
    "Data",
    "DataFormat",
    "DataSource",
    "DataType",
    "Datasets",
    "DateTime",
    "DatumChannelMixin",
    "DatumDef",
    "Day",
    "DensityTransform",
    "DerivedStream",
    "Description",
    "DescriptionValue",
    "Detail",
    "Dict",
    "DictInlineDataset",
    "DictSelectionInit",
    "DictSelectionInitInterval",
    "Diverging",
    "DomainUnionWith",
    "DsvDataFormat",
    "Element",
    "Encoding",
    "EncodingSortField",
    "ErrorBand",
    "ErrorBandConfig",
    "ErrorBandDef",
    "ErrorBar",
    "ErrorBarConfig",
    "ErrorBarDef",
    "ErrorBarExtent",
    "EventStream",
    "EventType",
    "Expr",
    "ExprRef",
    "ExtentTransform",
    "Facet",
    "FacetChart",
    "FacetEncodingFieldDef",
    "FacetFieldDef",
    "FacetMapping",
    "FacetSpec",
    "FacetedEncoding",
    "FacetedUnitSpec",
    "Feature",
    "FeatureCollection",
    "FeatureGeometryGeoJsonProperties",
    "Field",
    "FieldChannelMixin",
    "FieldDefWithoutScale",
    "FieldEqualPredicate",
    "FieldGTEPredicate",
    "FieldGTPredicate",
    "FieldLTEPredicate",
    "FieldLTPredicate",
    "FieldName",
    "FieldOneOfPredicate",
    "FieldOrDatumDefWithConditionDatumDefGradientstringnull",
    "FieldOrDatumDefWithConditionDatumDefnumber",
    "FieldOrDatumDefWithConditionDatumDefnumberArray",
    "FieldOrDatumDefWithConditionDatumDefstringnull",
    "FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull",
    "FieldOrDatumDefWithConditionMarkPropFieldDefTypeForShapestringnull",
    "FieldOrDatumDefWithConditionMarkPropFieldDefnumber",
    "FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray",
    "FieldOrDatumDefWithConditionStringDatumDefText",
    "FieldOrDatumDefWithConditionStringFieldDefText",
    "FieldOrDatumDefWithConditionStringFieldDefstring",
    "FieldRange",
    "FieldRangePredicate",
    "FieldValidPredicate",
    "Fill",
    "FillDatum",
    "FillOpacity",
    "FillOpacityDatum",
    "FillOpacityValue",
    "FillValue",
    "FilterTransform",
    "Fit",
    "FlattenTransform",
    "FoldTransform",
    "FontStyle",
    "FontWeight",
    "Format",
    "FormatConfig",
    "Generator",
    "GenericUnitSpecEncodingAnyMark",
    "GeoJsonFeature",
    "GeoJsonFeatureCollection",
    "GeoJsonProperties",
    "Geometry",
    "GeometryCollection",
    "Gradient",
    "GradientStop",
    "GraticuleGenerator",
    "GraticuleParams",
    "HConcatChart",
    "HConcatSpecGenericSpec",
    "Header",
    "HeaderConfig",
    "HexColor",
    "Href",
    "HrefValue",
    "Impute",
    "ImputeMethod",
    "ImputeParams",
    "ImputeSequence",
    "ImputeTransform",
    "InlineData",
    "InlineDataset",
    "Interpolate",
    "IntervalSelectionConfig",
    "IntervalSelectionConfigWithoutType",
    "JoinAggregateFieldDef",
    "JoinAggregateTransform",
    "JsonDataFormat",
    "JupyterChart",
    "Key",
    "LabelOverlap",
    "LatLongDef",
    "LatLongFieldDef",
    "Latitude",
    "Latitude2",
    "Latitude2Datum",
    "Latitude2Value",
    "LatitudeDatum",
    "LayerChart",
    "LayerRepeatMapping",
    "LayerRepeatSpec",
    "LayerSpec",
    "LayoutAlign",
    "Legend",
    "LegendBinding",
    "LegendConfig",
    "LegendOrient",
    "LegendResolveMap",
    "LegendStreamBinding",
    "LineConfig",
    "LineString",
    "LinearGradient",
    "LocalMultiTimeUnit",
    "LocalSingleTimeUnit",
    "Locale",
    "LoessTransform",
    "LogicalAndPredicate",
    "LogicalNotPredicate",
    "LogicalOrPredicate",
    "Longitude",
    "Longitude2",
    "Longitude2Datum",
    "Longitude2Value",
    "LongitudeDatum",
    "LookupData",
    "LookupSelection",
    "LookupTransform",
    "Mark",
    "MarkConfig",
    "MarkDef",
    "MarkInvalidDataMode",
    "MarkPropDefGradientstringnull",
    "MarkPropDefnumber",
    "MarkPropDefnumberArray",
    "MarkPropDefstringnullTypeForShape",
    "MarkType",
    "MaxRowsError",
    "MergedStream",
    "Month",
    "MultiLineString",
    "MultiPoint",
    "MultiPolygon",
    "MultiTimeUnit",
    "NamedData",
    "NonArgAggregateOp",
    "NonLayerRepeatSpec",
    "NonNormalizedSpec",
    "NumberLocale",
    "NumericArrayMarkPropDef",
    "NumericMarkPropDef",
    "OffsetDef",
    "Opacity",
    "OpacityDatum",
    "OpacityValue",
    "Order",
    "OrderFieldDef",
    "OrderOnlyDef",
    "OrderValue",
    "OrderValueDef",
    "Orient",
    "Orientation",
    "OverlayMarkDef",
    "Padding",
    "Parameter",
    "ParameterExpression",
    "ParameterExtent",
    "ParameterName",
    "ParameterPredicate",
    "Parse",
    "ParseValue",
    "PivotTransform",
    "Point",
    "PointSelectionConfig",
    "PointSelectionConfigWithoutType",
    "PolarDef",
    "Polygon",
    "Position",
    "Position2Def",
    "PositionDatumDef",
    "PositionDatumDefBase",
    "PositionDef",
    "PositionFieldDef",
    "PositionFieldDefBase",
    "PositionValueDef",
    "Predicate",
    "PredicateComposition",
    "PrimitiveValue",
    "Projection",
    "ProjectionConfig",
    "ProjectionType",
    "QuantileTransform",
    "RadialGradient",
    "Radius",
    "Radius2",
    "Radius2Datum",
    "Radius2Value",
    "RadiusDatum",
    "RadiusValue",
    "RangeConfig",
    "RangeEnum",
    "RangeRaw",
    "RangeRawArray",
    "RangeScheme",
    "RectConfig",
    "RegressionTransform",
    "RelativeBandSize",
    "RepeatChart",
    "RepeatMapping",
    "RepeatRef",
    "RepeatSpec",
    "Resolve",
    "ResolveMode",
    "Root",
    "Row",
    "RowColLayoutAlign",
    "RowColboolean",
    "RowColnumber",
    "RowColumnEncodingFieldDef",
    "SCHEMA_URL",
    "SCHEMA_VERSION",
    "SampleTransform",
    "Scale",
    "ScaleBinParams",
    "ScaleBins",
    "ScaleConfig",
    "ScaleDatumDef",
    "ScaleFieldDef",
    "ScaleInterpolateEnum",
    "ScaleInterpolateParams",
    "ScaleInvalidDataConfig",
    "ScaleInvalidDataShowAsValueangle",
    "ScaleInvalidDataShowAsValuecolor",
    "ScaleInvalidDataShowAsValuefill",
    "ScaleInvalidDataShowAsValuefillOpacity",
    "ScaleInvalidDataShowAsValueopacity",
    "ScaleInvalidDataShowAsValueradius",
    "ScaleInvalidDataShowAsValueshape",
    "ScaleInvalidDataShowAsValuesize",
    "ScaleInvalidDataShowAsValuestroke",
    "ScaleInvalidDataShowAsValuestrokeDash",
    "ScaleInvalidDataShowAsValuestrokeOpacity",
    "ScaleInvalidDataShowAsValuestrokeWidth",
    "ScaleInvalidDataShowAsValuetheta",
    "ScaleInvalidDataShowAsValuetime",
    "ScaleInvalidDataShowAsValuex",
    "ScaleInvalidDataShowAsValuexOffset",
    "ScaleInvalidDataShowAsValuey",
    "ScaleInvalidDataShowAsValueyOffset",
    "ScaleInvalidDataShowAsangle",
    "ScaleInvalidDataShowAscolor",
    "ScaleInvalidDataShowAsfill",
    "ScaleInvalidDataShowAsfillOpacity",
    "ScaleInvalidDataShowAsopacity",
    "ScaleInvalidDataShowAsradius",
    "ScaleInvalidDataShowAsshape",
    "ScaleInvalidDataShowAssize",
    "ScaleInvalidDataShowAsstroke",
    "ScaleInvalidDataShowAsstrokeDash",
    "ScaleInvalidDataShowAsstrokeOpacity",
    "ScaleInvalidDataShowAsstrokeWidth",
    "ScaleInvalidDataShowAstheta",
    "ScaleInvalidDataShowAstime",
    "ScaleInvalidDataShowAsx",
    "ScaleInvalidDataShowAsxOffset",
    "ScaleInvalidDataShowAsy",
    "ScaleInvalidDataShowAsyOffset",
    "ScaleResolveMap",
    "ScaleType",
    "SchemaBase",
    "SchemeParams",
    "SecondaryFieldDef",
    "SelectionConfig",
    "SelectionExpression",
    "SelectionInit",
    "SelectionInitInterval",
    "SelectionInitIntervalMapping",
    "SelectionInitMapping",
    "SelectionParameter",
    "SelectionPredicateComposition",
    "SelectionResolution",
    "SelectionType",
    "SequenceGenerator",
    "SequenceParams",
    "SequentialMultiHue",
    "SequentialSingleHue",
    "Shape",
    "ShapeDatum",
    "ShapeDef",
    "ShapeValue",
    "SharedEncoding",
    "SingleDefUnitChannel",
    "SingleTimeUnit",
    "Size",
    "SizeDatum",
    "SizeValue",
    "Sort",
    "SortArray",
    "SortByChannel",
    "SortByChannelDesc",
    "SortByEncoding",
    "SortField",
    "SortOrder",
    "Spec",
    "SphereGenerator",
    "StackOffset",
    "StackTransform",
    "StandardType",
    "Step",
    "StepFor",
    "Stream",
    "StringFieldDef",
    "StringFieldDefWithCondition",
    "StringValueDefWithCondition",
    "Stroke",
    "StrokeCap",
    "StrokeDash",
    "StrokeDashDatum",
    "StrokeDashValue",
    "StrokeDatum",
    "StrokeJoin",
    "StrokeOpacity",
    "StrokeOpacityDatum",
    "StrokeOpacityValue",
    "StrokeValue",
    "StrokeWidth",
    "StrokeWidthDatum",
    "StrokeWidthValue",
    "StyleConfigIndex",
    "SymbolShape",
    "TOPLEVEL_ONLY_KEYS",
    "Text",
    "TextBaseline",
    "TextDatum",
    "TextDef",
    "TextDirection",
    "TextValue",
    "Then",
    "Theta",
    "Theta2",
    "Theta2Datum",
    "Theta2Value",
    "ThetaDatum",
    "ThetaValue",
    "TickConfig",
    "TickCount",
    "Time",
    "TimeDef",
    "TimeFieldDef",
    "TimeFormatSpecifier",
    "TimeInterval",
    "TimeIntervalStep",
    "TimeLocale",
    "TimeUnit",
    "TimeUnitParams",
    "TimeUnitTransform",
    "TimeUnitTransformParams",
    "Title",
    "TitleAnchor",
    "TitleConfig",
    "TitleFrame",
    "TitleOrient",
    "TitleParams",
    "Tooltip",
    "TooltipContent",
    "TooltipValue",
    "TopLevelConcatSpec",
    "TopLevelFacetSpec",
    "TopLevelHConcatSpec",
    "TopLevelLayerSpec",
    "TopLevelMixin",
    "TopLevelParameter",
    "TopLevelRepeatSpec",
    "TopLevelSelectionParameter",
    "TopLevelSpec",
    "TopLevelUnitSpec",
    "TopLevelVConcatSpec",
    "TopoDataFormat",
    "Transform",
    "Type",
    "TypeForShape",
    "TypedFieldDef",
    "URI",
    "Undefined",
    "UnitSpec",
    "UnitSpecWithFrame",
    "Url",
    "UrlData",
    "UrlValue",
    "UtcMultiTimeUnit",
    "UtcSingleTimeUnit",
    "VConcatChart",
    "VConcatSpecGenericSpec",
    "VEGAEMBED_VERSION",
    "VEGALITE_VERSION",
    "VEGA_VERSION",
    "ValueChannelMixin",
    "ValueDefWithConditionMarkPropFieldOrDatumDefGradientstringnull",
    "ValueDefWithConditionMarkPropFieldOrDatumDefTypeForShapestringnull",
    "ValueDefWithConditionMarkPropFieldOrDatumDefnumber",
    "ValueDefWithConditionMarkPropFieldOrDatumDefnumberArray",
    "ValueDefWithConditionMarkPropFieldOrDatumDefstringnull",
    "ValueDefWithConditionStringFieldDefText",
    "ValueDefnumber",
    "ValueDefnumberwidthheightExprRef",
    "VariableParameter",
    "Vector10string",
    "Vector12string",
    "Vector2DateTime",
    "Vector2Vector2number",
    "Vector2boolean",
    "Vector2number",
    "Vector2string",
    "Vector3number",
    "Vector7string",
    "VegaLite",
    "VegaLiteSchema",
    "ViewBackground",
    "ViewConfig",
    "When",
    "WindowEventType",
    "WindowFieldDef",
    "WindowOnlyOp",
    "WindowTransform",
    "X",
    "X2",
    "X2Datum",
    "X2Value",
    "XDatum",
    "XError",
    "XError2",
    "XError2Value",
    "XErrorValue",
    "XOffset",
    "XOffsetDatum",
    "XOffsetValue",
    "XValue",
    "Y",
    "Y2",
    "Y2Datum",
    "Y2Value",
    "YDatum",
    "YError",
    "YError2",
    "YError2Value",
    "YErrorValue",
    "YOffset",
    "YOffsetDatum",
    "YOffsetValue",
    "YValue",
    "api",
    "binding",
    "binding_checkbox",
    "binding_radio",
    "binding_range",
    "binding_select",
    "channels",
    "check_fields_and_encodings",
    "compiler",
    "concat",
    "condition",
    "core",
    "data",
    "data_transformers",
    "datasets",
    "datum",
    "default_data_transformer",
    "display",
    "expr",
    "graticule",
    "hconcat",
    "jupyter",
    "layer",
    "limit_rows",
    "load_ipython_extension",
    "load_schema",
    "mixins",
    "param",
    "parse_shorthand",
    "renderers",
    "repeat",
    "sample",
    "schema",
    "selection_interval",
    "selection_point",
    "sequence",
    "sphere",
    "theme",
    "to_csv",
    "to_json",
    "to_values",
    "topo_feature",
    "typing",
    "utils",
    "v6",
    "value",
    "vconcat",
    "vegalite",
    "vegalite_compilers",
    "when",
    "with_property_setters",
]


def __dir__():
    return __all__


from altair.vegalite import *
from altair.vegalite.v6.schema.core import Dict
from altair.jupyter import JupyterChart
from altair.expr import expr
from altair.utils import AltairDeprecationWarning, parse_shorthand, Undefined
from altair import datasets, theme, typing


def load_ipython_extension(ipython):
    from altair._magics import vegalite

    ipython.register_magic_function(vegalite, "cell")


def __getattr__(name: str):
    from altair.utils.deprecation import deprecated_warn

    if name == "themes":
        deprecated_warn(
            "Most cases require only the following change:\n\n"
            "    # Deprecated\n"
            "    alt.themes.enable('quartz')\n\n"
            "    # Updated\n"
            "    alt.theme.enable('quartz')\n\n"
            "If your code registers a theme, make the following change:\n\n"
            "    # Deprecated\n"
            "    def custom_theme():\n"
            "        return {'height': 400, 'width': 700}\n"
            "    alt.themes.register('theme_name', custom_theme)\n"
            "    alt.themes.enable('theme_name')\n\n"
            "    # Updated\n"
            "    @alt.theme.register('theme_name', enable=True)\n"
            "    def custom_theme():\n"
            "        return alt.theme.ThemeConfig(\n"
            "            {'height': 400, 'width': 700}\n"
            "        )\n\n"
            "See the updated User Guide for further details:\n"
            "    https://altair-viz.github.io/user_guide/api.html#theme\n"
            "    https://altair-viz.github.io/user_guide/customization.html#chart-themes",
            version="5.5.0",
            alternative="altair.theme",
            stacklevel=3,
            action="once",
        )
        return theme._themes
    else:
        msg = f"module {__name__!r} has no attribute {name!r}"
        raise AttributeError(msg)


================================================
FILE: altair/_magics.py
================================================
"""Magic functions for rendering vega-lite specifications."""

from __future__ import annotations

import json
import warnings
from importlib.util import find_spec
from typing import Any

from IPython.core import magic_arguments
from narwhals.stable.v1.dependencies import is_pandas_dataframe

from altair.vegalite import v6 as vegalite_v6

__all__ = ["vegalite"]

RENDERERS = {
    "vega-lite": {
        "6": vegalite_v6.VegaLite,
    },
}


TRANSFORMERS = {
    "vega-lite": {
        "6": vegalite_v6.data_transformers,
    },
}


def _prepare_data(data, data_transformers):
    """Convert input data to data for use within schema."""
    if data is None or isinstance(data, dict):
        return data
    elif is_pandas_dataframe(data):
        if func := data_transformers.get():
            data = func(data)
        return data
    elif isinstance(data, str):
        return {"url": data}
    else:
        warnings.warn(f"data of type {type(data)} not recognized", stacklevel=1)
        return data


def _get_variable(name: str) -> Any:
    """Get a variable from the notebook namespace."""
    from IPython.core.getipython import get_ipython

    if ip := get_ipython():
        if name not in ip.user_ns:
            msg = f"argument '{name}' does not match the name of any defined variable"
            raise NameError(msg)
        return ip.user_ns[name]
    else:
        msg = (
            "Magic command must be run within an IPython "
            "environment, in which get_ipython() is defined."
        )
        raise ValueError(msg)


@magic_arguments.magic_arguments()
@magic_arguments.argument(
    "data",
    nargs="?",
    help="local variablename of a pandas DataFrame to be used as the dataset",
)
@magic_arguments.argument("-v", "--version", dest="version", default="v6")
@magic_arguments.argument("-j", "--json", dest="json", action="store_true")
def vegalite(line, cell) -> vegalite_v6.VegaLite:
    """
    Cell magic for displaying vega-lite visualizations in CoLab.

    %%vegalite [dataframe] [--json] [--version='v6']

    Visualize the contents of the cell using Vega-Lite, optionally
    specifying a pandas DataFrame object to be used as the dataset.

    if --json is passed, then input is parsed as json rather than yaml.
    """
    args = magic_arguments.parse_argstring(vegalite, line)
    existing_versions = {"v6": "6"}
    version = existing_versions[args.version]
    assert version in RENDERERS["vega-lite"]
    VegaLite = RENDERERS["vega-lite"][version]
    data_transformers = TRANSFORMERS["vega-lite"][version]

    if args.json:
        spec = json.loads(cell)
    elif not find_spec("yaml"):
        try:
            spec = json.loads(cell)
        except json.JSONDecodeError as err:
            msg = (
                "%%vegalite: spec is not valid JSON. "
                "Install pyyaml to parse spec as yaml"
            )
            raise ValueError(msg) from err
    else:
        import yaml

        spec = yaml.load(cell, Loader=yaml.SafeLoader)

    if args.data is not None:
        data = _get_variable(args.data)
        spec["data"] = _prepare_data(data, data_transformers)

    return VegaLite(spec)


================================================
FILE: altair/datasets/__init__.py
================================================
"""
Load example datasets *remotely* from `vega-datasets`_.

Provides **70+** datasets, used throughout our `Example Gallery`_.

You can learn more about each dataset at `datapackage.md`_.

Examples
--------
**Primary Interface - Data Object**::

    from altair.datasets import data

    # Load with default engine (pandas)
    cars_df = data.cars()

    # Load with specific engine
    cars_polars = data.cars(engine="polars")
    cars_pyarrow = data.cars(engine="pyarrow")

    # Get URL
    cars_url = data.cars.url

    # Set default engine for all datasets
    data.set_default_engine("polars")
    movies_df = data.movies()  # Uses polars engine

    # List available datasets
    available_datasets = data.list_datasets()

**Expert Interface - Loader**::

    from altair.datasets import Loader

    load = Loader.from_backend("polars")
    load("penguins")
    load.url("penguins")

This method also provides *precise* <kbd>Tab</kbd> completions on the returned object::

    load("cars").<Tab>
    #            bottom_k
    #            drop
    #            drop_in_place
    #            drop_nans
    #            dtypes
    #            ...

**Expert Interface - Direct Functions**::

    from altair.datasets import load, url

    # Load a dataset
    cars_df = load("cars", backend="polars")

    # Get dataset URL
    cars_url = url("cars")

.. note::
   Requires installation of either `polars`_, `pandas`_, or `pyarrow`_.

.. _vega-datasets:
    https://github.com/vega/vega-datasets
.. _Example Gallery:
    https://altair-viz.github.io/gallery/index.html#example-gallery
.. _datapackage.md:
    https://github.com/vega/vega-datasets/blob/main/datapackage.md
.. _polars:
    https://docs.pola.rs/user-guide/installation/
.. _pandas:
    https://pandas.pydata.org/docs/getting_started/install.html
.. _pyarrow:
    https://arrow.apache.org/docs/python/install.html
"""

from __future__ import annotations

from typing import TYPE_CHECKING

from altair.datasets._loader import Loader

if TYPE_CHECKING:
    import sys
    from typing import Any

    if sys.version_info >= (3, 11):
        from typing import LiteralString
    else:
        from typing_extensions import LiteralString

    from altair.datasets._data import DataObject
    from altair.datasets._loader import _Load
    from altair.datasets._typing import Dataset, Extension

__all__ = ["Loader", "data", "load", "url"]


load: _Load[Any, Any]
"""
Get a remote dataset and load as tabular data.

This is an expert interface. For most users, the data object interface is recommended::

    from altair.datasets import data
    cars = data.cars(engine="polars")

For full <kbd>Tab</kbd> completions, instead use::

    from altair.datasets import Loader
    load = Loader.from_backend("polars")
    cars = load("cars")
    movies = load("movies")

Alternatively, specify ``backend`` during a call::

    from altair.datasets import load
    cars = load("cars", backend="polars")
    movies = load("movies", backend="polars")
"""

data: DataObject


def url(
    name: Dataset | LiteralString,
    suffix: Extension | None = None,
    /,
) -> str:
    """
    Return the address of a remote dataset.

    This is an expert interface. For most users, the data object interface is recommended::

        from altair.datasets import data

        cars_url = data.cars.url

    Parameters
    ----------
    name
        Name of the dataset/`Path.stem`_.
    suffix
        File extension/`Path.suffix`_.

        .. note::
            Only needed if ``name`` is available in multiple formats.

    Returns
    -------
    ``str``

    .. _Path.stem:
        https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
    .. _Path.suffix:
        https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix
    """
    from altair.datasets._exceptions import AltairDatasetsError

    try:
        from altair.datasets._loader import load

        url = load.url(name, suffix)
    except AltairDatasetsError:
        from altair.datasets._cache import csv_cache

        url = csv_cache.url(name)

    return url


if not TYPE_CHECKING:

    def __getattr__(name):
        if name == "data":
            from altair.datasets._data import data

            return data
        elif name == "load":
            from altair.datasets._loader import load

            return load
        else:
            msg = f"module {__name__!r} has no attribute {name!r}"
            raise AttributeError(msg)


================================================
FILE: altair/datasets/_cache.py
================================================
from __future__ import annotations

import os
import sys
from collections import defaultdict
from importlib.util import find_spec
from pathlib import Path
from typing import TYPE_CHECKING, ClassVar, TypeVar, cast

import narwhals.stable.v1 as nw

from altair.datasets._exceptions import AltairDatasetsError

if sys.version_info >= (3, 12):
    from typing import Protocol
else:
    from typing_extensions import Protocol

if TYPE_CHECKING:
    from collections.abc import (
        Iterable,
        Iterator,
        Mapping,
        MutableMapping,
        MutableSequence,
        Sequence,
    )
    from io import IOBase
    from typing import Any, Final, TypeAlias
    from urllib.request import OpenerDirector

    from _typeshed import StrPath
    from narwhals.stable.v1.dtypes import DType
    from narwhals.stable.v1.typing import IntoExpr

    from altair.datasets._typing import Dataset, Metadata

    if sys.version_info >= (3, 12):
        from typing import Unpack
    else:
        from typing_extensions import Unpack

    if sys.version_info >= (3, 11):
        from typing import LiteralString
    else:
        from typing_extensions import LiteralString

    from altair.datasets._typing import FlFieldStr
    from altair.vegalite.v6.schema._typing import OneOrSeq

    _Dataset: TypeAlias = "Dataset | LiteralString"
    _FlSchema: TypeAlias = Mapping[str, FlFieldStr]

__all__ = ["CsvCache", "DatasetCache", "SchemaCache", "csv_cache"]


_KT = TypeVar("_KT")
_VT = TypeVar("_VT")
_T = TypeVar("_T")

_METADATA_DIR: Final[Path] = Path(__file__).parent / "_metadata"

_DTYPE_TO_FIELD: Mapping[type[DType], FlFieldStr] = {
    nw.Int64: "integer",
    nw.Float64: "number",
    nw.Boolean: "boolean",
    nw.String: "string",
    nw.Struct: "object",
    nw.List: "array",
    nw.Date: "date",
    nw.Datetime: "datetime",
    nw.Duration: "duration",
    # nw.Time: "time" (Not Implemented, but we don't have any cases using it anyway)
}
"""
Similar to `pl.datatypes.convert.dtype_to_ffiname`_.

But using `narwhals.dtypes`_ to the string repr of ``frictionless`` `Field Types`_.

.. _pl.datatypes.convert.dtype_to_ffiname:
    https://github.com/pola-rs/polars/blob/85d078c066860e012f5e7e611558e6382b811b82/py-polars/polars/datatypes/convert.py#L139-L165
.. _Field Types:
    https://datapackage.org/standard/table-schema/#field-types
.. _narwhals.dtypes:
    https://narwhals-dev.github.io/narwhals/api-reference/dtypes/
"""

_FIELD_TO_DTYPE: Mapping[FlFieldStr, type[DType]] = {
    v: k for k, v in _DTYPE_TO_FIELD.items()
}


def _iter_metadata(df: nw.DataFrame[Any], /) -> Iterator[Metadata]:
    """
    Yield rows from ``df``, where each represents a dataset.

    See Also
    --------
    ``altair.datasets._typing.Metadata``
    """
    yield from cast("Iterator[Metadata]", df.iter_rows(named=True))


class CompressedCache(Protocol[_KT, _VT]):
    fp: Path
    _mapping: MutableMapping[_KT, _VT]

    def read(self) -> Any: ...
    def __getitem__(self, key: _KT, /) -> _VT: ...

    def __enter__(self) -> IOBase:
        import gzip

        return gzip.open(self.fp, mode="rb").__enter__()

    def __exit__(self, *args) -> None:
        return

    def get(self, key: _KT, default: _T, /) -> _VT | _T:
        return self.mapping.get(key, default)

    @property
    def mapping(self) -> MutableMapping[_KT, _VT]:
        if not self._mapping:
            self._mapping.update(self.read())
        return self._mapping


class CsvCache(CompressedCache["_Dataset", "Metadata"]):
    """
    `csv`_, `gzip`_ -based, lazy metadata lookup.

    Used as a fallback for 2 scenarios:

    1. ``url(...)`` when no optional dependencies are installed.
    2. ``(Loader|load)(...)`` when the backend is missing* ``.parquet`` support.

    Notes
    -----
    *All backends *can* support ``.parquet``, but ``pandas`` requires an optional dependency.

    .. _csv:
        https://docs.python.org/3/library/csv.html
    .. _gzip:
        https://docs.python.org/3/library/gzip.html
    """

    fp = _METADATA_DIR / "metadata.csv.gz"

    def __init__(
        self,
        *,
        tp: type[MutableMapping[_Dataset, Metadata]] = dict["_Dataset", "Metadata"],
    ) -> None:
        self._mapping: MutableMapping[_Dataset, Metadata] = tp()
        self._rotated: MutableMapping[str, MutableSequence[Any]] = defaultdict(list)

    def read(self) -> Any:
        import csv

        with self as f:
            b_lines = f.readlines()
        reader = csv.reader((bs.decode() for bs in b_lines), dialect=csv.unix_dialect)
        header = tuple(next(reader))
        return {row[0]: dict(self._convert_row(header, row)) for row in reader}

    def _convert_row(
        self, header: Iterable[str], row: Iterable[str], /
    ) -> Iterator[tuple[str, Any]]:
        map_tf = {"true": True, "false": False}
        for col, value in zip(header, row, strict=False):
            if col.startswith(("is_", "has_")):
                yield col, map_tf[value]
            elif col == "bytes":
                yield col, int(value)
            else:
                yield col, value

    @property
    def rotated(self) -> Mapping[str, Sequence[Any]]:
        """Columnar view."""
        if not self._rotated:
            for record in self.mapping.values():
                for k, v in record.items():
                    self._rotated[k].append(v)
        return self._rotated

    def __getitem__(self, key: _Dataset, /) -> Metadata:
        if meta := self.get(key, None):
            return meta
        msg = f"{key!r} does not refer to a known dataset."
        raise TypeError(msg)

    def url(self, name: _Dataset, /) -> str:
        meta = self[name]
        if meta["suffix"] == ".parquet" and not find_spec("vegafusion"):
            raise AltairDatasetsError.from_url(meta)
        return meta["url"]

    def __repr__(self) -> str:
        return f"<{type(self).__name__}: {'COLLECTED' if self._mapping else 'READY'}>"


class SchemaCache(CompressedCache["_Dataset", "_FlSchema"]):
    """
    `json`_, `gzip`_ -based, lazy schema lookup.

    - Primarily benefits ``pandas``, which needs some help identifying **temporal** columns.
    - Utilizes `data package`_ schema types.
    - All methods return falsy containers instead of exceptions

    .. _json:
        https://docs.python.org/3/library/json.html
    .. _gzip:
        https://docs.python.org/3/library/gzip.html
    .. _data package:
        https://github.com/vega/vega-datasets/pull/631
    """

    fp = _METADATA_DIR / "schemas.json.gz"

    def __init__(
        self,
        *,
        tp: type[MutableMapping[_Dataset, _FlSchema]] = dict["_Dataset", "_FlSchema"],
        implementation: nw.Implementation = nw.Implementation.UNKNOWN,
    ) -> None:
        self._mapping: MutableMapping[_Dataset, _FlSchema] = tp()
        self._implementation: nw.Implementation = implementation

    def read(self) -> Any:
        import json

        with self as f:
            return json.load(f)

    def __getitem__(self, key: _Dataset, /) -> _FlSchema:
        return self.get(key, {})

    def by_dtype(self, name: _Dataset, *dtypes: type[DType]) -> list[str]:
        """
        Return column names specfied in ``name``'s schema.

        Parameters
        ----------
        name
            Dataset name.
        *dtypes
            Optionally, only return columns matching the given data type(s).
        """
        if (match := self[name]) and dtypes:
            include = {_DTYPE_TO_FIELD[tp] for tp in dtypes}
            return [col for col, tp_str in match.items() if tp_str in include]
        else:
            return list(match)

    def is_active(self) -> bool:
        return self._implementation in {
            nw.Implementation.PANDAS,
            nw.Implementation.PYARROW,
            nw.Implementation.MODIN,
            nw.Implementation.PYARROW,
        }

    def schema(self, name: _Dataset, /) -> nw.Schema:
        it = ((col, _FIELD_TO_DTYPE[tp_str]()) for col, tp_str in self[name].items())
        return nw.Schema(it)

    def schema_kwds(self, meta: Metadata, /) -> dict[str, Any]:
        name: Any = meta["dataset_name"]
        if self.is_active() and (self[name]):
            suffix = meta["suffix"]
            if self._implementation.is_pandas_like():
                if cols := self.by_dtype(name, nw.Date, nw.Datetime):
                    if suffix == ".json":
                        return {"convert_dates": cols}
                    elif suffix in {".csv", ".tsv"}:
                        return {"parse_dates": cols}
            else:
                schema = self.schema(name).to_arrow()
                if suffix in {".csv", ".tsv"}:
                    from pyarrow.csv import ConvertOptions

                    # For pyarrow CSV reading, use the schema as intended
                    # This will fail for non-ISO date formats, but that's the correct behavior
                    # Users can handle this by using a different backend or converting dates manually
                    return {"convert_options": ConvertOptions(column_types=schema)}
                elif suffix == ".parquet":
                    return {"schema": schema}

        return {}


class _SupportsScanMetadata(Protocol):
    _opener: ClassVar[OpenerDirector]

    def _scan_metadata(
        self, *predicates: OneOrSeq[IntoExpr], **constraints: Unpack[Metadata]
    ) -> nw.LazyFrame[Any]: ...


class DatasetCache:
    """Opt-out caching of remote dataset requests."""

    _ENV_VAR: ClassVar[LiteralString] = "ALTAIR_DATASETS_DIR"
    _XDG_CACHE: ClassVar[Path] = (
        Path(os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")) / "altair"
    ).resolve()

    def __init__(self, reader: _SupportsScanMetadata, /) -> None:
        self._rd: _SupportsScanMetadata = reader

    def clear(self) -> None:
        """Delete all previously cached datasets."""
        self._ensure_active()
        if self.is_empty():
            return None
        ser = (
            self._rd._scan_metadata()
            .select("sha", "suffix")
            .unique("sha")
            .select(nw.concat_str("sha", "suffix").alias("sha_suffix"))
            .collect()
            .get_column("sha_suffix")
        )
        names = set[str](ser.to_list())
        for fp in self:
            if fp.name in names:
                fp.unlink()

    def download_all(self) -> None:
        """
        Download any missing datasets for latest version.

        Requires **30-50MB** of disk-space.
        """
        stems = tuple(fp.stem for fp in self)
        predicates = (~(nw.col("sha").is_in(stems)),) if stems else ()
        frame = (
            self._rd._scan_metadata(*predicates, is_image=False)
            .select("sha", "suffix", "url")
            .unique("sha")
            .collect()
        )
        if frame.is_empty():
            print("Already downloaded all datasets")
            return None
        print(f"Downloading {len(frame)} missing datasets...")
        for meta in _iter_metadata(frame):
            self._download_one(meta["url"], self.path_meta(meta))
        print("Finished downloads")
        return None

    def _maybe_download(self, meta: Metadata, /) -> Path:
        fp = self.path_meta(meta)
        return (
            fp
            if (fp.exists() and fp.stat().st_size)
            else self._download_one(meta["url"], fp)
        )

    def _download_one(self, url: str, fp: Path, /) -> Path:
        with self._rd._opener.open(url) as f:
            fp.touch()
            fp.write_bytes(f.read())
        return fp

    @property
    def path(self) -> Path:
        """
        Returns path to datasets cache.

        Defaults to (`XDG_CACHE_HOME`_)::

            "$XDG_CACHE_HOME/altair/"

        But can be configured using the environment variable::

            "$ALTAIR_DATASETS_DIR"

        You can set this for the current session via::

            from pathlib import Path
            from altair.datasets import load

            load.cache.path = Path.home() / ".altair_cache"

            load.cache.path.relative_to(Path.home()).as_posix()
            ".altair_cache"

        You can *later* disable caching via::

           load.cache.path = None

        .. _XDG_CACHE_HOME:
            https://specifications.freedesktop.org/basedir-spec/latest/#variables
        """
        self._ensure_active()
        fp = Path(usr) if (usr := os.environ.get(self._ENV_VAR)) else self._XDG_CACHE
        fp.mkdir(parents=True, exist_ok=True)
        return fp

    @path.setter
    def path(self, source: StrPath | None, /) -> None:
        if source is not None:
            os.environ[self._ENV_VAR] = str(Path(source).resolve())
        else:
            os.environ[self._ENV_VAR] = ""

    def path_meta(self, meta: Metadata, /) -> Path:
        return self.path / (meta["sha"] + meta["suffix"])

    def __iter__(self) -> Iterator[Path]:
        yield from self.path.iterdir()

    def __repr__(self) -> str:
        name = type(self).__name__
        if self.is_not_active():
            return f"{name}<UNSET>"
        else:
            return f"{name}<{self.path.as_posix()!r}>"

    def is_active(self) -> bool:
        return not self.is_not_active()

    def is_not_active(self) -> bool:
        return os.environ.get(self._ENV_VAR) == ""

    def is_empty(self) -> bool:
        """Cache is active, but no files are stored in ``self.path``."""
        return next(iter(self), None) is None

    def _ensure_active(self) -> None:
        if self.is_not_active():
            msg = (
                f"Cache is unset.\n"
                f"To enable dataset caching, set the environment variable:\n"
                f"    {self._ENV_VAR!r}\n\n"
                f"You can set this for the current session via:\n"
                f"    from pathlib import Path\n"
                f"    from altair.datasets import load\n\n"
                f"    load.cache.path = Path.home() / '.altair_cache'"
            )
            raise ValueError(msg)


csv_cache: CsvCache


def __getattr__(name):
    if name == "csv_cache":
        global csv_cache
        csv_cache = CsvCache()
        return csv_cache

    else:
        msg = f"module {__name__!r} has no attribute {name!r}"
        raise AttributeError(msg)


================================================
FILE: altair/datasets/_constraints.py
================================================
"""Set-like guards for matching metadata to an implementation."""

from __future__ import annotations

from collections.abc import Set
from itertools import chain
from typing import TYPE_CHECKING, Any

from narwhals.stable import v1 as nw

if TYPE_CHECKING:
    import sys
    from collections.abc import Iterable, Iterator

    from altair.datasets._typing import Metadata

    if sys.version_info >= (3, 12):
        from typing import Unpack
    else:
        from typing_extensions import Unpack
    from typing import TypeAlias

__all__ = [
    "Items",
    "MetaIs",
    "is_arrow",
    "is_csv",
    "is_json",
    "is_meta",
    "is_not_tabular",
    "is_parquet",
    "is_spatial",
    "is_topo",
    "is_tsv",
]

Items: TypeAlias = Set[tuple[str, Any]]


class MetaIs(Set[tuple[str, Any]]):
    _requires: frozenset[tuple[str, Any]]

    def __init__(self, kwds: frozenset[tuple[str, Any]], /) -> None:
        object.__setattr__(self, "_requires", kwds)

    @classmethod
    def from_metadata(cls, meta: Metadata, /) -> MetaIs:
        return cls(frozenset(meta.items()))

    def to_metadata(self) -> Metadata:
        if TYPE_CHECKING:

            def collect(**kwds: Unpack[Metadata]) -> Metadata:
                return kwds

            return collect(**dict(self))
        return dict(self)

    def to_expr(self) -> nw.Expr:
        """Convert constraint into a narwhals expression."""
        if not self:
            msg = f"Unable to convert an empty set to an expression:\n\n{self!r}"
            raise TypeError(msg)
        return nw.all_horizontal(nw.col(name) == val for name, val in self)

    def isdisjoint(self, other: Iterable[Any]) -> bool:
        return super().isdisjoint(other)

    def issubset(self, other: Iterable[Any]) -> bool:
        return self._requires.issubset(other)

    def __call__(self, meta: Items, /) -> bool:
        return self._requires <= meta

    def __hash__(self) -> int:
        return hash(self._requires)

    def __contains__(self, x: object) -> bool:
        return self._requires.__contains__(x)

    def __iter__(self) -> Iterator[tuple[str, Any]]:
        yield from self._requires

    def __len__(self) -> int:
        return self._requires.__len__()

    def __setattr__(self, name: str, value: Any):
        msg = (
            f"{type(self).__name__!r} is immutable.\n"
            f"Could not assign self.{name} = {value}"
        )
        raise TypeError(msg)

    def __repr__(self) -> str:
        items = dict(self)
        if not items:
            contents = "<placeholder>"
        elif suffix := items.pop("suffix", None):
            contents = ", ".join(
                chain([f"'*{suffix}'"], (f"{k}={v!r}" for k, v in items.items()))
            )
        else:
            contents = ", ".join(f"{k}={v!r}" for k, v in items.items())
        return f"is_meta({contents})"


def is_meta(**kwds: Unpack[Metadata]) -> MetaIs:
    return MetaIs.from_metadata(kwds)


is_csv = is_meta(suffix=".csv")
is_json = is_meta(suffix=".json")
is_tsv = is_meta(suffix=".tsv")
is_arrow = is_meta(suffix=".arrow")
is_parquet = is_meta(suffix=".parquet")
is_spatial = is_meta(is_spatial=True)
is_topo = is_meta(is_topo=True)
is_not_tabular = is_meta(is_tabular=False)


================================================
FILE: altair/datasets/_data.py
================================================
"""
Data object interface for Altair datasets.

This module provides a `data` object that allows accessing datasets as attributes
and calling them with backend options, similar to the vega_datasets interface.
"""

from __future__ import annotations

import typing as t

from altair.datasets._loader import Loader

if t.TYPE_CHECKING:
    from typing_extensions import LiteralString

    import pandas as pd
    import polars as pl
    import pyarrow as pa

    from altair.datasets._reader import _Backend
    from altair.datasets._typing import Dataset


class DatasetAccessor:
    """
    Accessor for individual datasets that can be called with backend options.

    This object provides access to a specific dataset with support for
    different backends and autocompletion.

    Call this object to load the dataset:
        dataset_accessor(engine="polars", **kwds)

    Parameters for __call__:
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}, optional
            The backend to use for loading the dataset.
        **kwds : Any
            Additional arguments passed to the loader.

    Examples
    --------
    >>> from altair.datasets import data
    >>>
    >>> # Load with default backend
    >>> cars_df = data.cars()
    >>>
    >>> # Load with specific backend
    >>> cars_polars = data.cars(engine="polars")
    >>> cars_pandas = data.cars(engine="pandas")
    >>> # Note: pandas[pyarrow] backend requires pyarrow package
    >>>
    >>> # Get URL
    >>> url = data.cars.url
    >>>
    >>> # Use explicit load method
    >>> cars_df = data.cars.load(engine="polars")
    """

    def __init__(self, name: Dataset, backend: _Backend = "pandas") -> None:
        import inspect

        self._name: Dataset = name
        self._backend: _Backend = backend
        self._prev_loader: Loader[t.Any, t.Any]
        self.__signature__ = inspect.signature(self._call_impl)

        docstring = f"""Load the '{name}' dataset.

Parameters
----------
engine : {{"polars", "pandas", "pandas[pyarrow]", "pyarrow"}}, optional
    The backend to use for loading the dataset.
**kwds : Any
    Additional arguments passed to the loader.

Returns
-------
DataFrame or Table
    The loaded dataset.

Examples
--------
>>> data.{name}()  # Load with default backend
>>> data.{name}(engine="polars")  # Load with specific backend
>>> data.{name}.url  # Get dataset URL
>>> data.{name}.load(engine="polars")  # Explicit load method
"""

        self.__doc__ = docstring

    def _call_impl(
        self,
        *,
        engine: _Backend | None = None,
        **kwds: t.Any,
    ) -> t.Any:
        load = Loader.from_backend(engine) if engine else self._loader
        return load(self._name, **kwds)

    @property
    def _loader(self) -> Loader[t.Any, t.Any]:
        if hasattr(self, "_prev_loader"):
            return self._prev_loader
        self._prev_loader = Loader.from_backend(self._backend)
        return self._prev_loader

    @_loader.setter
    def _loader(self, value: Loader[t.Any, t.Any]) -> None:
        self._prev_loader = value

    @property
    def url(self) -> str:
        """
        Get the URL for this dataset.

        Returns
        -------
        str
            The URL of the dataset.

        Examples
        --------
        >>> from altair.datasets import data
        >>> cars_url = data.cars.url
        >>> print(cars_url)
        https://cdn.jsdelivr.net/npm/vega-datasets@v3.2.1/data/cars.json
        """
        return self._loader.url(self._name)

    def load(self, *, engine: _Backend | None = None, **kwds: t.Any) -> t.Any:
        """
        Load the dataset with the specified engine.

        This method provides the same functionality as calling the accessor directly,
        but with more explicit parameter autocompletion in some IDEs.

        Parameters
        ----------
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}, optional
            The backend to use for loading the dataset.
        **kwds : Any
            Additional arguments passed to the loader.

        Returns
        -------
        DataFrame or Table
            The loaded dataset.

        Examples
        --------
        >>> from altair.datasets import data
        >>> cars_df = data.cars.load(engine="polars")
        >>> movies_df = data.movies.load(engine="pandas")
        """
        return self._call_impl(engine=engine, **kwds)

    def __repr__(self) -> str:
        return f"DatasetAccessor('{self._name}', default_engine='{self._backend}')"

    @t.overload
    def __call__(
        self,
        *,
        engine: t.Literal["polars"],
        **kwds: t.Any,
    ) -> pl.DataFrame: ...

    @t.overload
    def __call__(
        self,
        *,
        engine: t.Literal["pandas", "pandas[pyarrow]"],
        **kwds: t.Any,
    ) -> pd.DataFrame: ...

    @t.overload
    def __call__(
        self,
        *,
        engine: t.Literal["pyarrow"],
        **kwds: t.Any,
    ) -> pa.Table: ...

    @t.overload
    def __call__(
        self,
        *,
        engine: _Backend | None = None,
        **kwds: t.Any,
    ) -> t.Any: ...

    def __call__(
        self,
        *,
        engine: _Backend | None = None,
        **kwds: t.Any,
    ) -> t.Any:
        """
        Load the dataset with the specified engine.

        Parameters
        ----------
        engine : {{"polars", "pandas", "pandas[pyarrow]", "pyarrow"}}, optional
            The backend to use for loading the dataset.
        **kwds
            Additional arguments passed to the loader.

        Returns
        -------
        The loaded dataset as a DataFrame/Table from the specified engine.

        Examples
        --------
        >>> from altair.datasets import data
        >>>
        >>> # Load with default engine
        >>> df = data.cars()
        >>>
        >>> # Load with specific engine
        >>> df = data.cars(engine="polars")
        """
        return self._call_impl(engine=engine, **kwds)


class DataObject:
    """
    Main data object that provides access to all datasets as attributes.

    This is the primary interface for loading Altair datasets. It provides
    a simple, intuitive way to access datasets with autocompletion support.

    Examples
    --------
    >>> from altair.datasets import data
    >>>
    >>> # Access datasets as attributes with autocompletion
    >>> cars_df = data.cars()
    >>> movies_df = data.movies(engine="pandas")
    >>>
    >>> # Get URLs
    >>> cars_url = data.cars.url
    >>> movies_url = data.movies.url
    >>>
    >>> # Set default engine for all datasets
    >>> data.set_default_engine("polars")
    >>> penguins_df = data.penguins()  # Uses polars engine
    >>>
    >>> # List available datasets
    >>> available_datasets = data.list_datasets()
    >>> print(f"Available datasets: {len(available_datasets)}")
    Available datasets: 72
    """

    def __init__(self, backend: _Backend = "pandas") -> None:
        self._backend: _Backend = backend
        self._accessors: dict[Dataset, DatasetAccessor] = {}
        self._dataset_names: list[Dataset | LiteralString] | None = None

    def _get_dataset_names(self) -> list[Dataset | LiteralString]:
        """Get the list of available dataset names from metadata."""
        if self._dataset_names is None:
            try:
                from altair.datasets._cache import CsvCache

                cache = CsvCache()
                self._dataset_names = list(cache.mapping.keys())
            except Exception:
                # Fallback if metadata is not available
                self._dataset_names = []
        return self._dataset_names

    def __dir__(self) -> list[str]:
        """Return list of available attributes for autocompletion."""
        standard_attrs = list(super().__dir__())
        dataset_names = self._get_dataset_names()
        return standard_attrs + dataset_names

    def __getattr__(self, name: Dataset) -> DatasetAccessor:  # type: ignore[misc]
        dataset_names = self._get_dataset_names()
        if name not in dataset_names:
            available_datasets = dataset_names[:10]
            error_msg = (
                f"Dataset '{name}' not found. Available datasets: {available_datasets}"
            )
            raise AttributeError(error_msg)

        self._accessors[name] = DatasetAccessor(name, self._backend)
        return self._accessors[name]

    def set_default_engine(self, engine: _Backend) -> None:
        """
        Set the default engine for all datasets.

        Parameters
        ----------
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}
            The backend to use as default for all datasets.

        Examples
        --------
        >>> from altair.datasets import data
        >>> data.set_default_engine("polars")
        >>> # Now all datasets will use polars by default
        >>> cars_df = data.cars()  # Uses polars
        >>> movies_df = data.movies()  # Uses polars
        """
        self._backend = engine
        # Clear cached accessors so they use the new default
        self._accessors.clear()

    def list_datasets(self) -> list[Dataset | LiteralString]:
        """
        Get a list of all available dataset names.

        Returns
        -------
        list[str]
            List of available dataset names.

        Examples
        --------
        >>> from altair.datasets import data
        >>> datasets = data.list_datasets()
        >>> print(f"Available datasets: {len(datasets)}")
        Available datasets: 72
        >>> print(datasets[:5])  # First 5 datasets
        ['airports', 'annual_precip', 'anscombe', 'barley', 'birdstrikes']
        """
        return self._get_dataset_names()

    def get_default_engine(self) -> _Backend:
        """
        Get the current default engine.

        Returns
        -------
        str
            The current default engine.

        Examples
        --------
        >>> from altair.datasets import data
        >>> data.set_default_engine("pandas")
        >>> print(data.get_default_engine())
        pandas
        >>> data.set_default_engine("polars")
        >>> print(data.get_default_engine())
        polars
        """
        return self._backend

    def __repr__(self) -> str:
        dataset_count = len(self._get_dataset_names())
        return f"AltairDataObject(default_engine='{self._backend}', datasets={dataset_count})"


data = DataObject()


================================================
FILE: altair/datasets/_exceptions.py
================================================
from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from collections.abc import Sequence

    from altair.datasets._reader import _Backend
    from altair.datasets._typing import Metadata


class AltairDatasetsError(Exception):
    @classmethod
    def from_url(cls, meta: Metadata, /) -> AltairDatasetsError:
        if meta["suffix"] == ".parquet":
            msg = (
                f"{_failed_url(meta)}"
                f"{meta['suffix']!r} datasets require `vegafusion`.\n"
                "See upstream issue for details: https://github.com/vega/vega/issues/3961"
            )
        else:
            msg = (
                f"{cls.from_url.__qualname__}() called for "
                f"unimplemented extension: {meta['suffix']}\n\n{meta!r}"
            )
            raise NotImplementedError(msg)
        return cls(msg)

    @classmethod
    def from_tabular(cls, meta: Metadata, backend_name: str, /) -> AltairDatasetsError:
        if meta["is_image"]:
            reason = "Image data is non-tabular."
            return cls(f"{_failed_tabular(meta)}{reason}{_suggest_url(meta)}")
        elif not meta["is_tabular"] or meta["suffix"] in {".arrow", ".parquet"}:
            if meta["suffix"] in {".arrow", ".parquet"}:
                install: tuple[str, ...] = "pyarrow", "polars"
                what = f"{meta['suffix']!r}"
            else:
                install = ("polars",)
                if meta["is_spatial"]:
                    what = "Geospatial data"
                elif meta["is_json"]:
                    what = "Non-tabular json"
                else:
                    what = f"{meta['file_name']!r}"
            reason = _why(what, backend_name)
            return cls(f"{_failed_tabular(meta)}{reason}{_suggest_url(meta, *install)}")
        else:
            return cls(_implementation_not_found(meta))

    @classmethod
    def from_priority(cls, priority: Sequence[_Backend], /) -> AltairDatasetsError:
        msg = f"Found no supported backend, searched:\n{priority!r}"
        return cls(msg)


def module_not_found(
    backend_name: str, reqs: Sequence[str], missing: str
) -> ModuleNotFoundError:
    if len(reqs) == 1:
        depends = f"{reqs[0]!r} package"
    else:
        depends = ", ".join(f"{req!r}" for req in reqs) + " packages"
    msg = (
        f"Backend {backend_name!r} requires the {depends}, but {missing!r} could not be found.\n"
        f"This can be installed with pip using:\n"
        f"    pip install {missing}\n"
        f"Or with conda using:\n"
        f"    conda install -c conda-forge {missing}"
    )
    return ModuleNotFoundError(msg, name=missing)


def _failed_url(meta: Metadata, /) -> str:
    return f"Unable to load {meta['file_name']!r} via url.\n"


def _failed_tabular(meta: Metadata, /) -> str:
    return f"Unable to load {meta['file_name']!r} as tabular data.\n"


def _why(what: str, backend_name: str, /) -> str:
    return f"{what} is not supported natively by {backend_name!r}."


def _suggest_url(meta: Metadata, *install_other: str) -> str:
    other = ""
    if install_other:
        others = " or ".join(f"`{other}`" for other in install_other)
        other = f" installing {others}, or use"
    return (
        f"\n\nInstead, try{other}:\n"
        "    from altair.datasets import data\n"
        f"    data.{meta['dataset_name']}.url"
    )


def _implementation_not_found(meta: Metadata, /) -> str:
    """Search finished without finding a *declared* incompatibility."""
    INDENT = " " * 4
    record = f",\n{INDENT}".join(
        f"{k}={v!r}"
        for k, v in meta.items()
        if not (k.startswith(("is_", "sha", "bytes", "has_")))
        or (v is True and k.startswith("is_"))
    )
    return f"Found no implementation that supports:\n{INDENT}{record}"


================================================
FILE: altair/datasets/_loader.py
================================================
from __future__ import annotations

import typing as t
from typing import Generic, final, overload

from altair.datasets import _reader
from altair.datasets._reader import IntoDataFrameT, IntoLazyFrameT

if t.TYPE_CHECKING:
    import sys
    from typing import Any, Literal

    import pandas as pd
    import polars as pl
    import pyarrow as pa

    from altair.datasets._cache import DatasetCache
    from altair.datasets._reader import Reader

    if sys.version_info >= (3, 11):
        from typing import LiteralString, Self
    else:
        from typing_extensions import LiteralString, Self
    from altair.datasets._reader import _Backend
    from altair.datasets._typing import Dataset, Extension


__all__ = ["Loader", "load"]


class Loader(Generic[IntoDataFrameT, IntoLazyFrameT]):
    """
    Load example datasets *remotely* from `vega-datasets`_, with caching.

    A new ``Loader`` must be initialized by specifying a backend::

        from altair.datasets import Loader

        load = Loader.from_backend("polars")
        load
        Loader[polars]

    .. _vega-datasets:
        https://github.com/vega/vega-datasets
    """

    _reader: Reader[IntoDataFrameT, IntoLazyFrameT]

    @overload
    @classmethod
    def from_backend(
        cls, backend_name: Literal["polars"] = ..., /
    ) -> Loader[pl.DataFrame, pl.LazyFrame]: ...

    @overload
    @classmethod
    def from_backend(
        cls, backend_name: Literal["pandas", "pandas[pyarrow]"], /
    ) -> Loader[pd.DataFrame]: ...

    @overload
    @classmethod
    def from_backend(cls, backend_name: Literal["pyarrow"], /) -> Loader[pa.Table]: ...

    @classmethod
    def from_backend(
        cls: type[Loader[Any, Any]], backend_name: _Backend = "polars", /
    ) -> Loader[Any, Any]:
        """
        Initialize a new loader, with the specified backend.

        Parameters
        ----------
        backend_name
            DataFrame package/config used to return data.

            * *polars*: Using `polars defaults`_
            * *pandas*: Using `pandas defaults`_.
            * *pandas[pyarrow]*: Using ``dtype_backend="pyarrow"``
            * *pyarrow*: (*Experimental*)

            .. warning::
                Most datasets use a `JSON format not supported`_ by ``pyarrow``

        Examples
        --------
        Using ``polars``::

            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            cars = load("cars")

            type(cars)
            polars.dataframe.frame.DataFrame

        Using ``pandas``::

            load = Loader.from_backend("pandas")
            cars = load("cars")

            type(cars)
            pandas.core.frame.DataFrame

        Using ``pandas``, backed by ``pyarrow`` dtypes::

            load = Loader.from_backend("pandas[pyarrow]")
            co2 = load("co2")

            type(co2)
            pandas.core.frame.DataFrame

            co2.dtypes
            Date             datetime64[ns]
            CO2             double[pyarrow]
            adjusted CO2    double[pyarrow]
            dtype: object

        .. _polars defaults:
            https://docs.pola.rs/api/python/stable/reference/io.html
        .. _pandas defaults:
            https://pandas.pydata.org/docs/reference/io.html
        .. _JSON format not supported:
            https://arrow.apache.org/docs/python/json.html#reading-json-files
        """
        return cls.from_reader(_reader._from_backend(backend_name))

    @classmethod
    def from_reader(cls, reader: Reader[IntoDataFrameT, IntoLazyFrameT], /) -> Self:
        obj = cls.__new__(cls)
        obj._reader = reader
        return obj

    def __call__(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = None,
        /,
        **kwds: Any,
    ) -> IntoDataFrameT:
        """
        Get a remote dataset and load as tabular data.

        Parameters
        ----------
        name
            Name of the dataset/`Path.stem`_.
        suffix
            File extension/`Path.suffix`_.

            .. note::
                Only needed if ``name`` is available in multiple formats.
        **kwds
            Arguments passed to the underlying read function.

        Examples
        --------
        Using ``polars``::

            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            source = load("iowa_electricity")

            source.columns
            ['year', 'source', 'net_generation']

            source.head(5)
            shape: (5, 3)
            ┌────────────┬──────────────┬────────────────┐
            │ year       ┆ source       ┆ net_generation │
            │ ---        ┆ ---          ┆ ---            │
            │ date       ┆ str          ┆ i64            │
            ╞════════════╪══════════════╪════════════════╡
            │ 2001-01-01 ┆ Fossil Fuels ┆ 35361          │
            │ 2002-01-01 ┆ Fossil Fuels ┆ 35991          │
            │ 2003-01-01 ┆ Fossil Fuels ┆ 36234          │
            │ 2004-01-01 ┆ Fossil Fuels ┆ 36205          │
            │ 2005-01-01 ┆ Fossil Fuels ┆ 36883          │
            └────────────┴──────────────┴────────────────┘

        Using ``pandas``::

            load = Loader.from_backend("pandas")
            source = load("iowa_electricity")

            source.columns
            Index(['year', 'source', 'net_generation'], dtype='object')

            source.head(5)
                    year        source  net_generation
            0 2001-01-01  Fossil Fuels           35361
            1 2002-01-01  Fossil Fuels           35991
            2 2003-01-01  Fossil Fuels           36234
            3 2004-01-01  Fossil Fuels           36205
            4 2005-01-01  Fossil Fuels           36883

        Using ``pyarrow``::

            load = Loader.from_backend("pyarrow")
            source = load("iowa_electricity")

            source.column_names
            ['year', 'source', 'net_generation']

            source.slice(0, 5)
            pyarrow.Table
            year: date32[day]
            source: string
            net_generation: int64
            ----
            year: [[2001-01-01,2002-01-01,2003-01-01,2004-01-01,2005-01-01]]
            source: [["Fossil Fuels","Fossil Fuels","Fossil Fuels","Fossil Fuels","Fossil Fuels"]]
            net_generation: [[35361,35991,36234,36205,36883]]

        .. _Path.stem:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
        .. _Path.suffix:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix
        """
        return self._reader.dataset(name, suffix, **kwds)

    def url(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = None,
        /,
    ) -> str:
        """
        Return the address of a remote dataset.

        Parameters
        ----------
        name
            Name of the dataset/`Path.stem`_.
        suffix
            File extension/`Path.suffix`_.

            .. note::
                Only needed if ``name`` is available in multiple formats.

        .. _Path.stem:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
        .. _Path.suffix:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix

        Examples
        --------
        The returned url will always point to an accessible dataset::

            import altair as alt
            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            load.url("cars")
            "https://cdn.jsdelivr.net/npm/vega-datasets@v2.11.0/data/cars.json"

        We can pass the result directly to a chart::

            url = load.url("cars")
            alt.Chart(url).mark_point().encode(x="Horsepower:Q", y="Miles_per_Gallon:Q")
        """
        return self._reader.url(name, suffix)

    @property
    def cache(self) -> DatasetCache:
        """
        Caching of remote dataset requests.

        Configure cache path::

            self.cache.path = "..."

        Download the latest datasets *ahead-of-time*::

            self.cache.download_all()

        Remove all downloaded datasets::

            self.cache.clear()

        Disable caching::

            self.cache.path = None
        """
        return self._reader.cache

    def __repr__(self) -> str:
        return f"{type(self).__name__}[{self._reader._name}]"


@final
class _Load(Loader[IntoDataFrameT, IntoLazyFrameT]):
    @overload
    def __call__(  # pyright: ignore[reportOverlappingOverload]
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = ...,
        /,
        backend: None = ...,
        **kwds: Any,
    ) -> IntoDataFrameT: ...
    @overload
    def __call__(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = ...,
        /,
        backend: Literal["polars"] = ...,
        **kwds: Any,
    ) -> pl.DataFrame: ...
    @overload
    def __call__(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = ...,
        /,
        backend: Literal["pandas", "pandas[pyarrow]"] = ...,
        **kwds: Any,
    ) -> pd.DataFrame: ...
    @overload
    def __call__(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = ...,
        /,
        backend: Literal["pyarrow"] = ...,
        **kwds: Any,
    ) -> pa.Table: ...
    def __call__(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = None,
        /,
        backend: _Backend | None = None,
        **kwds: Any,
    ) -> IntoDataFrameT | pl.DataFrame | pd.DataFrame | pa.Table:
        if backend is None:
            return super().__call__(name, suffix, **kwds)
        else:
            return self.from_backend(backend)(name, suffix, **kwds)


load: _Load[Any, Any]


def __getattr__(name):
    if name == "load":
        reader = _reader.infer_backend()
        global load
        load = _Load.from_reader(reader)
        return load
    else:
        msg = f"module {__name__!r} has no attribute {name!r}"
        raise AttributeError(msg)


================================================
FILE: altair/datasets/_reader.py
================================================
"""
Backend for ``alt.datasets.Loader``.

Notes
-----
Extending would be more ergonomic if `read`, `scan`, `_constraints` were available under a single export::

    from altair.datasets import ext, reader
    import polars as pl

    impls = (
        ext.read(pl.read_parquet, ext.is_parquet),
        ext.read(pl.read_csv, ext.is_csv),
        ext.read(pl.read_json, ext.is_json),
    )
    user_reader = reader(impls)
    user_reader.dataset("airports")
"""

from __future__ import annotations

from collections import Counter
from collections.abc import Mapping
from importlib import import_module
from importlib.util import find_spec
from itertools import chain
from pathlib import Path
from typing import TYPE_CHECKING, Any, ClassVar, Generic, Literal, overload
from urllib.request import build_opener as _build_opener

from narwhals.stable import v1 as nw
from packaging.requirements import Requirement

from altair.datasets import _readimpl
from altair.datasets._cache import CsvCache, DatasetCache, SchemaCache, _iter_metadata
from altair.datasets._constraints import is_parquet
from altair.datasets._exceptions import AltairDatasetsError, module_not_found
from altair.datasets._readimpl import IntoDataFrameT, IntoLazyFrameT, is_available

if TYPE_CHECKING:
    import sys
    from collections.abc import Callable, Sequence
    from urllib.request import OpenerDirector

    import pandas as pd
    import polars as pl
    import pyarrow as pa
    from narwhals.stable.v1.typing import IntoExpr

    from altair.datasets._readimpl import BaseImpl, R, Read, Scan
    from altair.datasets._typing import Dataset, Extension, Metadata
    from altair.vegalite.v6.schema._typing import OneOrSeq

    if sys.version_info >= (3, 13):
        from typing import TypeIs, TypeVar
    else:
        from typing_extensions import TypeIs, TypeVar
    if sys.version_info >= (3, 12):
        from typing import Unpack
    else:
        from typing_extensions import Unpack
    if sys.version_info >= (3, 11):
        from typing import LiteralString
    else:
        from typing_extensions import LiteralString
    from typing import TypeAlias

    _Polars: TypeAlias = Literal["polars"]
    _Pandas: TypeAlias = Literal["pandas"]
    _PyArrow: TypeAlias = Literal["pyarrow"]
    _PandasAny: TypeAlias = Literal[_Pandas, "pandas[pyarrow]"]
    _Backend: TypeAlias = Literal[_Polars, _PandasAny, _PyArrow]
    _CuDF: TypeAlias = Literal["cudf"]
    _Dask: TypeAlias = Literal["dask"]
    _DuckDB: TypeAlias = Literal["duckdb"]
    _Ibis: TypeAlias = Literal["ibis"]
    _PySpark: TypeAlias = Literal["pyspark"]
    _NwSupport: TypeAlias = Literal[
        _Polars, _Pandas, _PyArrow, _CuDF, _Dask, _DuckDB, _Ibis, _PySpark
    ]
    _NwSupportT = TypeVar(
        "_NwSupportT",
        _Polars,
        _Pandas,
        _PyArrow,
        _CuDF,
        _Dask,
        _DuckDB,
        _Ibis,
        _PySpark,
    )
    _EagerAllowedImpl: TypeAlias = Literal[
        nw.Implementation.PANDAS,
        nw.Implementation.POLARS,
        nw.Implementation.PYARROW,
    ]
    _EagerAllowed: TypeAlias = Literal[_Pandas, _Polars, _PyArrow]

_SupportProfile: TypeAlias = Mapping[
    Literal["supported", "unsupported"], "Sequence[Dataset]"
]
"""
Dataset support varies between backends and available dependencies.

Any name listed in ``"unsupported"`` will raise an error on::

    from altair.datasets import load

    load("7zip")

Instead, they can be loaded via::

    import altair as alt
    from altair.datasets import url

    alt.Chart(url("7zip"))
"""


class Reader(Generic[IntoDataFrameT, IntoLazyFrameT]):
    """
    Modular file reader, targeting remote & local tabular resources.

    .. warning::
        Use ``reader(...)`` instead of instantiating ``Reader`` directly.
    """

    _read: Sequence[Read[IntoDataFrameT]]
    """Eager file read functions."""

    _scan: Sequence[Scan[IntoLazyFrameT]]
    """Lazy file read functions."""

    _name: str
    """
    Used in error messages, repr and matching ``@overload``(s).

    Otherwise, has no concrete meaning.
    """

    _implementation: _EagerAllowedImpl
    """
    Corresponding `narwhals implementation`_.

    .. _narwhals implementation:
        https://github.com/narwhals-dev/narwhals/blob/9b6a355530ea46c590d5a6d1d0567be59c0b5742/narwhals/utils.py#L61-L290
    """

    _opener: ClassVar[OpenerDirector] = _build_opener()
    _metadata_path: ClassVar[Path] = (
        Path(__file__).parent / "_metadata" / "metadata.parquet"
    )

    def __init__(
        self,
        read: Sequence[Read[IntoDataFrameT]],
        scan: Sequence[Scan[IntoLazyFrameT]],
        name: str,
        implementation: _EagerAllowedImpl,
    ) -> None:
        self._read = read
        self._scan = scan
        self._name = name
        self._implementation = implementation
        self._schema_cache = SchemaCache(implementation=implementation)

    def __repr__(self) -> str:
        from textwrap import indent

        PREFIX = " " * 4
        NL = "\n"
        body = f"read\n{indent(NL.join(str(el) for el in self._read), PREFIX)}"
        if self._scan:
            body += f"\nscan\n{indent(NL.join(str(el) for el in self._scan), PREFIX)}"
        return f"Reader[{self._name}] {self._implementation!r}\n{body}"

    def read_fn(self, meta: Metadata, /) -> Callable[..., IntoDataFrameT]:
        return self._solve(meta, self._read)

    def scan_fn(self, meta: Metadata | Path | str, /) -> Callable[..., IntoLazyFrameT]:
        meta = meta if isinstance(meta, Mapping) else {"suffix": _into_suffix(meta)}
        return self._solve(meta, self._scan)

    @property
    def cache(self) -> DatasetCache:
        return DatasetCache(self)

    def _handle_pyarrow_date_error(self, e: Exception, name: str) -> None:
        """Handle PyArrow date parsing errors with informative error messages, see https://github.com/apache/arrow/issues/41488."""
        if "CSV conversion error to date" in str(e) and "pyarrow" in str(
            type(e).__module__
        ):
            message = (
                f"PyArrow cannot parse date format in dataset '{name}'. "
                f"This is a known limitation of PyArrow's CSV reader for non-ISO date formats.\n\n"
                f"Alternatives:\n"
                f"1. Use a different backend: data.{name}(engine='pandas') or data.{name}(engine='polars')\n"
                f"2. Convert dates manually after loading as strings\n\n"
                f"Original error: {e}"
            )
            raise AltairDatasetsError(message) from e
        raise e

    def dataset(
        self,
        name: Dataset | LiteralString,
        suffix: Extension | None = None,
        /,
        **kwds: Any,
    ) -> IntoDataFrameT:
        frame = self._query(name, suffix)
        meta = next(_iter_metadata(frame))
        fn = self.read_fn(meta)
        fn_kwds = self._merge_kwds(meta, kwds)
        if self.cache.is_active():
            fp = self.cache._maybe_download(meta)
            try:
                return fn(fp, **fn_kwds)
            except Exception as e:
                self._handle_pyarrow_date_error(e, name)
                raise
        else:
            with self._opener.open(meta["url"]) as f:
                try:
                    return fn(f, **fn_kwds)
                except Exception as e:
                    self._handle_pyarrow_date_error(e, name)
                    raise

    def url(
        self, name: Dataset | LiteralString, suffix: Extension | None = None, /
    ) -> str:
        frame = self._query(name, suffix)
        meta = next(_iter_metadata(frame))
        if is_parquet(meta.items()) and not is_available("vegafusion"):
            raise AltairDatasetsError.from_url(meta)
        url = meta["url"]
        if isinstance(url, str):
            return url
        else:
            msg = f"Expected 'str' but got {type(url).__name__!r}\nfrom {url!r}."
            raise TypeError(msg)

    # TODO: (Multiple)
    # - Settle on a better name
    # - Add method to `Loader`
    # - Move docs to `Loader.{new name}`
    def open_markdown(self, name: Dataset, /) -> None:
        """
        Learn more about a dataset, opening `vega-datasets/datapackage.md`_ with the default browser.

        Additional info *may* include: `description`_, `schema`_, `sources`_, `licenses`_.

        .. _vega-datasets/datapackage.md:
            https://github.com/vega/vega-datasets/blob/main/datapackage.md
        .. _description:
            https://datapackage.org/standard/data-resource/#description
        .. _schema:
            https://datapackage.org/standard/table-schema/#schema
        .. _sources:
            https://datapackage.org/standard/data-package/#sources
        .. _licenses:
            https://datapackage.org/standard/data-package/#licenses
        """
        import webbrowser

        from altair.utils import VERSIONS

        ref = self._query(name).get_column("file_name").item(0).replace(".", "")
        tag = VERSIONS["vega-datasets"]
        url = f"https://github.com/vega/vega-datasets/blob/v{tag}/datapackage.md#{ref}"
        webbrowser.open(url)

    @overload
    def profile(self, *, show: Literal[False] = ...) -> _SupportProfile: ...

    @overload
    def profile(self, *, show: Literal[True]) -> None: ...

    def profile(self, *, show: bool = False) -> _SupportProfile | None:
        """
        Describe which datasets can be loaded as tabular data.

        Parameters
        ----------
        show
            Print a densely formatted repr *instead of* returning a mapping.
        """
        relevant_columns = set(
            chain.from_iterable(impl._relevant_columns for impl in self._read)
        )
        frame = self._scan_metadata().select("dataset_name", *relevant_columns)
        inc_expr = nw.any_horizontal(impl._include_expr for impl in self._read)
        result: _SupportProfile = {
            "unsupported": _dataset_names(frame, ~inc_expr),
            "supported": _dataset_names(frame, inc_expr),
        }
        if show:
            import pprint

            pprint.pprint(result, compact=True, sort_dicts=False)
            return None
        return result

    def _query(
        self, name: Dataset | LiteralString, suffix: Extension | None = None, /
    ) -> nw.DataFrame[IntoDataFrameT]:
        """
        Query a tabular version of `vega-datasets/datapackage.json`_.

        Applies a filter, erroring out when no results would be returned.

        .. _vega-datasets/datapackage.json:
            https://github.com/vega/vega-datasets/blob/main/datapackage.json
        """
        constraints = _into_constraints(name, suffix)
        frame = self._scan_metadata(**constraints).collect()
        if not frame.is_empty():
            return frame
        else:
            msg = f"Found no results for:\n    {constraints!r}"
            raise ValueError(msg)

    def _merge_kwds(self, meta: Metadata, kwds: dict[str, Any], /) -> Mapping[str, Any]:
        """
        Extend user-provided arguments with dataset & library-specfic defaults.

        .. important:: User-provided arguments have a higher precedence.
        """
        if self._schema_cache.is_active() and (
            schema := self._schema_cache.schema_kwds(meta)
        ):
            kwds = schema | kwds if kwds else schema
        return kwds

    @property
    def _metadata_frame(self) -> nw.LazyFrame[IntoLazyFrameT]:
        fp = self._metadata_path
        return nw.from_native(self.scan_fn(fp)(fp)).lazy()

    def _scan_metadata(
        self, *predicates: OneOrSeq[IntoExpr], **constraints: Unpack[Metadata]
    ) -> nw.LazyFrame[IntoLazyFrameT]:
        if predicates or constraints:
            return self._metadata_frame.filter(*predicates, **constraints)
        return self._metadata_frame

    def _solve(
        self, meta: Metadata, impls: Sequence[BaseImpl[R]], /
    ) -> Callable[..., R]:
        """
        Return the first function that satisfies dataset constraints.

        See Also
        --------
        ``altair.datasets._readimpl.BaseImpl.unwrap_or_skip``
        """
        items = meta.items()
        it = (some for impl in impls if (some := impl.unwrap_or_skip(items)))
        if fn_or_err := next(it, None):
            if _is_err(fn_or_err):
                raise fn_or_err.from_tabular(meta, self._name)
            return fn_or_err
        raise AltairDatasetsError.from_tabular(meta, self._name)


def _dataset_names(
    frame: nw.LazyFrame, *predicates: OneOrSeq[IntoExpr]
) -> Sequence[Dataset]:
    # NOTE: helper function for `Reader.profile`
    return (
        frame.filter(*predicates)
        .select("dataset_name")
        .collect()
        .get_column("dataset_name")
        .to_list()
    )


class _NoParquetReader(Reader[IntoDataFrameT]):
    def __repr__(self) -> str:
        return f"{super().__repr__()}\ncsv_cache\n    {self.csv_cache!r}"

    @property
    def csv_cache(self) -> CsvCache:
        if not hasattr(self, "_csv_cache"):
            self._csv_cache = CsvCache()
        return self._csv_cache

    @property
    def _metadata_frame(self) -> nw.LazyFrame[Any]:
        data = self.csv_cache.rotated
        impl = self._implementation
        return nw.maybe_convert_dtypes(nw.from_dict(data, backend=impl)).lazy()


@overload
def reader(
    read_fns: Sequence[Read[IntoDataFrameT]],
    scan_fns: tuple[()] = ...,
    *,
    name: str | None = ...,
    implementation: nw.Implementation = ...,
) -> Reader[IntoDataFrameT]: ...


@overload
def reader(
    read_fns: Sequence[Read[IntoDataFrameT]],
    scan_fns: Sequence[Scan[IntoLazyFrameT]],
    *,
    name: str | None = ...,
    implementation: nw.Implementation = ...,
) -> Reader[IntoDataFrameT, IntoLazyFrameT]: ...


def reader(
    read_fns: Sequence[Read[IntoDataFrameT]],
    scan_fns: Sequence[Scan[IntoLazyFrameT]] = (),
    *,
    name: str | None = None,
    implementation: nw.Implementation = nw.Implementation.UNKNOWN,
) -> Reader[IntoDataFrameT, IntoLazyFrameT] | Reader[IntoDataFrameT]:
    name = name or Counter(el._inferred_package for el in read_fns).most_common(1)[0][0]
    if not _is_eager_allowed(implementation):
        implementation = _into_implementation(Requirement(name))
    if scan_fns:
        return Reader(read_fns, scan_fns, name, implementation)
    if stolen := _steal_eager_parquet(read_fns):
        return Reader(read_fns, stolen, name, implementation)
    else:
        return _NoParquetReader[IntoDataFrameT](read_fns, (), name, implementation)


def infer_backend(
    *, priority: Sequence[_Backend] = ("polars", "pandas[pyarrow]", "pandas", "pyarrow")
) -> Reader[Any, Any]:
    """
    Return the first available reader in order of `priority`.

    Notes
    -----
    - ``"polars"``: can natively load every dataset (including ``(Geo|Topo)JSON``)
    - ``"pandas[pyarrow]"``: can load *most* datasets, guarantees ``.parquet`` support
    - ``"pandas"``: supports ``.parquet``, if `fastparquet`_ is installed
    - ``"pyarrow"``: least reliable

    .. _fastparquet:
        https://github.com/dask/fastparquet
    """
    it = (_from_backend(name) for name in priority if is_available(_requirements(name)))
    if reader := next(it, None):
        return reader
    raise AltairDatasetsError.from_priority(priority)


@overload
def _from_backend(name: _Polars, /) -> Reader[pl.DataFrame, pl.LazyFrame]: ...
@overload
def _from_backend(name: _PandasAny, /) -> Reader[pd.DataFrame]: ...
@overload
def _from_backend(name: _PyArrow, /) -> Reader[pa.Table]: ...


# FIXME: The order this is defined in makes splitting the module complicated
# - Can't use a classmethod, since some result in a subclass used
def _from_backend(name: _Backend, /) -> Reader[Any, Any]:
    """
    Reader initialization dispatcher.

    FIXME: Works, but defining these in mixed shape functions seems off.
    """
    if not _is_backend(name):
        msg = f"Unknown backend {name!r}"
        raise TypeError(msg)
    implementation = _into_implementation(name)
    if name == "polars":
        rd, sc = _readimpl.pl_only()
        return reader(rd, sc, name=name, implementation=implementation)
    elif name == "pandas[pyarrow]":
        return reader(_readimpl.pd_pyarrow(), name=name, implementation=implementation)
    elif name == "pandas":
        return reader(_readimpl.pd_only(), name=name, implementation=implementation)
    elif name == "pyarrow":
        return reader(_readimpl.pa_any(), name=name, implementation=implementation)


def _is_backend(obj: Any) -> TypeIs[_Backend]:
    return obj in {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}


def _is_err(obj: Any) -> TypeIs[type[AltairDatasetsError]]:
    return obj is AltairDatasetsError


def _into_constraints(
    name: Dataset | LiteralString, suffix: Extension | None, /
) -> Metadata:
    """Transform args into a mapping to column names."""
    m: Metadata = {}
    if "." in name:
        m["file_name"] = name
    elif suffix is None:
        m["dataset_name"] = name
    elif suffix.startswith("."):
        m = {"dataset_name": name, "suffix": suffix}
    else:
        from typing import get_args

        from altair.datasets._typing import Extension

        msg = (
            f"Expected 'suffix' to be one of {get_args(Extension)!r},\n"
            f"but got: {suffix!r}"
        )
        raise TypeError(msg)
    return m


def _is_eager_allowed(impl: nw.Implementation, /) -> TypeIs[_EagerAllowedImpl]:
    return impl in {
        nw.Implementation.PANDAS,
        nw.Implementation.POLARS,
        nw.Implementation.PYARROW,
    }


def _into_implementation(
    backend: _NwSupport | _PandasAny | nw.Implementation | Requirement, /
) -> _EagerAllowedImpl:
    req = (
        Requirement(str(backend)) if isinstance(backend, nw.Implementation) else backend
    )
    primary = _import_guarded(req)
    impl = nw.Implementation.from_backend(primary)
    if not _is_eager_allowed(impl):
        if impl is nw.Implementation.UNKNOWN:
            msg = f"Package {primary!r} is not supported by `narwhals`."
            raise ValueError(msg)
        raise NotImplementedError(impl)
    return impl


def _into_suffix(obj: Path | str, /) -> Any:
    if isinstance(obj, Path):
        return obj.suffix
    elif isinstance(obj, str):
        return obj
    else:
        msg = f"Unexpected type {type(obj).__name__!r}"
        raise TypeError(msg)


def _steal_eager_parquet(
    read_fns: Sequence[Read[IntoDataFrameT]], /
) -> Sequence[Scan[Any]] | None:
    if convertable := next((rd for rd in read_fns if rd.include <= is_parquet), None):
        return (_readimpl.into_scan(convertable),)
    return None


@overload
def _import_guarded(req: _PandasAny, /) -> _Pandas: ...


@overload
def _import_guarded(req: _NwSupportT, /) -> _NwSupportT: ...


@overload
def _import_guarded(req: Requirement, /) -> LiteralString: ...


def _import_guarded(req: Any, /) -> LiteralString:
    requires = _requirements(req)
    for name in requires:
        if spec := find_spec(name):
            import_module(spec.name)
        else:
            raise module_not_found(str(req), requires, missing=name)
    return requires[0]


def _requirements(req: Requirement | str, /) -> tuple[Any, ...]:
    req = Requirement(req) if isinstance(req, str) else req
    return (req.name, *req.extras)


================================================
FILE: altair/datasets/_readimpl.py
================================================
"""Individual read functions and siuations they support."""

from __future__ import annotations

import sys
from enum import Enum
from functools import partial, wraps
from importlib.util import find_spec
from itertools import chain
from operator import itemgetter
from pathlib import Path
from typing import TYPE_CHECKING, Any, Generic, Literal

from narwhals.stable import v1 as nw
from narwhals.stable.v1.dependencies import get_pandas, get_polars

from altair.datasets._constraints import (
    is_arrow,
    is_csv,
    is_json,
    is_meta,
    is_not_tabular,
    is_parquet,
    is_spatial,
    is_topo,
    is_tsv,
)
from altair.datasets._exceptions import AltairDatasetsError

if sys.version_info >= (3, 13):
    from typing import TypeVar
else:
    from typing_extensions import TypeVar
if sys.version_info >= (3, 12):
    from typing import TypeAliasType
else:
    from typing_extensions import TypeAliasType

if TYPE_CHECKING:
    from collections.abc import Callable, Iterable, Iterator, Sequence
    from io import IOBase
    from types import ModuleType

    import pandas as pd
    import polars as pl
    import pyarrow as pa
    from narwhals.stable.v1 import typing as nwt

    from altair.datasets._constraints import Items, MetaIs

__all__ = ["is_available", "pa_any", "pd_only", "pd_pyarrow", "pl_only", "read", "scan"]


R = TypeVar(
    "R",
    bound="nwt.IntoDataFrame | nwt.IntoLazyFrame",
    covariant=True,
)
IntoDataFrameT = TypeVar("IntoDataFrameT", bound="nwt.IntoDataFrame")
IntoLazyFrameT = TypeVar(
    "IntoLazyFrameT",
    bound="nwt.IntoLazyFrame",
    default=Any,
)
Read = TypeAliasType("Read", "BaseImpl[IntoDataFrameT]", type_params=(IntoDataFrameT,))
"""An *eager* file read function."""

Scan = TypeAliasType("Scan", "BaseImpl[IntoLazyFrameT]", type_params=(IntoLazyFrameT,))
"""A *lazy* file read function."""


class Skip(Enum):
    """Falsy sentinel."""

    skip = 0

    def __bool__(self) -> Literal[False]:
        return False

    def __repr__(self) -> Literal["<Skip>"]:
        return "<Skip>"


class BaseImpl(Generic[R]):
    """
    A function wrapped with dataset support constraints.

    The ``include``, ``exclude`` properties form a `NIMPLY gate`_ (`Material nonimplication`_).

    Examples
    --------
    For some dataset ``D``, we can use ``fn`` if::

        impl: BaseImpl
        impl.include(D) and not impl.exclude(D)


    .. _NIMPLY gate:
        https://en.m.wikipedia.org/wiki/NIMPLY_gate
    .. _Material nonimplication:
        https://en.m.wikipedia.org/wiki/Material_nonimplication#Truth_table
    """

    fn: Callable[..., R]
    """Wrapped read/scan function."""

    include: MetaIs
    """Constraint indicating ``fn`` **supports** reading a dataset."""

    exclude: MetaIs
    """Constraint *subsetting* ``include`` to mark **non-support**."""

    def __init__(
        self,
        fn: Callable[..., R],
        include: MetaIs,
        exclude: MetaIs | None,
        kwds: dict[str, Any],
        /,
    ) -> None:
        exclude = exclude or self._exclude_none()
        if not include.isdisjoint(exclude):
            intersection = ", ".join(f"{k}={v!r}" for k, v in include & exclude)
            msg = f"Constraints overlap at: `{intersection}`\ninclude={include!r}\nexclude={exclude!r}"
            raise TypeError(msg)
        object.__setattr__(self, "fn", partial(fn, **kwds) if kwds else fn)
        object.__setattr__(self, "include", include)
        object.__setattr__(self, "exclude", exclude)

    def unwrap_or_skip(
        self, meta: Items, /
    ) -> Callable[..., R] | type[AltairDatasetsError] | Skip:
        """
        Indicate an action to take for a dataset.

        **Supports** dataset, use this function::

            Callable[..., R]

        Has explicitly marked as **not supported**::

            type[AltairDatasetsError]

        No relevant constraints overlap, safe to check others::

            Skip
        """
        if self.include.issubset(meta):
            return self.fn if self.exclude.isdisjoint(meta) else AltairDatasetsError
        return Skip.skip

    @classmethod
    def _exclude_none(cls) -> MetaIs:
        """Represents the empty set."""
        return is_meta()

    def __setattr__(self, name: str, value: Any):
        msg = (
            f"{type(self).__name__!r} is immutable.\n"
            f"Could not assign self.{name} = {value}"
        )
        raise TypeError(msg)

    @property
    def _inferred_package(self) -> str:
        return _root_package_name(_unwrap_partial(self.fn), "UNKNOWN")

    def __repr__(self) -> str:
        tp_name = f"{type(self).__name__}[{self._inferred_package}?]"
        return f"{tp_name}({self})"

    def __str__(self) -> str:
        if isinstance(self.fn, partial):
            fn = _unwrap_partial(self.fn)
            kwds = self.fn.keywords.items()
            fn_repr = f"{fn.__name__}(..., {', '.join(f'{k}={v!r}' for k, v in kwds)})"
        else:
            fn_repr = f"{self.fn.__name__}(...)"
        inc, exc = self.include, self.exclude
        return f"{fn_repr}, {f'include={inc!r}, exclude={exc!r}' if exc else repr(inc)}"

    @property
    def _relevant_columns(self) -> Iterator[str]:
        name = itemgetter(0)
        yield from (name(obj) for obj in chain(self.include, self.exclude))

    @property
    def _include_expr(self) -> nw.Expr:
        return (
            self.include.to_expr() & ~self.exclude.to_expr()
            if self.exclude
            else self.include.to_expr()
        )

    @property
    def _exclude_expr(self) -> nw.Expr:
        if self.exclude:
            return self.include.to_expr() & self.exclude.to_expr()
        msg = f"Unable to generate an exclude expression without setting exclude\n\n{self!r}"
        raise TypeError(msg)


def read(
    fn: Callable[..., IntoDataFrameT],
    /,
    include: MetaIs,
    exclude: MetaIs | None = None,
    **kwds: Any,
) -> Read[IntoDataFrameT]:
    return BaseImpl(fn, include, exclude, kwds)


def scan(
    fn: Callable[..., IntoLazyFrameT],
    /,
    include: MetaIs,
    exclude: MetaIs | None = None,
    **kwds: Any,
) -> Scan[IntoLazyFrameT]:
    return BaseImpl(fn, include, exclude, kwds)


def into_scan(impl: Read[IntoDataFrameT], /) -> Scan[Any]:
    def scan_fn(fn: Callable[..., IntoDataFrameT], /) -> Callable[..., Any]:
        @wraps(_unwrap_partial(fn))
        def wrapper(*args: Any, **kwds: Any) -> nw.LazyFrame[Any]:
            return nw.from_native(fn(*args, **kwds)).lazy()

        return wrapper

    return scan(scan_fn(impl.fn), impl.include, impl.exclude)


def is_available(
    pkg_names: str | Iterable[str], *more_pkg_names: str, require_all: bool = True
) -> bool:
    """
    Check for importable package(s), without raising on failure.

    Parameters
    ----------
    pkg_names, more_pkg_names
        One or more packages.
    require_all
        * ``True`` every package.
        * ``False`` at least one package.
    """
    if not more_pkg_names and isinstance(pkg_names, str):
        return find_spec(pkg_names) is not None
    pkgs_names = pkg_names if not isinstance(pkg_names, str) else (pkg_names,)
    names = chain(pkgs_names, more_pkg_names)
    fn = all if require_all else any
    return fn(find_spec(name) is not None for name in names)


def _root_package_name(obj: Any, default: str, /) -> str:
    # NOTE: Defers importing `inspect`, if we can get the module name
    if hasattr(obj, "__module__"):
        return obj.__module__.split(".")[0]
    else:
        from inspect import getmodule

        module = getmodule(obj)
    if module and (pkg := module.__package__):
        return pkg.split(".")[0]
    return default


def _unwrap_partial(fn: Any, /) -> Any:
    # NOTE: ``functools._unwrap_partial``
    func = fn
    while isinstance(func, partial):
        func = func.func
    return func


def pl_only() -> tuple[Sequence[Read[pl.DataFrame]], Sequence[Scan[pl.LazyFrame]]]:  # pyright: ignore[reportInvalidTypeForm]
    import polars as pl

    pl_read_json = read(_pl_read_json_roundtrip(get_polars()), is_json)
    if is_available("polars_st"):
        fn_json: Sequence[Read[pl.DataFrame]] = (
            _pl_read_json_polars_st_topo_impl(),  # TopoJSON files first
            _pl_read_json_polars_st_impl(),  # Then other spatial JSON
            pl_read_json,
        )
    else:
        fn_json = (pl_read_json,)

    read_fns = (
        read(pl.read_csv, is_csv, try_parse_dates=True),
        *fn_json,
        read(pl.read_csv, is_tsv, separator="\t", try_parse_dates=True),
        read(pl.read_ipc, is_arrow),
        read(pl.read_parquet, is_parquet),
    )
    scan_fns = (scan(pl.scan_parquet, is_parquet),)
    return read_fns, scan_fns


def pd_only() -> Sequence[Read[pd.DataFrame]]:
    import pandas as pd

    opt: Sequence[Read[pd.DataFrame]]
    if is_available("pyarrow"):
        opt = read(pd.read_feather, is_arrow), read(pd.read_parquet, is_parquet)
    elif is_available("fastparquet"):
        opt = (read(pd.read_parquet, is_parquet),)
    else:
        opt = ()
    pd_read_json = read(_pd_read_json(get_pandas()), is_json, exclude=is_spatial)
    if is_available("geopandas"):
        fn_json: Sequence[Read[pd.DataFrame]] = (
            _pd_read_json_geopandas_impl(),
            pd_read_json,
        )
    else:
        fn_json = (pd_read_json,)
    return (
        read(pd.read_csv, is_csv),
        *fn_json,
        read(pd.read_csv, is_tsv, sep="\t"),
        *opt,
    )


def pd_pyarrow() -> Sequence[Read[pd.DataFrame]]:
    import pandas as pd

    kwds: dict[str, Any] = {"dtype_backend": "pyarrow"}
    pd_read_json = read(
        _pd_read_json(get_pandas()), is_json, exclude=is_spatial, **kwds
    )
    if is_available("geopandas"):
        fn_json: Sequence[Read[pd.DataFrame]] = (
            _pd_read_json_geopandas_impl(),
            pd_read_json,
        )
    else:
        fn_json = (pd_read_json,)
    return (
        read(pd.read_csv, is_csv, **kwds),
        *fn_json,
        read(pd.read_csv, is_tsv, sep="\t", **kwds),
        read(pd.read_feather, is_arrow, **kwds),
        read(pd.read_parquet, is_parquet, **kwds),
    )


def pa_any() -> Sequence[Read[pa.Table]]:
    from pyarrow import csv, feather, parquet

    return (
        read(csv.read_csv, is_csv),
        _pa_read_json_impl(),
        read(csv.read_csv, is_tsv, parse_options=csv.ParseOptions(delimiter="\t")),
        read(feather.read_table, is_arrow),
        read(parquet.read_table, is_parquet),
    )


def _pa_read_json_impl() -> Read[pa.Table]:
    """
    Mitigating ``pyarrow``'s `line-delimited`_ JSON requirement.

    .. _line-delimited:
        https://arrow.apache.org/docs/python/json.html#reading-json-files
    """
    if is_available("polars"):
        polars_ns = get_polars()
        if polars_ns is not None:
            return read(_pl_read_json_roundtrip_to_arrow(polars_ns), is_json)
    if is_available("pandas"):
        pandas_ns = get_pandas()
        if pandas_ns is not None:
            return read(_pd_read_json_to_arrow(pandas_ns), is_json, exclude=is_spatial)
    return read(_stdlib_read_json_to_arrow, is_json, exclude=is_not_tabular)


def _pd_read_json(ns: ModuleType, /) -> Callable[..., pd.DataFrame]:
    @wraps(ns.read_json)
    def fn(source: Path | Any, /, **kwds: Any) -> pd.DataFrame:
        return _pd_fix_dtypes_nw(ns.read_json(source, **kwds), **kwds).to_native()

    return fn


def _pd_read_json_geopandas_impl() -> Read[pd.DataFrame]:
    import geopandas

    @wraps(geopandas.read_file)
    def fn(source: Path | Any, /, schema: Any = None, **kwds: Any) -> pd.DataFrame:
        return geopandas.read_file(source, **kwds)

    return read(fn, is_meta(is_spatial=True, suffix=".json"))


def _pd_fix_dtypes_nw(
    df: pd.DataFrame, /, *, dtype_backend: Any = None, **kwds: Any
) -> nw.DataFrame[pd.DataFrame]:
    kwds = {"dtype_backend": dtype_backend} if dtype_backend else {}
    return (
        df.convert_dtypes(**kwds)
        .pipe(nw.from_native, eager_only=True)
        .with_columns(nw.selectors.by_dtype(nw.Object).cast(nw.String))
    )


def _pd_read_json_to_arrow(ns: ModuleType, /) -> Callable[..., pa.Table]:
    @wraps(ns.read_json)
    def fn(source: Path | Any, /, *, schema: Any = None, **kwds: Any) -> pa.Table:
        """``schema`` is only here to swallow the ``SchemaCache`` if used."""
        return (
            ns.read_json(source, **kwds)
            .pipe(_pd_fix_dtypes_nw, dtype_backend="pyarrow")
            .to_arrow()
        )

    return fn


def _pl_read_json_polars_st_impl() -> Read[pl.DataFrame]:
    import polars_st as st

    @wraps(st.read_file)
    def fn(source: Path | Any, /, schema: Any = None, **kwds: Any) -> pl.DataFrame:
        return st.read_file(source, **kwds)

    return read(fn, is_meta(is_spatial=True, suffix=".json"))


def _pl_read_json_polars_st_topo_impl() -> Read[pl.DataFrame]:
    import polars_st as st

    @wraps(st.read_file)
    def fn(source: Path | Any, /, schema: Any = None, **kwds: Any) -> pl.DataFrame:
        # Add TopoJSON driver prefix for URLs
        if isinstance(source, str) and source.startswith("http"):
            source = f"TopoJSON:{source}"
        return st.read_file(source, **kwds)

    return read(fn, is_topo)


def _pl_read_json_roundtrip(ns: ModuleType, /) -> Callable[..., pl.DataFrame]:
    """
    Try to utilize better date parsing available in `pl.read_csv`_.

    `pl.read_json`_ has few options when compared to `pl.read_csv`_.

    Chaining the two together - *where possible* - is still usually faster than `pandas.read_json`_.

    .. _pl.read_json:
        https://docs.pola.rs/api/python/stable/reference/api/polars.read_json.html
    .. _pl.read_csv:
        https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html
    .. _pandas.read_json:
        https://pandas.pydata.org/docs/reference/api/pandas.read_json.html
    """
    from io import BytesIO

    @wraps(ns.read_json)
    def fn(source: Path | IOBase, /, **kwds: Any) -> pl.DataFrame:
        df = ns.read_json(source, **kwds)
        if any(tp.is_nested() for tp in df.schema.dtypes()):
            return df
        buf = BytesIO()
        df.write_csv(buf)
        if kwds:
            SHARED_KWDS = {"schema", "schema_overrides", "infer_schema_length"}
            kwds = {k: v for k, v in kwds.items() if k in SHARED_KWDS}
        return ns.read_csv(buf, try_parse_dates=True, **kwds)

    return fn


def _pl_read_json_roundtrip_to_arrow(ns: ModuleType, /) -> Callable[..., pa.Table]:
    eager = _pl_read_json_roundtrip(ns)

    @wraps(ns.read_json)
    def fn(source: Path | IOBase, /, **kwds: Any) -> pa.Table:
        return eager(source).to_arrow()

    return fn


def _stdlib_read_json(source: Path | Any, /) -> Any:
    import json

    if not isinstance(source, Path):
        return json.load(source)
    else:
        with Path(source).open(encoding="utf-8") as f:
            return json.load(f)


def _stdlib_read_json_to_arrow(source: Path | Any, /, **kwds: Any) -> pa.Table:
    import pyarrow as pa

    rows: list[dict[str, Any]] = _stdlib_read_json(source)
    try:
        return pa.Table.from_pylist(rows, **kwds)
    except TypeError:
        import csv
        import io

        from pyarrow import csv as pa_csv

        with io.StringIO() as f:
            writer = csv.DictWriter(f, rows[0].keys(), dialect=csv.unix_dialect)
            writer.writeheader()
            writer.writerows(rows)
            with io.BytesIO(f.getvalue().encode()) as f2:
                return pa_csv.read_csv(f2)


================================================
FILE: altair/datasets/_typing.py
================================================
# The contents of this file are automatically written by
# tools/datasets.__init__.py. Do not modify directly.

from __future__ import annotations

import sys
from typing import Literal, TypeAlias

if sys.version_info >= (3, 15):
    from typing import TypedDict
else:
    from typing_extensions import TypedDict

if sys.version_info >= (3, 11):
    from typing import LiteralString
else:
    from typing_extensions import LiteralString


__all__ = ["Dataset", "Extension", "Metadata"]

Dataset: TypeAlias = Literal[
    "airports",
    "annual_precip",
    "anscombe",
    "barley",
    "birdstrikes",
    "budget",
    "budgets",
    "burtin",
    "cars",
    "co2_concentration",
    "countries",
    "crimea",
    "disasters",
    "driving",
    "earthquakes",
    "ffox",
    "flare",
    "flare_dependencies",
    "flights_10k",
    "flights_200k_arrow",
    "flights_200k_json",
    "flights_20k",
    "flights_2k",
    "flights_3m",
    "flights_5k",
    "flights_airport",
    "football",
    "gapminder",
    "gapminder_health_income",
    "gimp",
    "github",
    "global_temp",
    "icon_7zip",
    "income",
    "iowa_electricity",
    "jobs",
    "la_riots",
    "london_boroughs",
    "london_centroids",
    "london_tube_lines",
    "lookup_groups",
    "lookup_people",
    "miserables",
    "monarchs",
    "movies",
    "normal_2d",
    "obesity",
    "ohlc",
    "penguins",
    "platformer_terrain",
    "political_contributions",
    "population",
    "population_engineers_hurricanes",
    "seattle_weather",
    "seattle_weather_hourly_normals",
    "sp500",
    "sp500_2000",
    "species",
    "stocks",
    "udistrict",
    "unemployment",
    "unemployment_across_industries",
    "uniform_2d",
    "us_10m",
    "us_employment",
    "us_state_capitals",
    "volcano",
    "weather",
    "weekly_weather",
    "wheat",
    "windvectors",
    "world_110m",
    "zipcodes",
]
Extension: TypeAlias = Literal[".arrow", ".csv", ".json", ".parquet", ".png", ".tsv"]


class Metadata(TypedDict, total=False):
    """
    Full schema for ``metadata.parquet``.

    Parameters
    ----------
    dataset_name
        Name of the dataset from the resource name field.
    suffix
        File extension/`Path.suffix`_.
    file_name
        Equivalent to `Path.name`_.
    bytes
        File size in *bytes*.
    is_image
        Only accessible via url.
    is_tabular
        Can be read as tabular data.
    is_geo
        `GeoJSON`_ format.
    is_topo
        `TopoJSON`_ format.
    is_spatial
        Any geospatial format. Only natively supported by ``polars``.
    is_json
        Not supported natively by ``pyarrow``.
    has_schema
        Data types available for improved ``pandas`` parsing.
    sha
        Unique hash for the dataset.

        .. note::
            E.g. if the dataset did *not* change between ``v1.0.0``-``v2.0.0``;

            then this value would remain stable.
    url
        Remote url used to access dataset.

    .. _Path.stem:
        https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
    .. _Path.name:
        https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.name
    .. _Path.suffix:
        https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix
    .. _GeoJSON:
        https://en.wikipedia.org/wiki/GeoJSON
    .. _TopoJSON:
        https://en.wikipedia.org/wiki/GeoJSON#TopoJSON


    Examples
    --------
    ``Metadata`` keywords form constraints to filter a table like the below sample:

    ```
    shape: (73, 13)
    ┌────────────────┬────────┬────────────────┬───┬───────────────┬───────────────┐
    │ dataset_name   ┆ suffix ┆ file_name      ┆ … ┆ sha           ┆ url           │
    │ ---            ┆ ---    ┆ ---            ┆   ┆ ---           ┆ ---           │
    │ str            ┆ str    ┆ str            ┆   ┆ str           ┆ str           │
    ╞════════════════╪════════╪════════════════╪═══╪═══════════════╪═══════════════╡
    │ airports       ┆ .csv   ┆ airports.csv   ┆ … ┆ 608ba6d51fa70 ┆ https://cdn.j │
    │                ┆        ┆                ┆   ┆ 584c3fa1d31e… ┆ sdelivr.net/… │
    │ annual_precip  ┆ .json  ┆ annual-precip. ┆ … ┆ 719e73406cfc0 ┆ https://cdn.j │
    │                ┆        ┆ json           ┆   ┆ 8f16dda65151… ┆ sdelivr.net/… │
    │ anscombe       ┆ .json  ┆ anscombe.json  ┆ … ┆ 11ae97090b626 ┆ https://cdn.j │
    │                ┆        ┆                ┆   ┆ 3bdf0c866115… ┆ sdelivr.net/… │
    │ barley         ┆ .json  ┆ barley.json    ┆ … ┆ 8dc50de2509b6 ┆ https://cdn.j │
    │                ┆        ┆                ┆   ┆ e197ce95c24c… ┆ sdelivr.net/… │
    │ birdstrikes    ┆ .csv   ┆ birdstrikes.cs ┆ … ┆ 1b8b190c9bc02 ┆ https://cdn.j │
    │                ┆        ┆ v              ┆   ┆ ef7bcbfe5a8a… ┆ sdelivr.net/… │
    │ …              ┆ …      ┆ …              ┆ … ┆ …             ┆ …             │
    │ weekly_weather ┆ .json  ┆ weekly-weather ┆ … ┆ bd42a3e2403e7 ┆ https://cdn.j │
    │                ┆        ┆ .json          ┆   ┆ ccd6baaa89f9… ┆ sdelivr.net/… │
    │ wheat          ┆ .json  ┆ wheat.json     ┆ … ┆ cde46b43fc82f ┆ https://cdn.j │
    │                ┆        ┆                ┆   ┆ 4c3c2a37ddcf… ┆ sdelivr.net/… │
    │ windvectors    ┆ .csv   ┆ windvectors.cs ┆ … ┆ ed686b0ba613a ┆ https://cdn.j │
    │                ┆        ┆ v              ┆   ┆ bd59d09fcd94… ┆ sdelivr.net/… │
    │ world_110m     ┆ .json  ┆ world-110m.jso ┆ … ┆ a1ce852de6f27 ┆ https://cdn.j │
    │                ┆        ┆ n              ┆   ┆ 13c94c0c2840… ┆ sdelivr.net/… │
    │ zipcodes       ┆ .csv   ┆ zipcodes.csv   ┆ … ┆ d3df33e12be0d ┆ https://cdn.j │
    │                ┆        ┆                ┆   ┆ 0544c95f1bd4… ┆ sdelivr.net/… │
    └────────────────┴────────┴────────────────┴───┴───────────────┴───────────────┘
    ```
    """

    dataset_name: Dataset | LiteralString
    suffix: Extension
    file_name: str
    bytes: int
    is_image: bool
    is_tabular: bool
    is_geo: bool
    is_topo: bool
    is_spatial: bool
    is_json: bool
    has_schema: bool
    sha: str
    url: str


FlFieldStr: TypeAlias = Literal[
    "integer",
    "number",
    "boolean",
    "string",
    "object",
    "array",
    "date",
    "datetime",
    "time",
    "duration",
]
"""
String representation of `frictionless`_ `Field Types`_.

.. _frictionless:
    https://github.com/frictionlessdata/frictionless-py
.. _Field Types:
    https://datapackage.org/standard/table-schema/#field-types
"""


================================================
FILE: altair/expr/__init__.py
================================================
# The contents of this file are automatically written by
# tools/generate_schema_wrapper.py. Do not modify directly.

"""Tools for creating transform & filter expressions with a python syntax."""

from __future__ import annotations

import sys
from typing import TYPE_CHECKING, Any

from altair.expr.core import ConstExpression, FunctionExpression
from altair.vegalite.v6.schema.core import ExprRef as _ExprRef

if sys.version_info >= (3, 12):
    from typing import override
else:
    from typing_extensions import override

if TYPE_CHECKING:
    from altair.expr.core import Expression, IntoExpression


class _ExprMeta(type):
    """
    Metaclass for :class:`expr`.

    Currently providing read-only class properties, representing JavaScript constants.
    """

    @property
    def NaN(cls) -> Expression:
        """Not a number (same as JavaScript literal NaN)."""
        return ConstExpression("NaN")

    @property
    def LN10(cls) -> Expression:
        """The natural log of 10 (alias to Math.LN10)."""
        return ConstExpression("LN10")

    @property
    def E(cls) -> Expression:
        """The transcendental number e (alias to Math.E)."""
        return ConstExpression("E")

    @property
    def LOG10E(cls) -> Expression:
        """The base 10 logarithm e (alias to Math.LOG10E)."""
        return ConstExpression("LOG10E")

    @property
    def LOG2E(cls) -> Expression:
        """The base 2 logarithm of e (alias to Math.LOG2E)."""
        return ConstExpression("LOG2E")

    @property
    def SQRT1_2(cls) -> Expression:
        """The square root of 0.5 (alias to Math.SQRT1_2)."""
        return ConstExpression("SQRT1_2")

    @property
    def LN2(cls) -> Expression:
        """The natural log of 2 (alias to Math.LN2)."""
        return ConstExpression("LN2")

    @property
    def SQRT2(cls) -> Expression:
        """The square root of 2 (alias to Math.SQRT1_2)."""
        return ConstExpression("SQRT2")

    @property
    def PI(cls) -> Expression:
        """The transcendental number pi (alias to Math.PI)."""
        return ConstExpression("PI")


class expr(_ExprRef, metaclass=_ExprMeta):
    """
    Utility providing *constants* and *classmethods* to construct expressions.

    `Expressions`_ can be used to write basic formulas that enable custom interactions.

    Alternatively, an `inline expression`_ may be defined via :class:`expr()`.

    Parameters
    ----------
    expr: str
        A `vega expression`_ string.

    Returns
    -------
    ``ExprRef``

    .. _Expressions:
        https://altair-viz.github.io/user_guide/interactions/expressions.html
    .. _inline expression:
       https://altair-viz.github.io/user_guide/interactions/expressions.html#inline-expressions
    .. _vega expression:
       https://vega.github.io/vega/docs/expressions/

    Examples
    --------
    >>> import altair as alt

    >>> bind_range = alt.binding_range(min=100, max=300, name="Slider value:  ")
    >>> param_width = alt.param(bind=bind_range, name="param_width")
    >>> param_color = alt.param(
    ...     expr=alt.expr.if_(param_width < 200, "red", "black"),
    ...     name="param_color",
    ... )
    >>> y = alt.Y("yval").axis(titleColor=param_color)

    >>> y
    Y({
      axis: {'titleColor': Parameter('param_color', VariableParameter({
        expr: if((param_width < 200),'red','black'),
        name: 'param_color'
      }))},
      shorthand: 'yval'
    })

    .. _Number.isNaN:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNan
    .. _Number.isFinite:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
    .. _Math.abs:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs
    .. _Math.acos:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos
    .. _Math.asin:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin
    .. _Math.atan:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan
    .. _Math.atan2:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2
    .. _Math.ceil:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil
    .. _Math.cos:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos
    .. _Math.exp:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp
    .. _Math.floor:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
    .. _Math.hypot:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
    .. _Math.log:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log
    .. _Math.max:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
    .. _Math.min:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
    .. _Math.pow:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
    .. _Math.random:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
    .. _Math.round:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
    .. _Math.sin:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin
    .. _Math.sqrt:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt
    .. _Math.tan:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan
    .. _normal (Gaussian) probability distribution:
       https://en.wikipedia.org/wiki/Normal_distribution
    .. _cumulative distribution function:
       https://en.wikipedia.org/wiki/Cumulative_distribution_function
    .. _probability density function:
       https://en.wikipedia.org/wiki/Probability_density_function
    .. _log-normal probability distribution:
       https://en.wikipedia.org/wiki/Log-normal_distribution
    .. _continuous uniform probability distribution:
       https://en.wikipedia.org/wiki/Continuous_uniform_distribution
    .. _*unit*:
       https://vega.github.io/vega/docs/api/time/#time-units
    .. _ascending from Vega Utils:
       https://vega.github.io/vega/docs/api/util/#ascending
    .. _JavaScript's String.replace:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
    .. _Base64:
       https://developer.mozilla.org/en-US/docs/Glossary/Base64
    .. _ASCII:
       https://developer.mozilla.org/en-US/docs/Glossary/ASCII
    .. _Window.btoa():
       https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa
    .. _Window.atob():
       https://developer.mozilla.org/en-US/docs/Web/API/Window/atob
    .. _d3-format specifier:
       https://github.com/d3/d3-format/
    .. _*units*:
       https://vega.github.io/vega/docs/api/time/#time-units
    .. _timeUnitSpecifier API documentation:
       https://vega.github.io/vega/docs/api/time/#timeUnitSpecifier
    .. _timeFormat:
       https://vega.github.io/vega/docs/expressions/#timeFormat
    .. _utcFormat:
       https://vega.github.io/vega/docs/expressions/#utcFormat
    .. _d3-time-format specifier:
       https://github.com/d3/d3-time-format/
    .. _TimeMultiFormat object:
       https://vega.github.io/vega/docs/types/#TimeMultiFormat
    .. _UTC:
       https://en.wikipedia.org/wiki/Coordinated_Universal_Time
    .. _JavaScript's RegExp:
       https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
    .. _RGB:
       https://en.wikipedia.org/wiki/RGB_color_model
    .. _d3-color's rgb function:
       https://github.com/d3/d3-color#rgb
    .. _HSL:
       https://en.wikipedia.org/wiki/HSL_and_HSV
    .. _d3-color's hsl function:
       https://github.com/d3/d3-color#hsl
    .. _CIE LAB:
       https://en.wikipedia.org/wiki/Lab_color_space#CIELAB
    .. _d3-color's lab function:
       https://github.com/d3/d3-color#lab
    .. _HCL:
       https://en.wikipedia.org/wiki/Lab_color_space#CIELAB
    .. _d3-color's hcl function:
       https://github.com/d3/d3-color#hcl
    .. _W3C Web Content Accessibility Guidelines:
       https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef
    .. _continuous color scheme:
       https://vega.github.io/vega/docs/schemes
    .. _geoArea:
       https://github.com/d3/d3-geo#geoArea
    .. _path.area:
       https://github.com/d3/d3-geo#path_area
    .. _geoBounds:
       https://github.com/d3/d3-geo#geoBounds
    .. _path.bounds:
       https://github.com/d3/d3-geo#path_bounds
    .. _geoCentroid:
       https://github.com/d3/d3-geo#geoCentroid
    .. _path.centroid:
       https://github.com/d3/d3-geo#path_centroid
    .. _window.screen:
       https://developer.mozilla.org/en-US/docs/Web/API/Window/screen
    """

    @override
    def __new__(cls: type[_ExprRef], expr: str) -> _ExprRef:  # type: ignore[misc]
        return _ExprRef(expr=expr)

    @classmethod
    def isArray(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is an array, false otherwise."""
        return FunctionExpression("isArray", (value,))

    @classmethod
    def isBoolean(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is a boolean (``true`` or ``false``), false otherwise."""
        return FunctionExpression("isBoolean", (value,))

    @classmethod
    def isDate(cls, value: IntoExpression, /) -> Expression:
        """
        Returns true if ``value`` is a Date object, false otherwise.

        This method will return false for timestamp numbers or date-formatted strings; it recognizes
        Date objects only.
        """
        return FunctionExpression("isDate", (value,))

    @classmethod
    def isDefined(cls, value: IntoExpression, /) -> Expression:
        """
        Returns true if ``value`` is a defined value, false if ``value`` equals ``undefined``.

        This method will return true for ``null`` and ``NaN`` values.
        """
        return FunctionExpression("isDefined", (value,))

    @classmethod
    def isNumber(cls, value: IntoExpression, /) -> Expression:
        """
        Returns true if ``value`` is a number, false otherwise.

        ``NaN`` and ``Infinity`` are considered numbers.
        """
        return FunctionExpression("isNumber", (value,))

    @classmethod
    def isObject(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is an object (including arrays and Dates), false otherwise."""
        return FunctionExpression("isObject", (value,))

    @classmethod
    def isRegExp(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is a RegExp (regular expression) object, false otherwise."""
        return FunctionExpression("isRegExp", (value,))

    @classmethod
    def isString(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is a string, false otherwise."""
        return FunctionExpression("isString", (value,))

    @classmethod
    def isValid(cls, value: IntoExpression, /) -> Expression:
        """Returns true if ``value`` is not ``null``, ``undefined``, or ``NaN``, false otherwise."""
        return FunctionExpression("isValid", (value,))

    @classmethod
    def toBoolean(cls, value: IntoExpression, /) -> Expression:
        """
        Coerces the input ``value`` to a string.

        Null values and empty strings are mapped to ``null``.
        """
        return FunctionExpression("toBoolean", (value,))

    @classmethod
    def toDate(cls, value: IntoExpression, /) -> Expression:
        """
        Coerces the input ``value`` to a Date instance.

        Null values and empty strings are mapped to ``null``. If an optional *parser* function is
        provided, it is used to perform date parsing, otherwise ``Date.parse`` is used. Be aware
        that ``Date.parse`` has different implementations across browsers!
        """
        return FunctionExpression("toDate", (value,))

    @classmethod
    def toNumber(cls, value: IntoExpression, /) -> Expression:
        """
        Coerces the input ``value`` to a number.

        Null values and empty strings are mapped to ``null``.
        """
        return FunctionExpression("toNumber", (value,))

    @classmethod
    def toString(cls, value: IntoExpression, /) -> Expression:
        """
        Coerces the input ``value`` to a string.

        Null values and empty strings are mapped to ``null``.
        """
        return FunctionExpression("toString", (value,))

    @classmethod
    def if_(
        cls,
        test: IntoExpression,
        thenValue: IntoExpression,
        elseValue: IntoExpression,
        /,
    ) -> Expression:
        """
        If ``test`` is truthy, returns ``thenValue``.

        Otherwise, returns ``elseValue``. The *if* function is equivalent to the ternary operator
        ``a ? b : c``.
        """
        return FunctionExpression("if", (test, thenValue, elseValue))

    @classmethod
    def isNaN(cls, value: IntoExpression, /) -> Expression:
        """
        Returns true if ``value`` is not a number.

        Same as JavaScript's `Number.isNaN`_.

        .. _Number.isNaN:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNan
        """
        return FunctionExpression("isNaN", (value,))

    @classmethod
    def isFinite(cls, value: IntoExpression, /) -> Expression:
        """
        Returns true if ``value`` is a finite number.

        Same as JavaScript's `Number.isFinite`_.

        .. _Number.isFinite:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
        """
        return FunctionExpression("isFinite", (value,))

    @classmethod
    def abs(cls, value: IntoExpression, /) -> Expression:
        """
        Returns the absolute value of ``value``.

        Same as JavaScript's `Math.abs`_.

        .. _Math.abs:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs
        """
        return FunctionExpression("abs", (value,))

    @classmethod
    def acos(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric arccosine.

        Same as JavaScript's `Math.acos`_.

        .. _Math.acos:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos
        """
        return FunctionExpression("acos", (value,))

    @classmethod
    def asin(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric arcsine.

        Same as JavaScript's `Math.asin`_.

        .. _Math.asin:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin
        """
        return FunctionExpression("asin", (value,))

    @classmethod
    def atan(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric arctangent.

        Same as JavaScript's `Math.atan`_.

        .. _Math.atan:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan
        """
        return FunctionExpression("atan", (value,))

    @classmethod
    def atan2(cls, dy: IntoExpression, dx: IntoExpression, /) -> Expression:
        """
        Returns the arctangent of *dy / dx*.

        Same as JavaScript's `Math.atan2`_.

        .. _Math.atan2:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2
        """
        return FunctionExpression("atan2", (dy, dx))

    @classmethod
    def ceil(cls, value: IntoExpression, /) -> Expression:
        """
        Rounds ``value`` to the nearest integer of equal or greater value.

        Same as JavaScript's `Math.ceil`_.

        .. _Math.ceil:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil
        """
        return FunctionExpression("ceil", (value,))

    @classmethod
    def clamp(
        cls, value: IntoExpression, min: IntoExpression, max: IntoExpression, /
    ) -> Expression:
        """Restricts ``value`` to be between the specified ``min`` and ``max``."""
        return FunctionExpression("clamp", (value, min, max))

    @classmethod
    def cos(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric cosine.

        Same as JavaScript's `Math.cos`_.

        .. _Math.cos:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos
        """
        return FunctionExpression("cos", (value,))

    @classmethod
    def exp(cls, exponent: IntoExpression, /) -> Expression:
        """
        Returns the value of *e* raised to the provided ``exponent``.

        Same as JavaScript's `Math.exp`_.

        .. _Math.exp:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp
        """
        return FunctionExpression("exp", (exponent,))

    @classmethod
    def floor(cls, value: IntoExpression, /) -> Expression:
        """
        Rounds ``value`` to the nearest integer of equal or lower value.

        Same as JavaScript's `Math.floor`_.

        .. _Math.floor:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
        """
        return FunctionExpression("floor", (value,))

    @classmethod
    def hypot(cls, value: IntoExpression, /) -> Expression:
        """
        Returns the square root of the sum of squares of its arguments.

        Same as JavaScript's `Math.hypot`_.

        .. _Math.hypot:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
        """
        return FunctionExpression("hypot", (value,))

    @classmethod
    def log(cls, value: IntoExpression, /) -> Expression:
        """
        Returns the natural logarithm of ``value``.

        Same as JavaScript's `Math.log`_.

        .. _Math.log:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log
        """
        return FunctionExpression("log", (value,))

    @classmethod
    def max(
        cls, value1: IntoExpression, value2: IntoExpression, *args: Any
    ) -> Expression:
        """
        Returns the maximum argument value.

        Same as JavaScript's `Math.max`_.

        .. _Math.max:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
        """
        return FunctionExpression("max", (value1, value2, *args))

    @classmethod
    def min(
        cls, value1: IntoExpression, value2: IntoExpression, *args: Any
    ) -> Expression:
        """
        Returns the minimum argument value.

        Same as JavaScript's `Math.min`_.

        .. _Math.min:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
        """
        return FunctionExpression("min", (value1, value2, *args))

    @classmethod
    def pow(cls, value: IntoExpression, exponent: IntoExpression, /) -> Expression:
        """
        Returns ``value`` raised to the given ``exponent``.

        Same as JavaScript's `Math.pow`_.

        .. _Math.pow:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
        """
        return FunctionExpression("pow", (value, exponent))

    @classmethod
    def random(cls) -> Expression:
        """
        Returns a pseudo-random number in the range [0,1).

        Same as JavaScript's `Math.random`_.

        .. _Math.random:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
        """
        return FunctionExpression("random", ())

    @classmethod
    def round(cls, value: IntoExpression, /) -> Expression:
        """
        Rounds ``value`` to the nearest integer.

        Same as JavaScript's `Math.round`_.

        .. _Math.round:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
        """
        return FunctionExpression("round", (value,))

    @classmethod
    def sin(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric sine.

        Same as JavaScript's `Math.sin`_.

        .. _Math.sin:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin
        """
        return FunctionExpression("sin", (value,))

    @classmethod
    def sqrt(cls, value: IntoExpression, /) -> Expression:
        """
        Square root function.

        Same as JavaScript's `Math.sqrt`_.

        .. _Math.sqrt:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt
        """
        return FunctionExpression("sqrt", (value,))

    @classmethod
    def tan(cls, value: IntoExpression, /) -> Expression:
        """
        Trigonometric tangent.

        Same as JavaScript's `Math.tan`_.

        .. _Math.tan:
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan
        """
        return FunctionExpression("tan", (value,))

    @classmethod
    def sampleNormal(
        cls, mean: IntoExpression = None, stdev: IntoExpression = None, /
    ) -> Expression:
        """
        Returns a sample from a univariate `normal (Gaussian) probability distribution`_ with specified ``mean`` and standard deviation ``stdev``.

        If unspecified, the mean defaults to ``0`` and the standard deviation defaults to ``1``.

        .. _normal (Gaussian) probability distribution:
            https://en.wikipedia.org/wiki/Normal_distribution
        """
        return FunctionExpression("sampleNormal", (mean, stdev))

    @classmethod
    def cumulativeNormal(
        cls,
        value: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `cumulative distribution function`_ at the given input domain ``value`` for a normal distribution with specified ``mean`` and standard deviation ``stdev``.

        If unspecified, the mean defaults to ``0`` and the standard deviation defaults to ``1``.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("cumulativeNormal", (value, mean, stdev))

    @classmethod
    def densityNormal(
        cls,
        value: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `probability density function`_ at the given input domain ``value``, for a normal distribution with specified ``mean`` and standard deviation ``stdev``.

        If unspecified, the mean defaults to ``0`` and the standard deviation defaults to ``1``.

        .. _probability density function:
            https://en.wikipedia.org/wiki/Probability_density_function
        """
        return FunctionExpression("densityNormal", (value, mean, stdev))

    @classmethod
    def quantileNormal(
        cls,
        probability: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the quantile value (the inverse of the `cumulative distribution function`_) for the given input ``probability``, for a normal distribution with specified ``mean`` and standard deviation ``stdev``.

        If unspecified, the mean defaults to ``0`` and the standard deviation defaults to ``1``.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("quantileNormal", (probability, mean, stdev))

    @classmethod
    def sampleLogNormal(
        cls, mean: IntoExpression = None, stdev: IntoExpression = None, /
    ) -> Expression:
        """
        Returns a sample from a univariate `log-normal probability distribution`_ with specified log ``mean`` and log standard deviation ``stdev``.

        If unspecified, the log mean defaults to ``0`` and the log standard deviation defaults to
        ``1``.

        .. _log-normal probability distribution:
            https://en.wikipedia.org/wiki/Log-normal_distribution
        """
        return FunctionExpression("sampleLogNormal", (mean, stdev))

    @classmethod
    def cumulativeLogNormal(
        cls,
        value: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `cumulative distribution function`_ at the given input domain ``value`` for a log-normal distribution with specified log ``mean`` and log standard deviation ``stdev``.

        If unspecified, the log mean defaults to ``0`` and the log standard deviation defaults to
        ``1``.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("cumulativeLogNormal", (value, mean, stdev))

    @classmethod
    def densityLogNormal(
        cls,
        value: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `probability density function`_ at the given input domain ``value``, for a log-normal distribution with specified log ``mean`` and log standard deviation ``stdev``.

        If unspecified, the log mean defaults to ``0`` and the log standard deviation defaults to
        ``1``.

        .. _probability density function:
            https://en.wikipedia.org/wiki/Probability_density_function
        """
        return FunctionExpression("densityLogNormal", (value, mean, stdev))

    @classmethod
    def quantileLogNormal(
        cls,
        probability: IntoExpression,
        mean: IntoExpression = None,
        stdev: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the quantile value (the inverse of the `cumulative distribution function`_) for the given input ``probability``, for a log-normal distribution with specified log ``mean`` and log standard deviation ``stdev``.

        If unspecified, the log mean defaults to ``0`` and the log standard deviation defaults to
        ``1``.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("quantileLogNormal", (probability, mean, stdev))

    @classmethod
    def sampleUniform(
        cls, min: IntoExpression = None, max: IntoExpression = None, /
    ) -> Expression:
        """
        Returns a sample from a univariate `continuous uniform probability distribution`_ over the interval [``min``, ``max``).

        If unspecified, ``min`` defaults to ``0`` and ``max`` defaults to ``1``. If only one
        argument is provided, it is interpreted as the ``max`` value.

        .. _continuous uniform probability distribution:
            https://en.wikipedia.org/wiki/Continuous_uniform_distribution
        """
        return FunctionExpression("sampleUniform", (min, max))

    @classmethod
    def cumulativeUniform(
        cls,
        value: IntoExpression,
        min: IntoExpression = None,
        max: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `cumulative distribution function`_ at the given input domain ``value`` for a uniform distribution over the interval [``min``, ``max``).

        If unspecified, ``min`` defaults to ``0`` and ``max`` defaults to ``1``. If only one
        argument is provided, it is interpreted as the ``max`` value.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("cumulativeUniform", (value, min, max))

    @classmethod
    def densityUniform(
        cls,
        value: IntoExpression,
        min: IntoExpression = None,
        max: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the value of the `probability density function`_ at the given input domain ``value``,  for a uniform distribution over the interval [``min``, ``max``).

        If unspecified, ``min`` defaults to ``0`` and ``max`` defaults to ``1``. If only one
        argument is provided, it is interpreted as the ``max`` value.

        .. _probability density function:
            https://en.wikipedia.org/wiki/Probability_density_function
        """
        return FunctionExpression("densityUniform", (value, min, max))

    @classmethod
    def quantileUniform(
        cls,
        probability: IntoExpression,
        min: IntoExpression = None,
        max: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns the quantile value (the inverse of the `cumulative distribution function`_) for the given input ``probability``,  for a uniform distribution over the interval [``min``, ``max``).

        If unspecified, ``min`` defaults to ``0`` and ``max`` defaults to ``1``. If only one
        argument is provided, it is interpreted as the ``max`` value.

        .. _cumulative distribution function:
            https://en.wikipedia.org/wiki/Cumulative_distribution_function
        """
        return FunctionExpression("quantileUniform", (probability, min, max))

    @classmethod
    def now(cls) -> Expression:
        """Returns the timestamp for the current time."""
        return FunctionExpression("now", ())

    @classmethod
    def datetime(
        cls,
        year: IntoExpression,
        month: IntoExpression,
        day: IntoExpression = None,
        hour: IntoExpression = None,
        min: IntoExpression = None,
        sec: IntoExpression = None,
        millisec: IntoExpression = None,
        /,
    ) -> Expression:
        """
        Returns a new ``Date`` instance.

        The ``month`` is 0-based, such that ``1`` represents February.
        """
        return FunctionExpression(
            "datetime", (year, month, day, hour, min, sec, millisec)
        )

    @classmethod
    def date(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the day of the month for the given ``datetime`` value, in local time."""
        return FunctionExpression("date", (datetime,))

    @classmethod
    def day(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the day of the week for the given ``datetime`` value, in local time."""
        return FunctionExpression("day", (datetime,))

    @classmethod
    def dayofyear(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the one-based day of the year for the given ``datetime`` value, in local time."""
        return FunctionExpression("dayofyear", (datetime,))

    @classmethod
    def year(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the year for the given ``datetime`` value, in local time."""
        return FunctionExpression("year", (datetime,))

    @classmethod
    def quarter(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the quarter of the year (0-3) for the given ``datetime`` value, in local time."""
        return FunctionExpression("quarter", (datetime,))

    @classmethod
    def month(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the (zero-based) month for the given ``datetime`` value, in local time."""
        return FunctionExpression("month", (datetime,))

    @classmethod
    def week(cls, date: IntoExpression, /) -> Expression:
        """
        Returns the week number of the year for the given *datetime*, in local time.

        This function assumes Sunday-based weeks. Days before the first Sunday of the year are
        considered to be in week 0, the first Sunday of the year is the start of week 1, the second
        Sunday week 2, *etc.*.
        """
        return FunctionExpression("week", (date,))

    @classmethod
    def hours(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the hours component for the given ``datetime`` value, in local time."""
        return FunctionExpression("hours", (datetime,))

    @classmethod
    def minutes(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the minutes component for the given ``datetime`` value, in local time."""
        return FunctionExpression("minutes", (datetime,))

    @classmethod
    def seconds(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the seconds component for the given ``datetime`` value, in local time."""
        return FunctionExpression("seconds", (datetime,))

    @classmethod
    def milliseconds(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the milliseconds component for the given ``datetime`` value, in local time."""
        return FunctionExpression("milliseconds", (datetime,))

    @classmethod
    def time(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the epoch-based timestamp for the given ``datetime`` value."""
        return FunctionExpression("time", (datetime,))

    @classmethod
    def timezoneoffset(cls, datetime: IntoExpression, /) -> Expression:
        """Returns the timezone offset from the local timezone to UTC for the given ``datetime`` value."""
        return FunctionExpression("timezoneoffset", (datetime,))

    @classmethod
    def timeOffset(
        cls, unit: IntoExpression, date: IntoExpression, step: IntoExpression = None, /
    ) -> Expression:
        """
        Returns a new ``Date`` instance that offsets the given ``date`` by the specified time `*unit*`_ in the local timezone.

        The optional ``step`` argument indicates the number of time unit steps to offset by (default
        1).

        .. _*unit*:
            https://vega.github.io/vega/docs/api/time/#time-units
        """
       
Download .txt
gitextract_edckvuj_/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── dependabot.yaml
│   ├── pull_request_template.md
│   ├── release.yml
│   └── workflows/
│       ├── build-free-threaded.yml
│       ├── build.yml
│       ├── check-pr.yml
│       ├── docbuild.yml
│       ├── lint.yml
│       └── weekly.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── NOTES_FOR_MAINTAINERS.md
├── README.md
├── RELEASING.md
├── altair/
│   ├── __init__.py
│   ├── _magics.py
│   ├── datasets/
│   │   ├── __init__.py
│   │   ├── _cache.py
│   │   ├── _constraints.py
│   │   ├── _data.py
│   │   ├── _exceptions.py
│   │   ├── _loader.py
│   │   ├── _metadata/
│   │   │   └── metadata.parquet
│   │   ├── _reader.py
│   │   ├── _readimpl.py
│   │   └── _typing.py
│   ├── expr/
│   │   ├── __init__.py
│   │   ├── consts.py
│   │   ├── core.py
│   │   └── funcs.py
│   ├── jupyter/
│   │   ├── __init__.py
│   │   ├── js/
│   │   │   ├── README.md
│   │   │   └── index.js
│   │   └── jupyter_chart.py
│   ├── py.typed
│   ├── theme.py
│   ├── typing/
│   │   └── __init__.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── _dfi_types.py
│   │   ├── _importers.py
│   │   ├── _show.py
│   │   ├── _transformed_data.py
│   │   ├── _vegafusion_data.py
│   │   ├── compiler.py
│   │   ├── core.py
│   │   ├── data.py
│   │   ├── deprecation.py
│   │   ├── display.py
│   │   ├── execeval.py
│   │   ├── html.py
│   │   ├── mimebundle.py
│   │   ├── plugin_registry.py
│   │   ├── save.py
│   │   ├── schemapi.py
│   │   ├── selection.py
│   │   └── server.py
│   └── vegalite/
│       ├── __init__.py
│       ├── api.py
│       ├── data.py
│       ├── display.py
│       ├── schema.py
│       └── v6/
│           ├── __init__.py
│           ├── api.py
│           ├── compiler.py
│           ├── data.py
│           ├── display.py
│           ├── schema/
│           │   ├── __init__.py
│           │   ├── _config.py
│           │   ├── _typing.py
│           │   ├── channels.py
│           │   ├── core.py
│           │   ├── mixins.py
│           │   ├── vega-lite-schema.json
│           │   └── vega-themes.json
│           └── theme.py
├── doc/
│   ├── .gitignore
│   ├── _static/
│   │   ├── altair-gallery.css
│   │   ├── altair-plot.css
│   │   ├── chart.html
│   │   ├── custom.css
│   │   └── theme_overrides.css
│   ├── _templates/
│   │   ├── class.rst
│   │   ├── navbar-project.html
│   │   └── sidebar-logo.html
│   ├── about/
│   │   ├── citing.rst
│   │   ├── code_of_conduct.rst
│   │   ├── governance.rst
│   │   ├── roadmap.rst
│   │   └── versioning.rst
│   ├── case_studies/
│   │   ├── exploring-weather.rst
│   │   ├── index.rst
│   │   └── numpy-tooltip-images.rst
│   ├── conf.py
│   ├── getting_started/
│   │   ├── getting_help.rst
│   │   ├── installation.rst
│   │   ├── overview.rst
│   │   ├── project_philosophy.rst
│   │   ├── resources.rst
│   │   └── starting.rst
│   ├── index.rst
│   ├── releases/
│   │   └── changes.rst
│   └── user_guide/
│       ├── api.rst
│       ├── compound_charts.rst
│       ├── configuration.rst
│       ├── custom_renderers.rst
│       ├── customization.rst
│       ├── data.rst
│       ├── data_transformers.rst
│       ├── display_frontends.rst
│       ├── encodings/
│       │   ├── channel_options.rst
│       │   ├── channels.rst
│       │   └── index.rst
│       ├── interactions/
│       │   ├── bindings_widgets.rst
│       │   ├── expressions.rst
│       │   ├── index.rst
│       │   ├── jupyter_chart.rst
│       │   └── parameters.rst
│       ├── internals.rst
│       ├── large_datasets.rst
│       ├── marks/
│       │   ├── arc.rst
│       │   ├── area.rst
│       │   ├── bar.rst
│       │   ├── boxplot.rst
│       │   ├── circle.rst
│       │   ├── errorband.rst
│       │   ├── errorbar.rst
│       │   ├── geoshape.rst
│       │   ├── image.rst
│       │   ├── index.rst
│       │   ├── line.rst
│       │   ├── point.rst
│       │   ├── rect.rst
│       │   ├── rule.rst
│       │   ├── square.rst
│       │   ├── text.rst
│       │   ├── tick.rst
│       │   └── trail.rst
│       ├── saving_charts.rst
│       ├── scale_resolve.rst
│       ├── times_and_dates.rst
│       └── transform/
│           ├── aggregate.rst
│           ├── bin.rst
│           ├── calculate.rst
│           ├── density.rst
│           ├── extent.rst
│           ├── filter.rst
│           ├── flatten.rst
│           ├── fold.rst
│           ├── impute.rst
│           ├── index.rst
│           ├── joinaggregate.rst
│           ├── loess.rst
│           ├── lookup.rst
│           ├── pivot.rst
│           ├── quantile.rst
│           ├── regression.rst
│           ├── sample.rst
│           ├── stack.rst
│           ├── timeunit.rst
│           └── window.rst
├── paper/
│   ├── paper.bib
│   └── paper.md
├── pyproject.toml
├── sphinxext/
│   ├── __init__.py
│   ├── altairgallery.py
│   ├── code_ref.py
│   ├── schematable.py
│   └── utils.py
├── tests/
│   ├── __init__.py
│   ├── altair_theme_test.py
│   ├── examples_arguments_syntax/
│   │   ├── __init__.py
│   │   ├── airport_connections.py
│   │   ├── annual_weather_heatmap.py
│   │   ├── anscombe_plot.py
│   │   ├── area_chart_gradient.py
│   │   ├── area_faceted.py
│   │   ├── bar_and_line_with_dual_axis.py
│   │   ├── bar_chart_faceted_compact.py
│   │   ├── bar_chart_horizontal.py
│   │   ├── bar_chart_sorted.py
│   │   ├── bar_chart_with_highlighted_bar.py
│   │   ├── bar_chart_with_highlighted_segment.py
│   │   ├── bar_chart_with_labels.py
│   │   ├── bar_chart_with_labels_measured_luminance.py
│   │   ├── bar_chart_with_mean_line.py
│   │   ├── bar_chart_with_negatives.py
│   │   ├── bar_chart_with_range.py
│   │   ├── bar_chart_with_single_threshold.py
│   │   ├── bar_faceted_stacked.py
│   │   ├── bar_rounded.py
│   │   ├── bar_with_rolling_mean.py
│   │   ├── beckers_barley_facet.py
│   │   ├── beckers_barley_wrapped_facet.py
│   │   ├── boxplot.py
│   │   ├── bubble_plot.py
│   │   ├── bump_chart.py
│   │   ├── calculate_residuals.py
│   │   ├── candlestick_chart.py
│   │   ├── choropleth.py
│   │   ├── choropleth_repeat.py
│   │   ├── co2_concentration.py
│   │   ├── comet_chart.py
│   │   ├── cumulative_count_chart.py
│   │   ├── dendrogram.py
│   │   ├── density_repeat.py
│   │   ├── density_stack.py
│   │   ├── deviation_ellipses.py
│   │   ├── distributions_and_medians_of_likert_scale_ratings.py
│   │   ├── distributions_faceted_histogram.py
│   │   ├── diverging_stacked_bar_chart.py
│   │   ├── donut_chart.py
│   │   ├── dot_dash_plot.py
│   │   ├── empirical_cumulative_distribution_function.py
│   │   ├── errorbars_with_ci.py
│   │   ├── errorbars_with_std.py
│   │   ├── falkensee.py
│   │   ├── filled_step_chart.py
│   │   ├── gantt_chart.py
│   │   ├── gapminder_bubble_plot.py
│   │   ├── groupby-map.py
│   │   ├── grouped_bar_chart.py
│   │   ├── grouped_bar_chart2.py
│   │   ├── grouped_bar_chart_horizontal.py
│   │   ├── grouped_bar_chart_overlapping_bars.py
│   │   ├── grouped_bar_chart_with_error_bars.py
│   │   ├── heat_lane.py
│   │   ├── hexbins.py
│   │   ├── histogram_gradient_color.py
│   │   ├── histogram_heatmap.py
│   │   ├── histogram_responsive.py
│   │   ├── histogram_scatterplot.py
│   │   ├── histogram_with_a_global_mean_overlay.py
│   │   ├── horizon_graph.py
│   │   ├── horizontal_stacked_bar_chart.py
│   │   ├── interactive_aggregation.py
│   │   ├── interactive_bar_select_highlight.py
│   │   ├── interactive_brush.py
│   │   ├── interactive_column_selection.py
│   │   ├── interactive_cross_highlight.py
│   │   ├── interactive_layered_crossfilter.py
│   │   ├── interactive_legend.py
│   │   ├── interactive_reorder_stacked_bars.py
│   │   ├── interactive_scatter_plot.py
│   │   ├── interval_selection.py
│   │   ├── interval_selection_map_quakes.py
│   │   ├── iowa_electricity.py
│   │   ├── isotype.py
│   │   ├── isotype_emoji.py
│   │   ├── isotype_grid.py
│   │   ├── lasagna_plot.py
│   │   ├── layer_line_color_rule.py
│   │   ├── layered_area_chart.py
│   │   ├── layered_bar_chart.py
│   │   ├── layered_chart_bar_mark.py
│   │   ├── layered_chart_with_dual_axis.py
│   │   ├── layered_heatmap_text.py
│   │   ├── layered_histogram.py
│   │   ├── line_chart_with_arrows.py
│   │   ├── line_chart_with_color_datum.py
│   │   ├── line_chart_with_cumsum.py
│   │   ├── line_chart_with_cumsum_faceted.py
│   │   ├── line_chart_with_custom_legend.py
│   │   ├── line_chart_with_datum.py
│   │   ├── line_chart_with_generator.py
│   │   ├── line_chart_with_interpolation.py
│   │   ├── line_chart_with_points.py
│   │   ├── line_chart_with_points_stroked.py
│   │   ├── line_custom_order.py
│   │   ├── line_percent.py
│   │   ├── line_with_ci.py
│   │   ├── line_with_last_value_labeled.py
│   │   ├── line_with_log_scale.py
│   │   ├── london_tube.py
│   │   ├── maps_faceted_species.py
│   │   ├── mosaic_with_labels.py
│   │   ├── multi_series_line.py
│   │   ├── multifeature_scatter_plot.py
│   │   ├── multiline_highlight.py
│   │   ├── multiline_tooltip.py
│   │   ├── multiline_tooltip_standard.py
│   │   ├── multiple_interactions.py
│   │   ├── natural_disasters.py
│   │   ├── normalized_stacked_area_chart.py
│   │   ├── normalized_stacked_bar_chart.py
│   │   ├── normed_parallel_coordinates.py
│   │   ├── one_dot_per_zipcode.py
│   │   ├── pacman_chart.py
│   │   ├── parallel_coordinates.py
│   │   ├── percentage_of_total.py
│   │   ├── pie_chart.py
│   │   ├── pie_chart_with_labels.py
│   │   ├── point_map.py
│   │   ├── polar_bar_chart.py
│   │   ├── poly_fit_regression.py
│   │   ├── pyramid.py
│   │   ├── radial_chart.py
│   │   ├── ranged_dot_plot.py
│   │   ├── ridgeline_plot.py
│   │   ├── scatter_faceted.py
│   │   ├── scatter_href.py
│   │   ├── scatter_linked_brush.py
│   │   ├── scatter_linked_table.py
│   │   ├── scatter_marginal_hist.py
│   │   ├── scatter_matrix.py
│   │   ├── scatter_point_paths_hover.py
│   │   ├── scatter_qq.py
│   │   ├── scatter_tooltips.py
│   │   ├── scatter_with_histogram.py
│   │   ├── scatter_with_labels.py
│   │   ├── scatter_with_layered_histogram.py
│   │   ├── scatter_with_loess.py
│   │   ├── scatter_with_minimap.py
│   │   ├── scatter_with_rolling_mean.py
│   │   ├── scatter_with_shaded_area.py
│   │   ├── seattle_weather_interactive.py
│   │   ├── select_detail.py
│   │   ├── select_mark_area.py
│   │   ├── selection_histogram.py
│   │   ├── selection_layer_bar_month.py
│   │   ├── selection_zorder.py
│   │   ├── simple_bar_chart.py
│   │   ├── simple_heatmap.py
│   │   ├── simple_histogram.py
│   │   ├── simple_line_chart.py
│   │   ├── simple_scatter_with_errorbars.py
│   │   ├── simple_stacked_area_chart.py
│   │   ├── slider_cutoff.py
│   │   ├── slope_graph.py
│   │   ├── sorted_error_bars_with_ci.py
│   │   ├── stacked_bar_chart.py
│   │   ├── stacked_bar_chart_sorted_segments.py
│   │   ├── stacked_bar_chart_with_text.py
│   │   ├── stem_and_leaf.py
│   │   ├── step_chart.py
│   │   ├── streamgraph.py
│   │   ├── strip_plot.py
│   │   ├── strip_plot_jitter.py
│   │   ├── table_bubble_plot_github.py
│   │   ├── top_k_items.py
│   │   ├── top_k_letters.py
│   │   ├── top_k_with_others.py
│   │   ├── trail_marker.py
│   │   ├── us_employment.py
│   │   ├── us_incomebrackets_by_state_facet.py
│   │   ├── us_population_over_time.py
│   │   ├── us_population_over_time_facet.py
│   │   ├── us_population_pyramid_over_time.py
│   │   ├── us_state_capitals.py
│   │   ├── violin_plot.py
│   │   ├── waterfall_chart.py
│   │   ├── wheat_wages.py
│   │   ├── wilkinson-dot-plot.py
│   │   ├── wind_vector_map.py
│   │   ├── window_rank.py
│   │   ├── world_map.py
│   │   └── world_projections.py
│   ├── examples_methods_syntax/
│   │   ├── __init__.py
│   │   ├── airport_connections.py
│   │   ├── annual_weather_heatmap.py
│   │   ├── anscombe_plot.py
│   │   ├── area_faceted.py
│   │   ├── bar_chart_faceted_compact.py
│   │   ├── bar_chart_sorted.py
│   │   ├── bar_chart_with_labels_measured_luminance.py
│   │   ├── bar_chart_with_range.py
│   │   ├── bar_chart_with_single_threshold.py
│   │   ├── beckers_barley_facet.py
│   │   ├── beckers_barley_wrapped_facet.py
│   │   ├── bump_chart.py
│   │   ├── calculate_residuals.py
│   │   ├── candlestick_chart.py
│   │   ├── co2_concentration.py
│   │   ├── comet_chart.py
│   │   ├── cumulative_count_chart.py
│   │   ├── density_repeat.py
│   │   ├── density_stack.py
│   │   ├── deviation_ellipses.py
│   │   ├── distributions_and_medians_of_likert_scale_ratings.py
│   │   ├── distributions_faceted_histogram.py
│   │   ├── diverging_stacked_bar_chart.py
│   │   ├── donut_chart.py
│   │   ├── errorbars_with_ci.py
│   │   ├── errorbars_with_std.py
│   │   ├── falkensee.py
│   │   ├── gapminder_bubble_plot.py
│   │   ├── groupby-map.py
│   │   ├── grouped_bar_chart2.py
│   │   ├── grouped_bar_chart_overlapping_bars.py
│   │   ├── grouped_bar_chart_with_error_bars.py
│   │   ├── heat_lane.py
│   │   ├── hexbins.py
│   │   ├── histogram_gradient_color.py
│   │   ├── histogram_heatmap.py
│   │   ├── histogram_responsive.py
│   │   ├── histogram_scatterplot.py
│   │   ├── histogram_with_a_global_mean_overlay.py
│   │   ├── horizon_graph.py
│   │   ├── interactive_aggregation.py
│   │   ├── interactive_bar_select_highlight.py
│   │   ├── interactive_column_selection.py
│   │   ├── interactive_cross_highlight.py
│   │   ├── interactive_layered_crossfilter.py
│   │   ├── interactive_legend.py
│   │   ├── interval_selection.py
│   │   ├── interval_selection_map_quakes.py
│   │   ├── iowa_electricity.py
│   │   ├── isotype.py
│   │   ├── isotype_emoji.py
│   │   ├── isotype_grid.py
│   │   ├── lasagna_plot.py
│   │   ├── layered_area_chart.py
│   │   ├── layered_bar_chart.py
│   │   ├── layered_chart_with_dual_axis.py
│   │   ├── layered_heatmap_text.py
│   │   ├── layered_histogram.py
│   │   ├── line_chart_with_color_datum.py
│   │   ├── line_chart_with_cumsum.py
│   │   ├── line_chart_with_cumsum_faceted.py
│   │   ├── line_chart_with_custom_legend.py
│   │   ├── line_custom_order.py
│   │   ├── line_percent.py
│   │   ├── line_with_ci.py
│   │   ├── line_with_last_value_labeled.py
│   │   ├── line_with_log_scale.py
│   │   ├── london_tube.py
│   │   ├── maps_faceted_species.py
│   │   ├── mosaic_with_labels.py
│   │   ├── multifeature_scatter_plot.py
│   │   ├── multiline_highlight.py
│   │   ├── multiline_tooltip.py
│   │   ├── multiline_tooltip_standard.py
│   │   ├── multiple_interactions.py
│   │   ├── natural_disasters.py
│   │   ├── normalized_stacked_area_chart.py
│   │   ├── normalized_stacked_bar_chart.py
│   │   ├── pacman_chart.py
│   │   ├── parallel_coordinates.py
│   │   ├── percentage_of_total.py
│   │   ├── pie_chart.py
│   │   ├── pie_chart_with_labels.py
│   │   ├── polar_bar_chart.py
│   │   ├── poly_fit_regression.py
│   │   ├── pyramid.py
│   │   ├── radial_chart.py
│   │   ├── ranged_dot_plot.py
│   │   ├── ridgeline_plot.py
│   │   ├── scatter_linked_table.py
│   │   ├── scatter_marginal_hist.py
│   │   ├── scatter_point_paths_hover.py
│   │   ├── scatter_with_layered_histogram.py
│   │   ├── scatter_with_minimap.py
│   │   ├── scatter_with_rolling_mean.py
│   │   ├── seattle_weather_interactive.py
│   │   ├── select_detail.py
│   │   ├── simple_scatter_with_errorbars.py
│   │   ├── sorted_error_bars_with_ci.py
│   │   ├── stacked_bar_chart_sorted_segments.py
│   │   ├── stacked_bar_chart_with_text.py
│   │   ├── stem_and_leaf.py
│   │   ├── streamgraph.py
│   │   ├── strip_plot_jitter.py
│   │   ├── top_k_items.py
│   │   ├── top_k_letters.py
│   │   ├── top_k_with_others.py
│   │   ├── us_employment.py
│   │   ├── us_population_over_time.py
│   │   ├── us_population_over_time_facet.py
│   │   ├── us_population_pyramid_over_time.py
│   │   ├── us_state_capitals.py
│   │   ├── violin_plot.py
│   │   ├── wheat_wages.py
│   │   ├── wilkinson-dot-plot.py
│   │   ├── wind_vector_map.py
│   │   └── window_rank.py
│   ├── expr/
│   │   ├── __init__.py
│   │   └── test_expr.py
│   ├── test_datasets.py
│   ├── test_examples.py
│   ├── test_jupyter_chart.py
│   ├── test_magics.py
│   ├── test_toplevel.py
│   ├── test_transformed_data.py
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── test_compiler.py
│   │   ├── test_core.py
│   │   ├── test_data.py
│   │   ├── test_deprecation.py
│   │   ├── test_execeval.py
│   │   ├── test_html.py
│   │   ├── test_mimebundle.py
│   │   ├── test_plugin_registry.py
│   │   ├── test_schemapi.py
│   │   ├── test_server.py
│   │   ├── test_to_values_narwhals.py
│   │   └── test_utils.py
│   └── vegalite/
│       ├── __init__.py
│       ├── test_common.py
│       └── v6/
│           ├── __init__.py
│           ├── schema/
│           │   ├── __init__.py
│           │   └── test_channels.py
│           ├── test_alias.py
│           ├── test_api.py
│           ├── test_data.py
│           ├── test_display.py
│           ├── test_geo_interface.py
│           ├── test_layer_props.py
│           ├── test_params.py
│           ├── test_renderers.py
│           └── test_theme.py
└── tools/
    ├── __init__.py
    ├── cleanup_nightlies.py
    ├── codemod.py
    ├── datasets/
    │   ├── __init__.py
    │   ├── datapackage.py
    │   ├── models.py
    │   └── npm.py
    ├── fs.py
    ├── generate_api_docs.py
    ├── generate_nightly_version.py
    ├── generate_schema_wrapper.py
    ├── markup.py
    ├── schemapi/
    │   ├── __init__.py
    │   ├── codegen.py
    │   ├── schemapi.py
    │   └── utils.py
    ├── sync_website.py
    ├── update_init_file.py
    ├── vega_expr.py
    └── versioning.py
Download .txt
Showing preview only (313K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4110 symbols across 107 files)

FILE: altair/__init__.py
  function __dir__ (line 653) | def __dir__():
  function load_ipython_extension (line 665) | def load_ipython_extension(ipython):
  function __getattr__ (line 671) | def __getattr__(name: str):

FILE: altair/_magics.py
  function _prepare_data (line 31) | def _prepare_data(data, data_transformers):
  function _get_variable (line 46) | def _get_variable(name: str) -> Any:
  function vegalite (line 71) | def vegalite(line, cell) -> vegalite_v6.VegaLite:

FILE: altair/datasets/__init__.py
  function url (line 124) | def url(
  function __getattr__ (line 173) | def __getattr__(name):

FILE: altair/datasets/_cache.py
  function _iter_metadata (line 93) | def _iter_metadata(df: nw.DataFrame[Any], /) -> Iterator[Metadata]:
  class CompressedCache (line 104) | class CompressedCache(Protocol[_KT, _VT]):
    method read (line 108) | def read(self) -> Any: ...
    method __getitem__ (line 109) | def __getitem__(self, key: _KT, /) -> _VT: ...
    method __enter__ (line 111) | def __enter__(self) -> IOBase:
    method __exit__ (line 116) | def __exit__(self, *args) -> None:
    method get (line 119) | def get(self, key: _KT, default: _T, /) -> _VT | _T:
    method mapping (line 123) | def mapping(self) -> MutableMapping[_KT, _VT]:
  class CsvCache (line 129) | class CsvCache(CompressedCache["_Dataset", "Metadata"]):
    method __init__ (line 150) | def __init__(
    method read (line 158) | def read(self) -> Any:
    method _convert_row (line 167) | def _convert_row(
    method rotated (line 180) | def rotated(self) -> Mapping[str, Sequence[Any]]:
    method __getitem__ (line 188) | def __getitem__(self, key: _Dataset, /) -> Metadata:
    method url (line 194) | def url(self, name: _Dataset, /) -> str:
    method __repr__ (line 200) | def __repr__(self) -> str:
  class SchemaCache (line 204) | class SchemaCache(CompressedCache["_Dataset", "_FlSchema"]):
    method __init__ (line 222) | def __init__(
    method read (line 231) | def read(self) -> Any:
    method __getitem__ (line 237) | def __getitem__(self, key: _Dataset, /) -> _FlSchema:
    method by_dtype (line 240) | def by_dtype(self, name: _Dataset, *dtypes: type[DType]) -> list[str]:
    method is_active (line 257) | def is_active(self) -> bool:
    method schema (line 265) | def schema(self, name: _Dataset, /) -> nw.Schema:
    method schema_kwds (line 269) | def schema_kwds(self, meta: Metadata, /) -> dict[str, Any]:
  class _SupportsScanMetadata (line 294) | class _SupportsScanMetadata(Protocol):
    method _scan_metadata (line 297) | def _scan_metadata(
  class DatasetCache (line 302) | class DatasetCache:
    method __init__ (line 310) | def __init__(self, reader: _SupportsScanMetadata, /) -> None:
    method clear (line 313) | def clear(self) -> None:
    method download_all (line 331) | def download_all(self) -> None:
    method _maybe_download (line 354) | def _maybe_download(self, meta: Metadata, /) -> Path:
    method _download_one (line 362) | def _download_one(self, url: str, fp: Path, /) -> Path:
    method path (line 369) | def path(self) -> Path:
    method path (line 404) | def path(self, source: StrPath | None, /) -> None:
    method path_meta (line 410) | def path_meta(self, meta: Metadata, /) -> Path:
    method __iter__ (line 413) | def __iter__(self) -> Iterator[Path]:
    method __repr__ (line 416) | def __repr__(self) -> str:
    method is_active (line 423) | def is_active(self) -> bool:
    method is_not_active (line 426) | def is_not_active(self) -> bool:
    method is_empty (line 429) | def is_empty(self) -> bool:
    method _ensure_active (line 433) | def _ensure_active(self) -> None:
  function __getattr__ (line 450) | def __getattr__(name):

FILE: altair/datasets/_constraints.py
  class MetaIs (line 40) | class MetaIs(Set[tuple[str, Any]]):
    method __init__ (line 43) | def __init__(self, kwds: frozenset[tuple[str, Any]], /) -> None:
    method from_metadata (line 47) | def from_metadata(cls, meta: Metadata, /) -> MetaIs:
    method to_metadata (line 50) | def to_metadata(self) -> Metadata:
    method to_expr (line 59) | def to_expr(self) -> nw.Expr:
    method isdisjoint (line 66) | def isdisjoint(self, other: Iterable[Any]) -> bool:
    method issubset (line 69) | def issubset(self, other: Iterable[Any]) -> bool:
    method __call__ (line 72) | def __call__(self, meta: Items, /) -> bool:
    method __hash__ (line 75) | def __hash__(self) -> int:
    method __contains__ (line 78) | def __contains__(self, x: object) -> bool:
    method __iter__ (line 81) | def __iter__(self) -> Iterator[tuple[str, Any]]:
    method __len__ (line 84) | def __len__(self) -> int:
    method __setattr__ (line 87) | def __setattr__(self, name: str, value: Any):
    method __repr__ (line 94) | def __repr__(self) -> str:
  function is_meta (line 107) | def is_meta(**kwds: Unpack[Metadata]) -> MetaIs:

FILE: altair/datasets/_data.py
  class DatasetAccessor (line 25) | class DatasetAccessor:
    method __init__ (line 60) | def __init__(self, name: Dataset, backend: _Backend = "pandas") -> None:
    method _call_impl (line 92) | def _call_impl(
    method _loader (line 102) | def _loader(self) -> Loader[t.Any, t.Any]:
    method _loader (line 109) | def _loader(self, value: Loader[t.Any, t.Any]) -> None:
    method url (line 113) | def url(self) -> str:
    method load (line 131) | def load(self, *, engine: _Backend | None = None, **kwds: t.Any) -> t....
    method __repr__ (line 158) | def __repr__(self) -> str:
    method __call__ (line 162) | def __call__(
    method __call__ (line 170) | def __call__(
    method __call__ (line 178) | def __call__(
    method __call__ (line 186) | def __call__(
    method __call__ (line 193) | def __call__(
  class DataObject (line 226) | class DataObject:
    method __init__ (line 255) | def __init__(self, backend: _Backend = "pandas") -> None:
    method _get_dataset_names (line 260) | def _get_dataset_names(self) -> list[Dataset | LiteralString]:
    method __dir__ (line 273) | def __dir__(self) -> list[str]:
    method __getattr__ (line 279) | def __getattr__(self, name: Dataset) -> DatasetAccessor:  # type: igno...
    method set_default_engine (line 291) | def set_default_engine(self, engine: _Backend) -> None:
    method list_datasets (line 312) | def list_datasets(self) -> list[Dataset | LiteralString]:
    method get_default_engine (line 332) | def get_default_engine(self) -> _Backend:
    method __repr__ (line 353) | def __repr__(self) -> str:

FILE: altair/datasets/_exceptions.py
  class AltairDatasetsError (line 12) | class AltairDatasetsError(Exception):
    method from_url (line 14) | def from_url(cls, meta: Metadata, /) -> AltairDatasetsError:
    method from_tabular (line 30) | def from_tabular(cls, meta: Metadata, backend_name: str, /) -> AltairD...
    method from_priority (line 52) | def from_priority(cls, priority: Sequence[_Backend], /) -> AltairDatas...
  function module_not_found (line 57) | def module_not_found(
  function _failed_url (line 74) | def _failed_url(meta: Metadata, /) -> str:
  function _failed_tabular (line 78) | def _failed_tabular(meta: Metadata, /) -> str:
  function _why (line 82) | def _why(what: str, backend_name: str, /) -> str:
  function _suggest_url (line 86) | def _suggest_url(meta: Metadata, *install_other: str) -> str:
  function _implementation_not_found (line 98) | def _implementation_not_found(meta: Metadata, /) -> str:

FILE: altair/datasets/_loader.py
  class Loader (line 31) | class Loader(Generic[IntoDataFrameT, IntoLazyFrameT]):
    method from_backend (line 51) | def from_backend(
    method from_backend (line 57) | def from_backend(
    method from_backend (line 63) | def from_backend(cls, backend_name: Literal["pyarrow"], /) -> Loader[p...
    method from_backend (line 66) | def from_backend(
    method from_reader (line 129) | def from_reader(cls, reader: Reader[IntoDataFrameT, IntoLazyFrameT], /...
    method __call__ (line 134) | def __call__(
    method url (line 223) | def url(
    method cache (line 266) | def cache(self) -> DatasetCache:
    method __repr__ (line 288) | def __repr__(self) -> str:
  class _Load (line 293) | class _Load(Loader[IntoDataFrameT, IntoLazyFrameT]):
    method __call__ (line 295) | def __call__(  # pyright: ignore[reportOverlappingOverload]
    method __call__ (line 304) | def __call__(
    method __call__ (line 313) | def __call__(
    method __call__ (line 322) | def __call__(
    method __call__ (line 330) | def __call__(
  function __getattr__ (line 347) | def __getattr__(name):

FILE: altair/datasets/_reader.py
  class Reader (line 120) | class Reader(Generic[IntoDataFrameT, IntoLazyFrameT]):
    method __init__ (line 154) | def __init__(
    method __repr__ (line 167) | def __repr__(self) -> str:
    method read_fn (line 177) | def read_fn(self, meta: Metadata, /) -> Callable[..., IntoDataFrameT]:
    method scan_fn (line 180) | def scan_fn(self, meta: Metadata | Path | str, /) -> Callable[..., Int...
    method cache (line 185) | def cache(self) -> DatasetCache:
    method _handle_pyarrow_date_error (line 188) | def _handle_pyarrow_date_error(self, e: Exception, name: str) -> None:
    method dataset (line 204) | def dataset(
    method url (line 230) | def url(
    method open_markdown (line 248) | def open_markdown(self, name: Dataset, /) -> None:
    method profile (line 275) | def profile(self, *, show: Literal[False] = ...) -> _SupportProfile: ...
    method profile (line 278) | def profile(self, *, show: Literal[True]) -> None: ...
    method profile (line 280) | def profile(self, *, show: bool = False) -> _SupportProfile | None:
    method _query (line 305) | def _query(
    method _merge_kwds (line 324) | def _merge_kwds(self, meta: Metadata, kwds: dict[str, Any], /) -> Mapp...
    method _metadata_frame (line 337) | def _metadata_frame(self) -> nw.LazyFrame[IntoLazyFrameT]:
    method _scan_metadata (line 341) | def _scan_metadata(
    method _solve (line 348) | def _solve(
  function _dataset_names (line 367) | def _dataset_names(
  class _NoParquetReader (line 380) | class _NoParquetReader(Reader[IntoDataFrameT]):
    method __repr__ (line 381) | def __repr__(self) -> str:
    method csv_cache (line 385) | def csv_cache(self) -> CsvCache:
    method _metadata_frame (line 391) | def _metadata_frame(self) -> nw.LazyFrame[Any]:
  function reader (line 398) | def reader(
  function reader (line 408) | def reader(
  function reader (line 417) | def reader(
  function infer_backend (line 435) | def infer_backend(
  function _from_backend (line 458) | def _from_backend(name: _Polars, /) -> Reader[pl.DataFrame, pl.LazyFrame...
  function _from_backend (line 460) | def _from_backend(name: _PandasAny, /) -> Reader[pd.DataFrame]: ...
  function _from_backend (line 462) | def _from_backend(name: _PyArrow, /) -> Reader[pa.Table]: ...
  function _from_backend (line 467) | def _from_backend(name: _Backend, /) -> Reader[Any, Any]:
  function _is_backend (line 488) | def _is_backend(obj: Any) -> TypeIs[_Backend]:
  function _is_err (line 492) | def _is_err(obj: Any) -> TypeIs[type[AltairDatasetsError]]:
  function _into_constraints (line 496) | def _into_constraints(
  function _is_eager_allowed (line 520) | def _is_eager_allowed(impl: nw.Implementation, /) -> TypeIs[_EagerAllowe...
  function _into_implementation (line 528) | def _into_implementation(
  function _into_suffix (line 544) | def _into_suffix(obj: Path | str, /) -> Any:
  function _steal_eager_parquet (line 554) | def _steal_eager_parquet(
  function _import_guarded (line 563) | def _import_guarded(req: _PandasAny, /) -> _Pandas: ...
  function _import_guarded (line 567) | def _import_guarded(req: _NwSupportT, /) -> _NwSupportT: ...
  function _import_guarded (line 571) | def _import_guarded(req: Requirement, /) -> LiteralString: ...
  function _import_guarded (line 574) | def _import_guarded(req: Any, /) -> LiteralString:
  function _requirements (line 584) | def _requirements(req: Requirement | str, /) -> tuple[Any, ...]:

FILE: altair/datasets/_readimpl.py
  class Skip (line 72) | class Skip(Enum):
    method __bool__ (line 77) | def __bool__(self) -> Literal[False]:
    method __repr__ (line 80) | def __repr__(self) -> Literal["<Skip>"]:
  class BaseImpl (line 84) | class BaseImpl(Generic[R]):
    method __init__ (line 113) | def __init__(
    method unwrap_or_skip (line 130) | def unwrap_or_skip(
    method _exclude_none (line 153) | def _exclude_none(cls) -> MetaIs:
    method __setattr__ (line 157) | def __setattr__(self, name: str, value: Any):
    method _inferred_package (line 165) | def _inferred_package(self) -> str:
    method __repr__ (line 168) | def __repr__(self) -> str:
    method __str__ (line 172) | def __str__(self) -> str:
    method _relevant_columns (line 183) | def _relevant_columns(self) -> Iterator[str]:
    method _include_expr (line 188) | def _include_expr(self) -> nw.Expr:
    method _exclude_expr (line 196) | def _exclude_expr(self) -> nw.Expr:
  function read (line 203) | def read(
  function scan (line 213) | def scan(
  function into_scan (line 223) | def into_scan(impl: Read[IntoDataFrameT], /) -> Scan[Any]:
  function is_available (line 234) | def is_available(
  function _root_package_name (line 256) | def _root_package_name(obj: Any, default: str, /) -> str:
  function _unwrap_partial (line 269) | def _unwrap_partial(fn: Any, /) -> Any:
  function pl_only (line 277) | def pl_only() -> tuple[Sequence[Read[pl.DataFrame]], Sequence[Scan[pl.La...
  function pd_only (line 301) | def pd_only() -> Sequence[Read[pd.DataFrame]]:
  function pd_pyarrow (line 327) | def pd_pyarrow() -> Sequence[Read[pd.DataFrame]]:
  function pa_any (line 350) | def pa_any() -> Sequence[Read[pa.Table]]:
  function _pa_read_json_impl (line 362) | def _pa_read_json_impl() -> Read[pa.Table]:
  function _pd_read_json (line 380) | def _pd_read_json(ns: ModuleType, /) -> Callable[..., pd.DataFrame]:
  function _pd_read_json_geopandas_impl (line 388) | def _pd_read_json_geopandas_impl() -> Read[pd.DataFrame]:
  function _pd_fix_dtypes_nw (line 398) | def _pd_fix_dtypes_nw(
  function _pd_read_json_to_arrow (line 409) | def _pd_read_json_to_arrow(ns: ModuleType, /) -> Callable[..., pa.Table]:
  function _pl_read_json_polars_st_impl (line 422) | def _pl_read_json_polars_st_impl() -> Read[pl.DataFrame]:
  function _pl_read_json_polars_st_topo_impl (line 432) | def _pl_read_json_polars_st_topo_impl() -> Read[pl.DataFrame]:
  function _pl_read_json_roundtrip (line 445) | def _pl_read_json_roundtrip(ns: ModuleType, /) -> Callable[..., pl.DataF...
  function _pl_read_json_roundtrip_to_arrow (line 477) | def _pl_read_json_roundtrip_to_arrow(ns: ModuleType, /) -> Callable[...,...
  function _stdlib_read_json (line 487) | def _stdlib_read_json(source: Path | Any, /) -> Any:
  function _stdlib_read_json_to_arrow (line 497) | def _stdlib_read_json_to_arrow(source: Path | Any, /, **kwds: Any) -> pa...

FILE: altair/datasets/_typing.py
  class Metadata (line 100) | class Metadata(TypedDict, total=False):

FILE: altair/expr/__init__.py
  class _ExprMeta (line 23) | class _ExprMeta(type):
    method NaN (line 31) | def NaN(cls) -> Expression:
    method LN10 (line 36) | def LN10(cls) -> Expression:
    method E (line 41) | def E(cls) -> Expression:
    method LOG10E (line 46) | def LOG10E(cls) -> Expression:
    method LOG2E (line 51) | def LOG2E(cls) -> Expression:
    method SQRT1_2 (line 56) | def SQRT1_2(cls) -> Expression:
    method LN2 (line 61) | def LN2(cls) -> Expression:
    method SQRT2 (line 66) | def SQRT2(cls) -> Expression:
    method PI (line 71) | def PI(cls) -> Expression:
  class expr (line 76) | class expr(_ExprRef, metaclass=_ExprMeta):
    method __new__ (line 242) | def __new__(cls: type[_ExprRef], expr: str) -> _ExprRef:  # type: igno...
    method isArray (line 246) | def isArray(cls, value: IntoExpression, /) -> Expression:
    method isBoolean (line 251) | def isBoolean(cls, value: IntoExpression, /) -> Expression:
    method isDate (line 256) | def isDate(cls, value: IntoExpression, /) -> Expression:
    method isDefined (line 266) | def isDefined(cls, value: IntoExpression, /) -> Expression:
    method isNumber (line 275) | def isNumber(cls, value: IntoExpression, /) -> Expression:
    method isObject (line 284) | def isObject(cls, value: IntoExpression, /) -> Expression:
    method isRegExp (line 289) | def isRegExp(cls, value: IntoExpression, /) -> Expression:
    method isString (line 294) | def isString(cls, value: IntoExpression, /) -> Expression:
    method isValid (line 299) | def isValid(cls, value: IntoExpression, /) -> Expression:
    method toBoolean (line 304) | def toBoolean(cls, value: IntoExpression, /) -> Expression:
    method toDate (line 313) | def toDate(cls, value: IntoExpression, /) -> Expression:
    method toNumber (line 324) | def toNumber(cls, value: IntoExpression, /) -> Expression:
    method toString (line 333) | def toString(cls, value: IntoExpression, /) -> Expression:
    method if_ (line 342) | def if_(
    method isNaN (line 358) | def isNaN(cls, value: IntoExpression, /) -> Expression:
    method isFinite (line 370) | def isFinite(cls, value: IntoExpression, /) -> Expression:
    method abs (line 382) | def abs(cls, value: IntoExpression, /) -> Expression:
    method acos (line 394) | def acos(cls, value: IntoExpression, /) -> Expression:
    method asin (line 406) | def asin(cls, value: IntoExpression, /) -> Expression:
    method atan (line 418) | def atan(cls, value: IntoExpression, /) -> Expression:
    method atan2 (line 430) | def atan2(cls, dy: IntoExpression, dx: IntoExpression, /) -> Expression:
    method ceil (line 442) | def ceil(cls, value: IntoExpression, /) -> Expression:
    method clamp (line 454) | def clamp(
    method cos (line 461) | def cos(cls, value: IntoExpression, /) -> Expression:
    method exp (line 473) | def exp(cls, exponent: IntoExpression, /) -> Expression:
    method floor (line 485) | def floor(cls, value: IntoExpression, /) -> Expression:
    method hypot (line 497) | def hypot(cls, value: IntoExpression, /) -> Expression:
    method log (line 509) | def log(cls, value: IntoExpression, /) -> Expression:
    method max (line 521) | def max(
    method min (line 535) | def min(
    method pow (line 549) | def pow(cls, value: IntoExpression, exponent: IntoExpression, /) -> Ex...
    method random (line 561) | def random(cls) -> Expression:
    method round (line 573) | def round(cls, value: IntoExpression, /) -> Expression:
    method sin (line 585) | def sin(cls, value: IntoExpression, /) -> Expression:
    method sqrt (line 597) | def sqrt(cls, value: IntoExpression, /) -> Expression:
    method tan (line 609) | def tan(cls, value: IntoExpression, /) -> Expression:
    method sampleNormal (line 621) | def sampleNormal(
    method cumulativeNormal (line 635) | def cumulativeNormal(
    method densityNormal (line 653) | def densityNormal(
    method quantileNormal (line 671) | def quantileNormal(
    method sampleLogNormal (line 689) | def sampleLogNormal(
    method cumulativeLogNormal (line 704) | def cumulativeLogNormal(
    method densityLogNormal (line 723) | def densityLogNormal(
    method quantileLogNormal (line 742) | def quantileLogNormal(
    method sampleUniform (line 761) | def sampleUniform(
    method cumulativeUniform (line 776) | def cumulativeUniform(
    method densityUniform (line 795) | def densityUniform(
    method quantileUniform (line 814) | def quantileUniform(
    method now (line 833) | def now(cls) -> Expression:
    method datetime (line 838) | def datetime(
    method date (line 859) | def date(cls, datetime: IntoExpression, /) -> Expression:
    method day (line 864) | def day(cls, datetime: IntoExpression, /) -> Expression:
    method dayofyear (line 869) | def dayofyear(cls, datetime: IntoExpression, /) -> Expression:
    method year (line 874) | def year(cls, datetime: IntoExpression, /) -> Expression:
    method quarter (line 879) | def quarter(cls, datetime: IntoExpression, /) -> Expression:
    method month (line 884) | def month(cls, datetime: IntoExpression, /) -> Expression:
    method week (line 889) | def week(cls, date: IntoExpression, /) -> Expression:
    method hours (line 900) | def hours(cls, datetime: IntoExpression, /) -> Expression:
    method minutes (line 905) | def minutes(cls, datetime: IntoExpression, /) -> Expression:
    method seconds (line 910) | def seconds(cls, datetime: IntoExpression, /) -> Expression:
    method milliseconds (line 915) | def milliseconds(cls, datetime: IntoExpression, /) -> Expression:
    method time (line 920) | def time(cls, datetime: IntoExpression, /) -> Expression:
    method timezoneoffset (line 925) | def timezoneoffset(cls, datetime: IntoExpression, /) -> Expression:
    method timeOffset (line 930) | def timeOffset(
    method timeSequence (line 945) | def timeSequence(
    method utc (line 965) | def utc(
    method utcdate (line 984) | def utcdate(cls, datetime: IntoExpression, /) -> Expression:
    method utcday (line 989) | def utcday(cls, datetime: IntoExpression, /) -> Expression:
    method utcdayofyear (line 994) | def utcdayofyear(cls, datetime: IntoExpression, /) -> Expression:
    method utcyear (line 999) | def utcyear(cls, datetime: IntoExpression, /) -> Expression:
    method utcquarter (line 1004) | def utcquarter(cls, datetime: IntoExpression, /) -> Expression:
    method utcmonth (line 1009) | def utcmonth(cls, datetime: IntoExpression, /) -> Expression:
    method utcweek (line 1014) | def utcweek(cls, date: IntoExpression, /) -> Expression:
    method utchours (line 1025) | def utchours(cls, datetime: IntoExpression, /) -> Expression:
    method utcminutes (line 1030) | def utcminutes(cls, datetime: IntoExpression, /) -> Expression:
    method utcseconds (line 1035) | def utcseconds(cls, datetime: IntoExpression, /) -> Expression:
    method utcmilliseconds (line 1040) | def utcmilliseconds(cls, datetime: IntoExpression, /) -> Expression:
    method utcOffset (line 1045) | def utcOffset(
    method utcSequence (line 1060) | def utcSequence(
    method extent (line 1080) | def extent(cls, array: IntoExpression, /) -> Expression:
    method clampRange (line 1085) | def clampRange(
    method indexof (line 1099) | def indexof(cls, array: IntoExpression, value: IntoExpression, /) -> E...
    method inrange (line 1104) | def inrange(cls, value: IntoExpression, range: IntoExpression, /) -> E...
    method join (line 1109) | def join(
    method lastindexof (line 1116) | def lastindexof(cls, array: IntoExpression, value: IntoExpression, /) ...
    method length (line 1121) | def length(cls, array: IntoExpression, /) -> Expression:
    method lerp (line 1126) | def lerp(cls, array: IntoExpression, fraction: IntoExpression, /) -> E...
    method peek (line 1135) | def peek(cls, array: IntoExpression, /) -> Expression:
    method pluck (line 1145) | def pluck(cls, array: IntoExpression, field: IntoExpression, /) -> Exp...
    method reverse (line 1154) | def reverse(cls, array: IntoExpression, /) -> Expression:
    method sequence (line 1163) | def sequence(cls, *args: Any) -> Expression:
    method slice (line 1177) | def slice(
    method sort (line 1189) | def sort(cls, array: IntoExpression, /) -> Expression:
    method span (line 1199) | def span(cls, array: IntoExpression, /) -> Expression:
    method lower (line 1204) | def lower(cls, string: IntoExpression, /) -> Expression:
    method pad (line 1209) | def pad(
    method parseFloat (line 1227) | def parseFloat(cls, string: IntoExpression, /) -> Expression:
    method parseInt (line 1236) | def parseInt(cls, string: IntoExpression, /) -> Expression:
    method replace (line 1245) | def replace(
    method substring (line 1264) | def substring(
    method trim (line 1275) | def trim(cls, string: IntoExpression, /) -> Expression:
    method truncate (line 1280) | def truncate(
    method upper (line 1300) | def upper(cls, string: IntoExpression, /) -> Expression:
    method btoa (line 1305) | def btoa(cls, string: IntoExpression, /) -> Expression:
    method atob (line 1321) | def atob(cls, string: IntoExpression, /) -> Expression:
    method merge (line 1337) | def merge(
    method dayFormat (line 1350) | def dayFormat(cls, day: IntoExpression, /) -> Expression:
    method dayAbbrevFormat (line 1359) | def dayAbbrevFormat(cls, day: IntoExpression, /) -> Expression:
    method format (line 1368) | def format(cls, value: IntoExpression, specifier: IntoExpression, /) -...
    method monthFormat (line 1381) | def monthFormat(cls, month: IntoExpression, /) -> Expression:
    method monthAbbrevFormat (line 1390) | def monthAbbrevFormat(cls, month: IntoExpression, /) -> Expression:
    method timeUnitSpecifier (line 1399) | def timeUnitSpecifier(
    method timeFormat (line 1424) | def timeFormat(
    method timeParse (line 1442) | def timeParse(
    method utcFormat (line 1457) | def utcFormat(
    method utcParse (line 1477) | def utcParse(
    method regexp (line 1494) | def regexp(
    method test (line 1508) | def test(
    method rgb (line 1519) | def rgb(cls, *args: Any) -> Expression:
    method hsl (line 1536) | def hsl(cls, *args: Any) -> Expression:
    method lab (line 1553) | def lab(cls, *args: Any) -> Expression:
    method hcl (line 1570) | def hcl(cls, *args: Any) -> Expression:
    method luminance (line 1587) | def luminance(cls, specifier: IntoExpression, /) -> Expression:
    method contrast (line 1601) | def contrast(
    method item (line 1615) | def item(cls) -> Expression:
    method group (line 1620) | def group(cls, name: IntoExpression = None, /) -> Expression:
    method xy (line 1630) | def xy(cls, item: IntoExpression = None, /) -> Expression:
    method x (line 1641) | def x(cls, item: IntoExpression = None, /) -> Expression:
    method y (line 1652) | def y(cls, item: IntoExpression = None, /) -> Expression:
    method pinchDistance (line 1663) | def pinchDistance(cls, event: IntoExpression, /) -> Expression:
    method pinchAngle (line 1668) | def pinchAngle(cls, event: IntoExpression, /) -> Expression:
    method inScope (line 1673) | def inScope(cls, item: IntoExpression, /) -> Expression:
    method data (line 1678) | def data(cls, name: IntoExpression, /) -> Expression:
    method indata (line 1687) | def indata(
    method scale (line 1698) | def scale(
    method invert (line 1714) | def invert(
    method copy (line 1730) | def copy(cls, name: IntoExpression, group: IntoExpression = None, /) -...
    method domain (line 1740) | def domain(
    method range (line 1752) | def range(cls, name: IntoExpression, group: IntoExpression = None, /) ...
    method bandwidth (line 1762) | def bandwidth(
    method bandspace (line 1774) | def bandspace(
    method gradient (line 1790) | def gradient(
    method panLinear (line 1813) | def panLinear(cls, domain: IntoExpression, delta: IntoExpression, /) -...
    method panLog (line 1823) | def panLog(cls, domain: IntoExpression, delta: IntoExpression, /) -> E...
    method panPow (line 1833) | def panPow(
    method panSymlog (line 1845) | def panSymlog(
    method zoomLinear (line 1857) | def zoomLinear(
    method zoomLog (line 1873) | def zoomLog(
    method zoomPow (line 1889) | def zoomPow(
    method zoomSymlog (line 1906) | def zoomSymlog(
    method geoArea (line 1923) | def geoArea(
    method geoBounds (line 1946) | def geoBounds(
    method geoCentroid (line 1972) | def geoCentroid(
    method geoScale (line 1995) | def geoScale(
    method treePath (line 2007) | def treePath(
    method treeAncestors (line 2019) | def treeAncestors(cls, name: IntoExpression, node: IntoExpression, /) ...
    method containerSize (line 2024) | def containerSize(cls) -> Expression:
    method screen (line 2033) | def screen(cls) -> Expression:
    method windowSize (line 2043) | def windowSize(cls) -> Expression:
    method warn (line 2048) | def warn(
    method info (line 2060) | def info(
    method debug (line 2072) | def debug(

FILE: altair/expr/core.py
  class DatumType (line 15) | class DatumType:
    method __repr__ (line 18) | def __repr__(self) -> str:
    method __getattr__ (line 21) | def __getattr__(self, attr) -> GetAttrExpression:
    method __getitem__ (line 26) | def __getitem__(self, attr) -> GetItemExpression:
    method __call__ (line 29) | def __call__(self, datum, **kwargs) -> dict[str, Any]:
  function _js_repr (line 37) | def _js_repr(val) -> str:
  function _from_date_datetime (line 55) | def _from_date_datetime(obj: dt.date | dt.datetime, /) -> str:
  function _is_numpy_generic (line 83) | def _is_numpy_generic(obj: Any) -> bool:
  class OperatorMixin (line 93) | class OperatorMixin:
    method _to_expr (line 94) | def _to_expr(self) -> str:
    method _from_expr (line 97) | def _from_expr(self, expr) -> Any:
    method __add__ (line 100) | def __add__(self, other):
    method __radd__ (line 104) | def __radd__(self, other):
    method __sub__ (line 108) | def __sub__(self, other):
    method __rsub__ (line 112) | def __rsub__(self, other):
    method __mul__ (line 116) | def __mul__(self, other):
    method __rmul__ (line 120) | def __rmul__(self, other):
    method __truediv__ (line 124) | def __truediv__(self, other):
    method __rtruediv__ (line 128) | def __rtruediv__(self, other):
    method __mod__ (line 136) | def __mod__(self, other):
    method __rmod__ (line 140) | def __rmod__(self, other):
    method __pow__ (line 144) | def __pow__(self, other):
    method __rpow__ (line 149) | def __rpow__(self, other):
    method __neg__ (line 154) | def __neg__(self):
    method __pos__ (line 158) | def __pos__(self):
    method __eq__ (line 164) | def __eq__(self, other):
    method __ne__ (line 168) | def __ne__(self, other):
    method __gt__ (line 172) | def __gt__(self, other):
    method __lt__ (line 176) | def __lt__(self, other):
    method __ge__ (line 180) | def __ge__(self, other):
    method __le__ (line 184) | def __le__(self, other):
    method __abs__ (line 188) | def __abs__(self):
    method __and__ (line 194) | def __and__(self, other):
    method __rand__ (line 198) | def __rand__(self, other):
    method __or__ (line 202) | def __or__(self, other):
    method __ror__ (line 206) | def __ror__(self, other):
    method __invert__ (line 210) | def __invert__(self):
  class Expression (line 215) | class Expression(OperatorMixin, SchemaBase):
    method to_dict (line 226) | def to_dict(self, *args, **kwargs):
    method __setattr__ (line 229) | def __setattr__(self, attr, val) -> None:
    method __getitem__ (line 234) | def __getitem__(self, val):
  class UnaryExpression (line 238) | class UnaryExpression(Expression):
    method __init__ (line 239) | def __init__(self, op, val) -> None:
    method __repr__ (line 242) | def __repr__(self):
  class BinaryExpression (line 246) | class BinaryExpression(Expression):
    method __init__ (line 247) | def __init__(self, op, lhs, rhs) -> None:
    method __repr__ (line 250) | def __repr__(self):
  class FunctionExpression (line 254) | class FunctionExpression(Expression):
    method __init__ (line 255) | def __init__(self, name, args) -> None:
    method __repr__ (line 258) | def __repr__(self):
  class ConstExpression (line 263) | class ConstExpression(Expression):
    method __init__ (line 264) | def __init__(self, name) -> None:
    method __repr__ (line 267) | def __repr__(self) -> str:
  class GetAttrExpression (line 271) | class GetAttrExpression(Expression):
    method __init__ (line 272) | def __init__(self, group, name) -> None:
    method __repr__ (line 275) | def __repr__(self):
  class GetItemExpression (line 279) | class GetItemExpression(Expression):
    method __init__ (line 280) | def __init__(self, group, name) -> None:
    method __repr__ (line 283) | def __repr__(self) -> str:

FILE: altair/jupyter/__init__.py
  class JupyterChart (line 8) | class JupyterChart:
    method __init__ (line 9) | def __init__(self, *args, **kwargs):

FILE: altair/jupyter/js/index.js
  function render (line 9) | async function render({ model, el }) {
  function cleanJson (line 150) | function cleanJson(data) {
  function getNestedRuntime (line 154) | function getNestedRuntime(view, scope) {
  function lookupSignalOp (line 162) | function lookupSignalOp(view, name, scope) {
  function dataRef (line 167) | function dataRef(view, name, scope) {
  function setSignalValue (line 172) | function setSignalValue(view, name, scope, value) {
  function setDataValue (line 177) | function setDataValue(view, name, scope, value) {
  function addSignalListener (line 184) | function addSignalListener(view, name, scope, handler) {
  function addDataListener (line 194) | function addDataListener(view, name, scope, handler) {
  function findOperatorHandler (line 205) | function findOperatorHandler(op, handler) {
  function addOperatorListener (line 211) | function addOperatorListener(view, name, op, handler) {
  function trap (line 221) | function trap(view, fn) {

FILE: altair/jupyter/jupyter_chart.py
  class Params (line 21) | class Params(traitlets.HasTraits):
    method __init__ (line 24) | def __init__(self, trait_values):
    method __repr__ (line 45) | def __repr__(self):
  class Selections (line 49) | class Selections(traitlets.HasTraits):
    method __init__ (line 52) | def __init__(self, trait_values):
    method __repr__ (line 75) | def __repr__(self):
    method _make_read_only (line 78) | def _make_read_only(self, change):
    method _set_value (line 88) | def _set_value(self, key, value):
  function load_js_src (line 94) | def load_js_src() -> str:
  class JupyterChart (line 98) | class JupyterChart(anywidget.AnyWidget):
    method enable_offline (line 133) | def enable_offline(cls, offline: bool = True):
    method __init__ (line 180) | def __init__(
    method _on_change_chart (line 221) | def _on_change_chart(self, change):  # noqa: C901
    method _init_with_vegafusion (line 318) | def _init_with_vegafusion(self, local_tz: str):
    method _on_change_params (line 348) | def _on_change_params(self, change):
    method _on_change_selections (line 353) | def _on_change_selections(self, change):
  function collect_transform_params (line 378) | def collect_transform_params(chart: TopLevelSpec) -> set[str]:

FILE: altair/theme.py
  function register (line 175) | def register(
  function unregister (line 247) | def unregister(name: LiteralString) -> Plugin[ThemeConfig]:
  function __dir__ (line 282) | def __dir__() -> list[str]:
  function __getattr__ (line 287) | def __getattr__(name: Literal["active"]) -> str: ...  # type: ignore[misc]
  function __getattr__ (line 289) | def __getattr__(name: Literal["options"]) -> dict[str, Any]: ...  # type...
  function __getattr__ (line 290) | def __getattr__(name: str) -> Any:
  function _register (line 300) | def _register(

FILE: altair/utils/_dfi_types.py
  class DtypeKind (line 16) | class DtypeKind(enum.IntEnum):
  class Column (line 51) | class Column(Protocol):
    method dtype (line 53) | def dtype(self) -> tuple[Any, int, str, str]:
    method describe_categorical (line 90) | def describe_categorical(self) -> Any:
  class DataFrame (line 113) | class DataFrame(Protocol):
    method __dataframe__ (line 127) | def __dataframe__(
    method column_names (line 144) | def column_names(self) -> Iterable[str]:
    method get_column_by_name (line 148) | def get_column_by_name(self, name: str) -> Column:
    method get_chunks (line 152) | def get_chunks(self, n_chunks: int | None = None) -> Iterable[DataFrame]:

FILE: altair/utils/_importers.py
  function import_vegafusion (line 14) | def import_vegafusion() -> ModuleType:
  function import_vl_convert (line 40) | def import_vl_convert() -> ModuleType:
  function vl_version_for_vl_convert (line 66) | def vl_version_for_vl_convert() -> str:
  function import_pyarrow_interchange (line 74) | def import_pyarrow_interchange() -> ModuleType:
  function pyarrow_available (line 101) | def pyarrow_available() -> bool:

FILE: altair/utils/_show.py
  function open_html_in_browser (line 11) | def open_html_in_browser(

FILE: altair/utils/_transformed_data.py
  function transformed_data (line 63) | def transformed_data(
  function transformed_data (line 71) | def transformed_data(
  function transformed_data (line 78) | def transformed_data(chart, row_limit=None, exclude=None):
  function _assign_chart_name (line 161) | def _assign_chart_name(chart: ChartType) -> None:
  function _get_subcharts (line 182) | def _get_subcharts(chart: ChartType) -> list[Any]:
  function name_views (line 201) | def name_views(
  function get_group_mark_for_scope (line 247) | def get_group_mark_for_scope(
  function get_datasets_for_scope (line 298) | def get_datasets_for_scope(vega_spec: dict[str, Any], scope: Scope) -> l...
  function get_definition_scope_for_data_reference (line 364) | def get_definition_scope_for_data_reference(
  function get_facet_mapping (line 429) | def get_facet_mapping(group: dict[str, Any], scope: Scope = ()) -> Facet...
  function get_from_facet_mapping (line 494) | def get_from_facet_mapping(
  function get_datasets_for_view_names (line 527) | def get_datasets_for_view_names(

FILE: altair/utils/_vegafusion_data.py
  function is_supported_by_vf (line 54) | def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
  function is_supported_by_vf (line 61) | def is_supported_by_vf(data: Any) -> TypeIs[DataFrameLike]:
  class _ToVegaFusionReturnUrlDict (line 65) | class _ToVegaFusionReturnUrlDict(TypedDict):
  function vegafusion_data_transformer (line 73) | def vegafusion_data_transformer(
  function vegafusion_data_transformer (line 79) | def vegafusion_data_transformer(
  function vegafusion_data_transformer (line 85) | def vegafusion_data_transformer(
  function vegafusion_data_transformer (line 90) | def vegafusion_data_transformer(
  function get_inline_table_names (line 108) | def get_inline_table_names(vega_spec: dict[str, Any]) -> set[str]:
  function get_inline_tables (line 153) | def get_inline_tables(vega_spec: dict[str, Any]) -> dict[str, DataFrameL...
  function compile_to_vegafusion_chart_state (line 179) | def compile_to_vegafusion_chart_state(
  function compile_with_vegafusion (line 235) | def compile_with_vegafusion(vegalite_spec: dict[str, Any]) -> dict[str, ...
  function handle_row_limit_exceeded (line 286) | def handle_row_limit_exceeded(row_limit: int | None, warnings: list):
  function using_vegafusion (line 299) | def using_vegafusion() -> bool:

FILE: altair/utils/compiler.py
  class VegaLiteCompilerRegistry (line 12) | class VegaLiteCompilerRegistry(PluginRegistry[VegaLiteCompilerType, dict...

FILE: altair/utils/core.py
  class DataFrameLike (line 65) | class DataFrameLike(Protocol):
    method __dataframe__ (line 66) | def __dataframe__(
  function infer_vegalite_type_for_pandas (line 228) | def infer_vegalite_type_for_pandas(
  function merge_props_geom (line 276) | def merge_props_geom(feat: dict[str, Any]) -> dict[str, Any]:
  function sanitize_geo_interface (line 294) | def sanitize_geo_interface(geo: MutableMapping[Any, Any]) -> dict[str, A...
  function numpy_is_subtype (line 327) | def numpy_is_subtype(dtype: Any, subtype: Any) -> bool:
  function sanitize_pandas_dataframe (line 337) | def sanitize_pandas_dataframe(df: _PandasDataFrameT) -> _PandasDataFrame...
  function sanitize_narwhals_dataframe (line 469) | def sanitize_narwhals_dataframe(
  function to_eager_narwhals_dataframe (line 507) | def to_eager_narwhals_dataframe(data: IntoDataFrame) -> nw.DataFrame[Any]:
  function parse_shorthand (line 526) | def parse_shorthand(  # noqa: C901
  function infer_vegalite_type_for_narwhals (line 713) | def infer_vegalite_type_for_narwhals(
  function _wrap_and_copy_doc (line 736) | def _wrap_and_copy_doc(tp: Callable[..., Any], cb: Callable[..., Any]) -...
  class _MethodSignatureCopier (line 755) | class _MethodSignatureCopier(Protocol[P]):
    method __call__ (line 756) | def __call__(self, cb: WrapsMethod[T, R], /) -> WrappedMethod[T, P, R]...
  function use_signature (line 759) | def use_signature(tp: Callable[P, Any], /) -> _MethodSignatureCopier[P]:
  class _FunctionSignatureCopier (line 775) | class _FunctionSignatureCopier(Protocol[P]):
    method __call__ (line 776) | def __call__(self, cb: Callable[..., R], /) -> Callable[P, R]: ...
  function use_signature_func (line 779) | def use_signature_func(tp: Callable[P, Any], /) -> _FunctionSignatureCop...
  function update_nested (line 796) | def update_nested(
  function update_nested (line 802) | def update_nested(
  function update_nested (line 807) | def update_nested(
  function display_traceback (line 852) | def display_traceback(in_ipython: bool = True):
  class _ChannelCache (line 876) | class _ChannelCache:
    method from_cache (line 881) | def from_cache(cls) -> _ChannelCache:
    method get_encoding (line 892) | def get_encoding(self, tp: type[Any], /) -> str:
    method _wrap_in_channel (line 898) | def _wrap_in_channel(self, obj: Any, encoding: str, /):
    method infer_encoding_types (line 920) | def infer_encoding_types(self, kwargs: dict[str, Any], /):
  function _init_channel_to_name (line 928) | def _init_channel_to_name():
  function _invert_group_channels (line 952) | def _invert_group_channels(
  function infer_encoding_types (line 979) | def infer_encoding_types(args: tuple[Any, ...], kwargs: dict[str, Any]):

FILE: altair/utils/data.py
  class SupportsGeoInterface (line 53) | class SupportsGeoInterface(Protocol):
  function is_data_type (line 69) | def is_data_type(obj: Any) -> TypeIs[DataType]:
  class DataTransformerRegistry (line 94) | class DataTransformerRegistry(PluginRegistry[DataTransformerType, R]):
    method consolidate_datasets (line 98) | def consolidate_datasets(self) -> bool:
    method consolidate_datasets (line 102) | def consolidate_datasets(self, value: bool) -> None:
  class MaxRowsError (line 107) | class MaxRowsError(Exception):
    method __init__ (line 110) | def __init__(self, message: str, /) -> None:
    method from_limit_rows (line 115) | def from_limit_rows(cls, user_rows: int, max_rows: int, /) -> MaxRowsE...
  function limit_rows (line 132) | def limit_rows(data: None = ..., max_rows: int | None = ...) -> partial:...
  function limit_rows (line 134) | def limit_rows(data: DataType, max_rows: int | None = ...) -> DataType: ...
  function limit_rows (line 135) | def limit_rows(
  function sample (line 169) | def sample(
  function sample (line 173) | def sample(
  function sample (line 177) | def sample(
  function sample (line 180) | def sample(
  class _FormatDict (line 217) | class _FormatDict(TypedDict):
  class _ToFormatReturnUrlDict (line 221) | class _ToFormatReturnUrlDict(TypedDict):
  function to_json (line 227) | def to_json(
  function to_json (line 237) | def to_json(
  function to_json (line 246) | def to_json(
  function to_csv (line 263) | def to_csv(
  function to_csv (line 273) | def to_csv(
  function to_csv (line 282) | def to_csv(
  function _to_text (line 298) | def _to_text(
  function _to_text_kwds (line 313) | def _to_text_kwds(prefix: str, extension: str, filename: str, urlpath: s...
  function to_values (line 317) | def to_values(data: DataType) -> ToValuesReturnType:
  function check_data_type (line 341) | def check_data_type(data: DataType) -> None:
  function _compute_data_hash (line 350) | def _compute_data_hash(data_str: str) -> str:
  function _from_geo_interface (line 354) | def _from_geo_interface(data: SupportsGeoInterface) -> dict[str, Any]:
  function _data_to_json_string (line 366) | def _data_to_json_string(data: DataType) -> str:
  function _data_to_csv_string (line 388) | def _data_to_csv_string(data: DataType) -> str:
  function arrow_table_from_dfi_dataframe (line 419) | def arrow_table_from_dfi_dataframe(dfi_df: DataFrameLike) -> pa.Table:

FILE: altair/utils/deprecation.py
  class AltairDeprecationWarning (line 28) | class AltairDeprecationWarning(DeprecationWarning): ...
  function _format_message (line 31) | def _format_message(
  function deprecated (line 45) | def deprecated(
  function deprecated_warn (line 85) | def deprecated_warn(
  class _WarningsMonitor (line 167) | class _WarningsMonitor:
    method __init__ (line 168) | def __init__(self) -> None:
    method __contains__ (line 172) | def __contains__(self, key: LiteralString, /) -> bool:
    method hit (line 176) | def hit(self, key: LiteralString, /) -> None:
    method clear (line 180) | def clear(self) -> None:
  function _warn_once (line 188) | def _warn_once(

FILE: altair/utils/display.py
  class RendererRegistry (line 37) | class RendererRegistry(PluginRegistry[RendererType, MimeBundleType]):
    method set_embed_options (line 49) | def set_embed_options(
  class Displayable (line 124) | class Displayable:
    method __init__ (line 143) | def __init__(self, spec: dict[str, Any], validate: bool = False) -> None:
    method _validate (line 148) | def _validate(self) -> None:
    method _repr_mimebundle_ (line 158) | def _repr_mimebundle_(
  function default_renderer_base (line 170) | def default_renderer_base(
  function json_renderer_base (line 201) | def json_renderer_base(
  class HTMLRenderer (line 214) | class HTMLRenderer:
    method __init__ (line 217) | def __init__(self, output_div: str = "altair-viz-{}", **kwargs) -> None:
    method output_div (line 222) | def output_div(self) -> str:
    method __call__ (line 225) | def __call__(self, spec: dict[str, Any], **metadata) -> dict[str, str]:

FILE: altair/utils/execeval.py
  class _CatchDisplay (line 17) | class _CatchDisplay:
    method __init__ (line 20) | def __init__(self) -> None:
    method __enter__ (line 23) | def __enter__(self) -> Self:
    method __exit__ (line 28) | def __exit__(self, type, value, traceback) -> Literal[False]:
    method __call__ (line 33) | def __call__(self, output: Any) -> None:
  function eval_block (line 38) | def eval_block(
  function eval_block (line 46) | def eval_block(
  function eval_block (line 53) | def eval_block(

FILE: altair/utils/html.py
  function spec_to_html (line 307) | def spec_to_html(

FILE: altair/utils/mimebundle.py
  function spec_to_mimebundle (line 18) | def spec_to_mimebundle(
  function spec_to_mimebundle (line 30) | def spec_to_mimebundle(
  function spec_to_mimebundle (line 42) | def spec_to_mimebundle(
  function spec_to_mimebundle (line 54) | def spec_to_mimebundle(
  function spec_to_mimebundle (line 65) | def spec_to_mimebundle(
  function _spec_to_mimebundle_with_engine (line 171) | def _spec_to_mimebundle_with_engine(
  function _validate_normalize_engine (line 289) | def _validate_normalize_engine(
  function _pngxy (line 332) | def _pngxy(data):
  function preprocess_embed_options (line 343) | def preprocess_embed_options(embed_options: dict) -> dict:

FILE: altair/utils/plugin_registry.py
  function _is_type (line 30) | def _is_type(tp: type[T], /) -> Callable[[object], TypeIs[type[T]]]:
  class NoSuchEntryPoint (line 43) | class NoSuchEntryPoint(Exception):
    method __init__ (line 44) | def __init__(self, group, name):
    method __str__ (line 48) | def __str__(self):
  class PluginEnabler (line 52) | class PluginEnabler(Generic[PluginT, R]):
    method __init__ (line 64) | def __init__(
    method __enter__ (line 73) | def __enter__(self) -> PluginEnabler[PluginT, R]:
    method __exit__ (line 76) | def __exit__(self, typ: type, value: Exception, traceback: TracebackTy...
    method __repr__ (line 79) | def __repr__(self) -> str:
  class PluginRegistry (line 83) | class PluginRegistry(Generic[PluginT, R]):
    method __init__ (line 109) | def __init__(
    method register (line 147) | def register(self, name: str, value: PluginT | None) -> PluginT | None:
    method names (line 175) | def names(self) -> list[str]:
    method _get_state (line 183) | def _get_state(self) -> dict[str, Any]:
    method _set_state (line 193) | def _set_state(self, state: dict[str, Any]) -> None:
    method _enable (line 205) | def _enable(self, name: str, **options) -> None:
    method enable (line 226) | def enable(
    method active (line 253) | def active(self) -> str:
    method options (line 258) | def options(self) -> dict[str, Any]:
    method get (line 262) | def get(self) -> partial[R] | Plugin[R] | None:
    method __repr__ (line 278) | def __repr__(self) -> str:
  function importlib_metadata_get (line 282) | def importlib_metadata_get(group):

FILE: altair/utils/save.py
  function write_file_or_filename (line 18) | def write_file_or_filename(
  function set_inspect_format_argument (line 32) | def set_inspect_format_argument(
  function set_inspect_mode_argument (line 52) | def set_inspect_mode_argument(
  function _save_mimebundle_format (line 78) | def _save_mimebundle_format(
  function save (line 171) | def save(

FILE: altair/utils/schemapi.py
  function enable_debug_mode (line 83) | def enable_debug_mode() -> None:
  function disable_debug_mode (line 88) | def disable_debug_mode() -> None:
  function debug_mode (line 94) | def debug_mode(arg: bool) -> Iterator[None]:
  function validate_jsonschema (line 105) | def validate_jsonschema(
  function validate_jsonschema (line 115) | def validate_jsonschema(
  function validate_jsonschema (line 124) | def validate_jsonschema(
  function _get_errors_from_spec (line 162) | def _get_errors_from_spec(
  function _get_json_schema_draft_url (line 209) | def _get_json_schema_draft_url(schema: dict[str, Any]) -> str:
  function _use_referencing_library (line 213) | def _use_referencing_library() -> bool:
  function _prepare_references_in_schema (line 218) | def _prepare_references_in_schema(schema: dict[str, Any]) -> dict[str, A...
  function _get_referencing_registry (line 255) | def _get_referencing_registry(
  function _json_path (line 278) | def _json_path(err: jsonschema.exceptions.ValidationError) -> str:
  function _group_errors_by_json_path (line 295) | def _group_errors_by_json_path(
  function _get_leaves_of_error_tree (line 312) | def _get_leaves_of_error_tree(
  function _subset_to_most_specific_json_paths (line 333) | def _subset_to_most_specific_json_paths(
  function _contained_at_start_of_one_of_other_values (line 353) | def _contained_at_start_of_one_of_other_values(x: str, values: Sequence[...
  function _deduplicate_errors (line 359) | def _deduplicate_errors(
  function _is_required_value_error (line 398) | def _is_required_value_error(err: jsonschema.exceptions.ValidationError)...
  function _group_errors_by_validator (line 402) | def _group_errors_by_validator(errors: ValidationErrorList) -> GroupedVa...
  function _deduplicate_enum_errors (line 420) | def _deduplicate_enum_errors(errors: ValidationErrorList) -> ValidationE...
  function _deduplicate_additional_properties_errors (line 441) | def _deduplicate_additional_properties_errors(
  function _deduplicate_by_message (line 471) | def _deduplicate_by_message(errors: ValidationErrorList) -> ValidationEr...
  function _subclasses (line 476) | def _subclasses(cls: type[Any]) -> Iterator[type[Any]]:
  function _from_array_like (line 491) | def _from_array_like(obj: Iterable[Any], /) -> list[Any]:
  function _from_date_datetime (line 498) | def _from_date_datetime(obj: dt.date | dt.datetime, /) -> dict[str, Any]:
  function _todict (line 526) | def _todict(obj: Any, context: dict[str, Any] | None, np_opt: Any, pd_op...
  function _resolve_references (line 562) | def _resolve_references(
  function _validator_values (line 584) | def _validator_values(errors: Iterable[ValidationError], /) -> Iterator[...
  function _iter_channels (line 590) | def _iter_channels(tp: type[Any], spec: Mapping[str, Any], /) -> Iterato...
  function _is_channel (line 600) | def _is_channel(obj: Any) -> TypeIs[dict[str, Any]]:
  function _maybe_channel (line 609) | def _maybe_channel(tp: type[Any], spec: Any, /) -> type[Any]:
  class SchemaValidationError (line 626) | class SchemaValidationError(jsonschema.ValidationError):
    method __init__ (line 637) | def __init__(self, obj: SchemaBase, err: jsonschema.ValidationError) -...
    method __str__ (line 665) | def __str__(self) -> str:
    method _get_message (line 668) | def _get_message(self) -> str:
    method _get_message_for_errors_group (line 693) | def _get_message_for_errors_group(
    method _get_additional_properties_error_message (line 709) | def _get_additional_properties_error_message(
    method _get_altair_class_for_error (line 730) | def _get_altair_class_for_error(
    method _format_params_as_table (line 752) | def _format_params_as_table(param_dict_keys: Iterable[str]) -> str:
    method _format_type_reprs (line 809) | def _format_type_reprs(self, errors: Iterable[ValidationError], /) -> ...
    method _get_default_error_message (line 830) | def _get_default_error_message(
  class SchemaLike (line 917) | class SchemaLike(Generic[_JSON_VT_co], Protocol):  # type: ignore[misc]
    method to_dict (line 944) | def to_dict(self, *args, **kwds) -> Any: ...
  class ConditionLike (line 948) | class ConditionLike(SchemaLike[Literal["object"]], Protocol):
  class UndefinedType (line 967) | class UndefinedType:
    method __new__ (line 972) | def __new__(cls, *args, **kwargs) -> Self:
    method __repr__ (line 977) | def __repr__(self) -> str:
  function is_undefined (line 1016) | def is_undefined(obj: Any) -> TypeIs[UndefinedType]:
  function _shallow_copy (line 1031) | def _shallow_copy(obj: _CopyImpl) -> _CopyImpl: ...
  function _shallow_copy (line 1033) | def _shallow_copy(obj: Any) -> Any: ...
  function _shallow_copy (line 1034) | def _shallow_copy(obj: _CopyImpl | Any) -> _CopyImpl | Any:
  function _deep_copy (line 1044) | def _deep_copy(obj: _CopyImpl, by_ref: set[str]) -> _CopyImpl: ...
  function _deep_copy (line 1046) | def _deep_copy(obj: Any, by_ref: set[str]) -> Any: ...
  function _deep_copy (line 1047) | def _deep_copy(obj: _CopyImpl | Any, by_ref: set[str]) -> _CopyImpl | Any:
  class SchemaBase (line 1065) | class SchemaBase:
    method __init__ (line 1077) | def __init__(self, *args: Any, **kwds: Any) -> None:
    method copy (line 1102) | def copy(
    method _get (line 1128) | def _get(self, attr, default=Undefined):
    method __getattr__ (line 1135) | def __getattr__(self, attr):
    method __setattr__ (line 1148) | def __setattr__(self, item, val) -> None:
    method __getitem__ (line 1151) | def __getitem__(self, item):
    method __setitem__ (line 1154) | def __setitem__(self, item, val) -> None:
    method __repr__ (line 1157) | def __repr__(self) -> str:
    method __eq__ (line 1167) | def __eq__(self, other: Any) -> bool:
    method to_dict (line 1174) | def to_dict(
    method to_json (line 1229) | def to_json(
    method _default_wrapper_classes (line 1281) | def _default_wrapper_classes(cls) -> Iterator[type[SchemaBase]]:
    method from_dict (line 1286) | def from_dict(
    method from_json (line 1310) | def from_json(
    method validate (line 1339) | def validate(
    method resolve_references (line 1350) | def resolve_references(cls, schema: dict[str, Any] | None = None) -> d...
    method validate_property (line 1361) | def validate_property(
    method __dir__ (line 1372) | def __dir__(self) -> list[str]:
  function _get_optional_modules (line 1376) | def _get_optional_modules(**modules: str) -> dict[str, _OptionalModule]:
  function _replace_parsed_shorthand (line 1415) | def _replace_parsed_shorthand(
  function _is_dict (line 1451) | def _is_dict(obj: Any | dict[Any, Any]) -> TypeIs[dict[Any, Any]]:
  function _is_list (line 1455) | def _is_list(obj: Any | list[Any]) -> TypeIs[list[Any]]:
  function _is_iterable (line 1459) | def _is_iterable(
  function _passthrough (line 1465) | def _passthrough(*args: Any, **kwds: Any) -> Any | dict[str, Any]:
  class _FromDict (line 1469) | class _FromDict:
    method __init__ (line 1480) | def __init__(self, wrapper_classes: Iterable[type[SchemaBase]], /) -> ...
    method hash_schema (line 1489) | def hash_schema(cls, schema: dict[str, Any], use_json: bool = True) ->...
    method from_dict (line 1524) | def from_dict(
    method from_dict (line 1533) | def from_dict(
    method from_dict (line 1542) | def from_dict(
    method from_dict (line 1551) | def from_dict(
    method from_dict (line 1560) | def from_dict(
    method from_dict (line 1568) | def from_dict(
  class _PropertySetter (line 1626) | class _PropertySetter:
    method __init__ (line 1627) | def __init__(self, prop: str, schema: dict[str, Any]) -> None:
    method __get__ (line 1631) | def __get__(self, obj, cls):
    method __call__ (line 1668) | def __call__(self, *args: Any, **kwargs: Any):
  function with_property_setters (line 1675) | def with_property_setters(cls: type[TSchemaBase]) -> type[TSchemaBase]:

FILE: altair/utils/selection.py
  class IndexSelection (line 12) | class IndexSelection:
    method from_vega (line 28) | def from_vega(name: str, signal: dict[str, dict] | None, store: Store):
  class PointSelection (line 55) | class PointSelection:
    method from_vega (line 71) | def from_vega(name: str, signal: dict[str, dict] | None, store: Store):
  class IntervalSelection (line 94) | class IntervalSelection:
    method from_vega (line 110) | def from_vega(name: str, signal: dict[str, list] | None, store: Store):

FILE: altair/utils/server.py
  class MockRequest (line 27) | class MockRequest:
    method makefile (line 28) | def makefile(self, *args, **kwargs):
    method sendall (line 31) | def sendall(self, response):
  class MockServer (line 35) | class MockServer:
    method __init__ (line 36) | def __init__(self, ip_port, Handler):
    method serve_forever (line 39) | def serve_forever(self):
    method server_close (line 42) | def server_close(self):
  function generate_handler (line 46) | def generate_handler(html, files=None):
  function find_open_port (line 70) | def find_open_port(ip, port, n=50):
  function serve (line 86) | def serve(

FILE: altair/vegalite/data.py
  function default_data_transformer (line 25) | def default_data_transformer(
  function default_data_transformer (line 29) | def default_data_transformer(
  function default_data_transformer (line 32) | def default_data_transformer(
  class DataTransformerRegistry (line 47) | class DataTransformerRegistry(_DataTransformerRegistry):
    method disable_max_rows (line 48) | def disable_max_rows(self) -> PluginEnabler:

FILE: altair/vegalite/v6/api.py
  function _dataset_name (line 212) | def _dataset_name(values: dict[str, Any] | list[str] | InlineDataset) ->...
  function _consolidate_data (line 235) | def _consolidate_data(
  function _prepare_data (line 266) | def _prepare_data(
  class LookupData (line 312) | class LookupData(core.LookupData):
    method __init__ (line 314) | def __init__(self, *args: Any, **kwargs: Any) -> None:
    method to_dict (line 317) | def to_dict(self, *args: Any, **kwargs: Any) -> dict[str, Any]:
  class FacetMapping (line 324) | class FacetMapping(core.FacetMapping):
    method __init__ (line 338) | def __init__(
    method to_dict (line 346) | def to_dict(self, *args: Any, **kwargs: Any) -> dict[str, Any]:
  class Parameter (line 370) | class Parameter(_expr_core.OperatorMixin):
    method _compute_hash (line 375) | def _compute_hash(self) -> str:
    method _get_param_hash_name (line 412) | def _get_param_hash_name(self) -> str:
    method __init__ (line 416) | def __init__(
    method ref (line 448) | def ref(self) -> dict[str, Any]:
    method to_dict (line 452) | def to_dict(self) -> dict[str, str | dict[str, Any]]:
    method __invert__ (line 462) | def __invert__(self) -> PredicateComposition | Any:
    method __and__ (line 471) | def __and__(self, other: Any) -> PredicateComposition | Any:
    method __or__ (line 485) | def __or__(self, other: Any) -> PredicateComposition | Any:
    method __repr__ (line 499) | def __repr__(self) -> str:
    method _to_expr (line 502) | def _to_expr(self) -> str:
    method _from_expr (line 505) | def _from_expr(self, expr: IntoExpression) -> ParameterExpression:
    method __getattr__ (line 508) | def __getattr__(self, field_name: str) -> GetAttrExpression | Selectio...
    method __getitem__ (line 520) | def __getitem__(self, field_name: str) -> GetItemExpression:
  class ParameterExpression (line 528) | class ParameterExpression(_expr_core.OperatorMixin):
    method __init__ (line 531) | def __init__(self, expr: IntoExpression) -> None:
    method to_dict (line 534) | def to_dict(self) -> dict[str, str]:
    method _to_expr (line 537) | def _to_expr(self) -> str:
    method _from_expr (line 540) | def _from_expr(self, expr: IntoExpression) -> ParameterExpression:
  class SelectionExpression (line 544) | class SelectionExpression(_expr_core.OperatorMixin):
    method __init__ (line 547) | def __init__(self, expr: IntoExpression) -> None:
    method to_dict (line 550) | def to_dict(self) -> dict[str, str]:
    method _to_expr (line 553) | def _to_expr(self) -> str:
    method _from_expr (line 556) | def _from_expr(self, expr: IntoExpression) -> SelectionExpression:
  function check_fields_and_encodings (line 560) | def check_fields_and_encodings(parameter: Parameter, field_name: str) ->...
  function _is_test_predicate (line 624) | def _is_test_predicate(obj: Any) -> TypeIs[_TestPredicateType]:
  function _get_predicate_expr (line 628) | def _get_predicate_expr(p: Parameter) -> Optional[_TestPredicateType]:
  function _predicate_to_condition (line 633) | def _predicate_to_condition(
  function _condition_to_selection (line 662) | def _condition_to_selection(
  class _ConditionExtra (line 699) | class _ConditionExtra(TypedDict, closed=True, total=False):  # type: ignore
  class _ConditionClosed (line 725) | class _ConditionClosed(TypedDict, closed=True, total=False):  # type: ig...
  class _Conditional (line 748) | class _Conditional(TypedDict, t.Generic[_C], total=False):
  class _Value (line 774) | class _Value(TypedDict, closed=True, total=False):  # type: ignore
  function _reveal_parsed_shorthand (line 780) | def _reveal_parsed_shorthand(obj: Map, /) -> dict[str, Any]:
  function _is_extra (line 785) | def _is_extra(*objs: Any, kwds: Map) -> Iterator[bool]:
  function _is_condition_extra (line 794) | def _is_condition_extra(obj: Any, *objs: Any, kwds: Map) -> TypeIs[_Cond...
  function _is_condition_closed (line 801) | def _is_condition_closed(obj: Map) -> TypeIs[_ConditionClosed]:
  function _parse_when_constraints (line 806) | def _parse_when_constraints(
  function _validate_composables (line 824) | def _validate_composables(
  function _parse_when_compose (line 839) | def _parse_when_compose(
  function _parse_when (line 868) | def _parse_when(
  function _parse_literal (line 892) | def _parse_literal(val: Any, /) -> dict[str, Any]:
  function _parse_then (line 903) | def _parse_then(statement: _StatementType, kwds: dict[str, Any], /) -> d...
  function _parse_otherwise (line 912) | def _parse_otherwise(
  class _BaseWhen (line 928) | class _BaseWhen(Protocol):
    method _when_then (line 932) | def _when_then(
  class When (line 941) | class When(_BaseWhen):
    method __init__ (line 954) | def __init__(self, condition: _Condition, /) -> None:
    method __repr__ (line 957) | def __repr__(self) -> str:
    method then (line 961) | def then(self, statement: str, /, **kwds: Any) -> Then[_Condition]: ...
    method then (line 963) | def then(self, statement: _Value, /, **kwds: Any) -> Then[_Conditions]...
    method then (line 965) | def then(
    method then (line 968) | def then(self, statement: _StatementType, /, **kwds: Any) -> Then[Any]:
  class Then (line 1014) | class Then(ConditionLike, t.Generic[_C]):
    method __init__ (line 1030) | def __init__(self, conditions: _Conditional[_C], /) -> None:
    method otherwise (line 1034) | def otherwise(self, statement: _TSchemaBase, /, **kwds: Any) -> _TSche...
    method otherwise (line 1036) | def otherwise(self, statement: str, /, **kwds: Any) -> _Conditional[_C...
    method otherwise (line 1038) | def otherwise(
    method otherwise (line 1042) | def otherwise(
    method otherwise (line 1045) | def otherwise(
    method when (line 1114) | def when(
    method to_dict (line 1193) | def to_dict(self, *args: Any, **kwds: Any) -> _Conditional[_C]:
    method __deepcopy__ (line 1196) | def __deepcopy__(self, memo: Any) -> Self:
    method __repr__ (line 1199) | def __repr__(self) -> str:
  class ChainedWhen (line 1211) | class ChainedWhen(_BaseWhen):
    method __init__ (line 1224) | def __init__(
    method __repr__ (line 1233) | def __repr__(self) -> str:
    method then (line 1238) | def then(self, statement: _StatementType, /, **kwds: Any) -> Then[_Con...
  function when (line 1296) | def when(
  function value (line 1395) | def value(value: Any, **kwargs: Any) -> _Value:
  function _make_param_obj (line 1400) | def _make_param_obj(
  function param (line 1430) | def param(
  function _selection (line 1517) | def _selection(type: Optional[SelectionType_T] = Undefined, **kwds: Any)...
  function selection (line 1563) | def selection(type: Optional[SelectionType_T] = Undefined, **kwds: Any) ...
  function selection_interval (line 1620) | def selection_interval(
  function selection_point (line 1733) | def selection_point(
  function selection_multi (line 1851) | def selection_multi(**kwargs: Any) -> Parameter:
  function selection_single (line 1857) | def selection_single(**kwargs: Any) -> Parameter:
  function binding (line 1862) | def binding(
  function binding_checkbox (line 1908) | def binding_checkbox(**kwargs: Any) -> BindCheckbox:
  function binding_radio (line 1914) | def binding_radio(**kwargs: Any) -> BindRadioSelect:
  function binding_select (line 1920) | def binding_select(**kwargs: Any) -> BindRadioSelect:
  function binding_range (line 1926) | def binding_range(**kwargs: Any) -> BindRange:
  function condition (line 1932) | def condition(
  function condition (line 1941) | def condition(
  function condition (line 1950) | def condition(
  function condition (line 1959) | def condition(
  function condition (line 1963) | def condition(
  function _top_schema_base (line 2006) | def _top_schema_base(  # noqa: ANN202
  class TopLevelMixin (line 2038) | class TopLevelMixin(mixins.ConfigMethodMixin):
    method to_dict (line 2044) | def to_dict(  # noqa: C901
    method to_json (line 2159) | def to_json(
    method to_html (line 2221) | def to_html(
    method to_url (line 2283) | def to_url(self, *, fullscreen: bool = False, validate: bool = True) -...
    method open_editor (line 2310) | def open_editor(self, *, fullscreen: bool = False, validate: bool = Tr...
    method save (line 2325) | def save(
    method __repr__ (line 2423) | def __repr__(self) -> str:
    method __add__ (line 2427) | def __add__(self, other: ChartType) -> LayerChart | FacetChart:
    method __and__ (line 2433) | def __and__(self, other: ChartType) -> VConcatChart:
    method __or__ (line 2440) | def __or__(self, other: ChartType) -> HConcatChart | ConcatChart:
    method repeat (line 2449) | def repeat(
    method properties (line 2511) | def properties(self, **kwargs: Any) -> Self:
    method project (line 2530) | def project(
    method _add_transform (line 2683) | def _add_transform(self, *transforms: Transform) -> Self:
    method transform_aggregate (line 2691) | def transform_aggregate(
    method transform_bin (line 2769) | def transform_bin(
    method transform_calculate (line 2829) | def transform_calculate(
    method transform_density (line 2898) | def transform_density(
    method transform_impute (line 2976) | def transform_impute(
    method transform_joinaggregate (line 3046) | def transform_joinaggregate(
    method transform_extent (line 3102) | def transform_extent(
    method transform_filter (line 3123) | def transform_filter(
    method transform_flatten (line 3231) | def transform_flatten(
    method transform_fold (line 3264) | def transform_fold(
    method transform_loess (line 3292) | def transform_loess(
    method transform_lookup (line 3335) | def transform_lookup(
    method transform_pivot (line 3389) | def transform_pivot(
    method transform_quantile (line 3436) | def transform_quantile(
    method transform_regression (line 3483) | def transform_regression(
    method transform_sample (line 3551) | def transform_sample(self, sample: int = 1000) -> Self:
    method transform_stack (line 3571) | def transform_stack(
    method transform_timeunit (line 3613) | def transform_timeunit(
    method transform_window (line 3696) | def transform_window(
    method _repr_mimebundle_ (line 3799) | def _repr_mimebundle_(self, *args: Any, **kwds: Any) -> MimeBundleType...
    method display (line 3812) | def display(
    method serve (line 3857) | def serve(
    method show (line 3886) | def show(self) -> None:
    method _set_resolve (line 3899) | def _set_resolve(self, **kwargs: Any):  # noqa: ANN202
    method resolve_axis (line 3912) | def resolve_axis(self, *args: Any, **kwargs: Any) -> Self:
    method resolve_legend (line 3918) | def resolve_legend(self, *args: Any, **kwargs: Any) -> Self:
    method resolve_scale (line 3924) | def resolve_scale(self, *args: Any, **kwargs: Any) -> Self:
  class _EncodingMixin (line 3930) | class _EncodingMixin(channels._EncodingMixin):
    method facet (line 3933) | def facet(
  class Chart (line 4001) | class Chart(
    method __init__ (line 4061) | def __init__(
    method _compute_hash (line 4083) | def _compute_hash(self) -> str:
    method _get_view_hash_name (line 4104) | def _get_view_hash_name(self) -> str:
    method from_dict (line 4109) | def from_dict(
    method to_dict (line 4138) | def to_dict(
    method transformed_data (line 4187) | def transformed_data(
    method add_params (line 4212) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4236) | def add_selection(self, *params) -> Self:  # noqa: ANN002
    method interactive (line 4240) | def interactive(
  function _check_if_valid_subspec (line 4272) | def _check_if_valid_subspec(
  function _check_if_can_be_layered (line 4296) | def _check_if_can_be_layered(spec: LayerType) -> None:
  class RepeatChart (line 4329) | class RepeatChart(TopLevelMixin, core.TopLevelRepeatSpec):
    method __init__ (line 4332) | def __init__(
    method transformed_data (line 4395) | def transformed_data(
    method interactive (line 4419) | def interactive(
    method add_params (line 4445) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4454) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function repeat (line 4459) | def repeat(
  class ConcatChart (line 4483) | class ConcatChart(TopLevelMixin, core.TopLevelConcatSpec):
    method __init__ (line 4487) | def __init__(
    method __ior__ (line 4503) | def __ior__(self, other: ChartType) -> Self:
    method __or__ (line 4510) | def __or__(self, other: ChartType) -> Self:
    method transformed_data (line 4515) | def transformed_data(
    method interactive (line 4540) | def interactive(
    method add_params (line 4569) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4578) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function concat (line 4583) | def concat(*charts: ConcatType, **kwargs: Any) -> ConcatChart:
  class HConcatChart (line 4588) | class HConcatChart(TopLevelMixin, core.TopLevelHConcatSpec):
    method __init__ (line 4592) | def __init__(
    method __ior__ (line 4607) | def __ior__(self, other: ChartType) -> Self:
    method __or__ (line 4614) | def __or__(self, other: ChartType) -> Self:
    method transformed_data (line 4619) | def transformed_data(
    method interactive (line 4644) | def interactive(
    method add_params (line 4673) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4682) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function hconcat (line 4687) | def hconcat(*charts: ConcatType, **kwargs: Any) -> HConcatChart:
  class VConcatChart (line 4692) | class VConcatChart(TopLevelMixin, core.TopLevelVConcatSpec):
    method __init__ (line 4696) | def __init__(
    method __iand__ (line 4711) | def __iand__(self, other: ChartType) -> Self:
    method __and__ (line 4718) | def __and__(self, other: ChartType) -> Self:
    method transformed_data (line 4723) | def transformed_data(
    method interactive (line 4750) | def interactive(
    method add_params (line 4779) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4788) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function vconcat (line 4793) | def vconcat(*charts: ConcatType, **kwargs: Any) -> VConcatChart:
  class LayerChart (line 4798) | class LayerChart(TopLevelMixin, _EncodingMixin, core.TopLevelLayerSpec):
    method __init__ (line 4802) | def __init__(
    method transformed_data (line 4828) | def transformed_data(
    method __iadd__ (line 4855) | def __iadd__(self, other: ChartType) -> Self:
    method __add__ (line 4863) | def __add__(self, other: ChartType) -> Self:
    method add_layers (line 4868) | def add_layers(self, *layers: LayerChart | Chart) -> Self:
    method interactive (line 4874) | def interactive(
    method add_params (line 4905) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 4914) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function _get_facet_spec (line 4922) | def _get_facet_spec(chart: LayerType) -> dict[str, Any]:
  function _hoist_facet_encodings (line 4935) | def _hoist_facet_encodings(
  function layer (line 4977) | def layer(*charts: LayerType, **kwargs: Any) -> LayerChart | FacetChart:
  class FacetChart (line 4993) | class FacetChart(TopLevelMixin, core.TopLevelFacetSpec):
    method __init__ (line 4997) | def __init__(
    method transformed_data (line 5017) | def transformed_data(
    method interactive (line 5042) | def interactive(
    method add_params (line 5068) | def add_params(self, *params: Parameter) -> Self:
    method add_selection (line 5077) | def add_selection(self, *selections) -> Self:  # noqa: ANN002
  function topo_feature (line 5082) | def topo_feature(url: str, feature: str, **kwargs: Any) -> UrlData:
  function _combine_subchart_data (line 5105) | def _combine_subchart_data(
  function _viewless_dict (line 5137) | def _viewless_dict(param: _Parameter) -> dict[str, Any]:
  function _needs_name (line 5143) | def _needs_name(subchart: ChartType) -> bool:
  function _prepare_to_lift (line 5153) | def _prepare_to_lift(param: _Parameter) -> _Parameter:
  function _remove_duplicate_params (line 5168) | def _remove_duplicate_params(layer: list[ChartType]) -> list[ChartType]:
  function _view_base_for_chart (line 5199) | def _view_base_for_chart(obj: Any) -> str:
  function _view_name_for_param (line 5208) | def _view_name_for_param(subchart: ChartType, is_concat: bool) -> str:
  function _combine_subchart_params (line 5221) | def _combine_subchart_params(  # noqa: C901
  function _get_repeat_strings (line 5318) | def _get_repeat_strings(
  function _extend_view_name (line 5333) | def _extend_view_name(v: str, r: str, spec: Chart | LayerChart) -> str:
  function _repeat_names (line 5350) | def _repeat_names(
  function _remove_layer_props (line 5386) | def _remove_layer_props(  # noqa: C901
  function sequence (line 5441) | def sequence(
  function graticule (line 5456) | def graticule(**kwds: Any) -> GraticuleGenerator:
  function sphere (line 5463) | def sphere() -> SphereGenerator:
  function is_chart_type (line 5494) | def is_chart_type(obj: Any) -> TypeIs[ChartType]:

FILE: altair/vegalite/v6/compiler.py
  function vl_convert_compiler (line 10) | def vl_convert_compiler(vegalite_spec: dict) -> dict:

FILE: altair/vegalite/v6/display.py
  function mimetype_renderer (line 56) | def mimetype_renderer(spec: dict, **metadata) -> DefaultRendererReturnType:
  function json_renderer (line 60) | def json_renderer(spec: dict, **metadata) -> DefaultRendererReturnType:
  function png_renderer (line 64) | def png_renderer(spec: dict, **metadata) -> dict[str, bytes]:
  function svg_renderer (line 78) | def svg_renderer(spec: dict, **metadata) -> dict[str, str]:
  function jupyter_renderer (line 92) | def jupyter_renderer(spec: dict, **metadata):
  function browser_renderer (line 112) | def browser_renderer(
  class VegaLite (line 169) | class VegaLite(Displayable):
  function vegalite (line 176) | def vegalite(spec: dict, validate: bool = True) -> None:

FILE: altair/vegalite/v6/schema/_config.py
  class AreaConfigKwds (line 99) | class AreaConfigKwds(TypedDict, total=False):
  class AutoSizeParamsKwds (line 575) | class AutoSizeParamsKwds(TypedDict, total=False):
  class AxisConfigKwds (line 609) | class AxisConfigKwds(TypedDict, total=False):
  class AxisResolveMapKwds (line 1070) | class AxisResolveMapKwds(TypedDict, total=False):
  class BarConfigKwds (line 1086) | class BarConfigKwds(TypedDict, total=False):
  class BindCheckboxKwds (line 1559) | class BindCheckboxKwds(TypedDict, total=False):
  class BindDirectKwds (line 1585) | class BindDirectKwds(TypedDict, total=False):
  class BindInputKwds (line 1611) | class BindInputKwds(TypedDict, total=False):
  class BindRadioSelectKwds (line 1647) | class BindRadioSelectKwds(TypedDict, total=False):
  class BindRangeKwds (line 1680) | class BindRangeKwds(TypedDict, total=False):
  class BoxPlotConfigKwds (line 1718) | class BoxPlotConfigKwds(TypedDict, total=False):
  class BrushConfigKwds (line 1798) | class BrushConfigKwds(TypedDict, total=False):
  class CompositionConfigKwds (line 1840) | class CompositionConfigKwds(TypedDict, total=False):
  class ConfigKwds (line 1873) | class ConfigKwds(TypedDict, total=False):
  class DateTimeKwds (line 2222) | class DateTimeKwds(TypedDict, total=False):
  class DerivedStreamKwds (line 2270) | class DerivedStreamKwds(TypedDict, total=False):
  class ErrorBandConfigKwds (line 2304) | class ErrorBandConfigKwds(TypedDict, total=False):
  class ErrorBarConfigKwds (line 2374) | class ErrorBarConfigKwds(TypedDict, total=False):
  class FeatureGeometryGeoJsonPropertiesKwds (line 2424) | class FeatureGeometryGeoJsonPropertiesKwds(TypedDict, total=False):
  class FormatConfigKwds (line 2463) | class FormatConfigKwds(TypedDict, total=False):
  class GeoJsonFeatureKwds (line 2532) | class GeoJsonFeatureKwds(TypedDict, total=False):
  class GeoJsonFeatureCollectionKwds (line 2571) | class GeoJsonFeatureCollectionKwds(TypedDict, total=False):
  class GeometryCollectionKwds (line 2595) | class GeometryCollectionKwds(TypedDict, total=False):
  class GradientStopKwds (line 2627) | class GradientStopKwds(TypedDict, total=False):
  class HeaderConfigKwds (line 2643) | class HeaderConfigKwds(TypedDict, total=False):
  class IntervalSelectionConfigKwds (line 2823) | class IntervalSelectionConfigKwds(TypedDict, total=False):
  class IntervalSelectionConfigWithoutTypeKwds (line 2933) | class IntervalSelectionConfigWithoutTypeKwds(TypedDict, total=False):
  class LegendConfigKwds (line 3035) | class LegendConfigKwds(TypedDict, total=False):
  class LegendResolveMapKwds (line 3390) | class LegendResolveMapKwds(TypedDict, total=False):
  class LegendStreamBindingKwds (line 3436) | class LegendStreamBindingKwds(TypedDict, total=False):
  class LineConfigKwds (line 3449) | class LineConfigKwds(TypedDict, total=False):
  class LineStringKwds (line 3914) | class LineStringKwds(TypedDict, total=False):
  class LinearGradientKwds (line 3938) | class LinearGradientKwds(TypedDict, total=False):
  class LocaleKwds (line 3977) | class LocaleKwds(TypedDict, total=False):
  class MarkConfigKwds (line 3993) | class MarkConfigKwds(TypedDict, total=False):
  class MergedStreamKwds (line 4443) | class MergedStreamKwds(TypedDict, total=False):
  class MultiLineStringKwds (line 4477) | class MultiLineStringKwds(TypedDict, total=False):
  class MultiPointKwds (line 4501) | class MultiPointKwds(TypedDict, total=False):
  class MultiPolygonKwds (line 4525) | class MultiPolygonKwds(TypedDict, total=False):
  class NumberLocaleKwds (line 4549) | class NumberLocaleKwds(TypedDict, total=False):
  class OverlayMarkDefKwds (line 4583) | class OverlayMarkDefKwds(TypedDict, total=False):
  class PointKwds (line 5075) | class PointKwds(TypedDict, total=False):
  class PointSelectionConfigKwds (line 5119) | class PointSelectionConfigKwds(TypedDict, total=False):
  class PointSelectionConfigWithoutTypeKwds (line 5227) | class PointSelectionConfigWithoutTypeKwds(TypedDict, total=False):
  class PolygonKwds (line 5327) | class PolygonKwds(TypedDict, total=False):
  class ProjectionKwds (line 5351) | class ProjectionKwds(TypedDict, total=False):
  class ProjectionConfigKwds (line 5494) | class ProjectionConfigKwds(TypedDict, total=False):
  class RadialGradientKwds (line 5637) | class RadialGradientKwds(TypedDict, total=False):
  class RangeConfigKwds (line 5692) | class RangeConfigKwds(TypedDict, total=False):
  class RectConfigKwds (line 5746) | class RectConfigKwds(TypedDict, total=False):
  class ResolveKwds (line 6214) | class ResolveKwds(TypedDict, total=False):
  class ScaleConfigKwds (line 6233) | class ScaleConfigKwds(TypedDict, total=False):
  class ScaleInvalidDataConfigKwds (line 6428) | class ScaleInvalidDataConfigKwds(TypedDict, total=False):
  class ScaleResolveMapKwds (line 6501) | class ScaleResolveMapKwds(TypedDict, total=False):
  class SelectionConfigKwds (line 6565) | class SelectionConfigKwds(TypedDict, total=False):
  class StepKwds (line 6593) | class StepKwds(TypedDict, closed=True, total=False):  # type: ignore[cal...
  class StyleConfigIndexKwds (line 6618) | class StyleConfigIndexKwds(TypedDict, closed=True, total=False):  # type...
  class TickConfigKwds (line 6685) | class TickConfigKwds(TypedDict, total=False):
  class TimeFormatSpecifierKwds (line 7164) | class TimeFormatSpecifierKwds(TypedDict, total=False):
  class TimeIntervalStepKwds (line 7204) | class TimeIntervalStepKwds(TypedDict, total=False):
  class TimeLocaleKwds (line 7220) | class TimeLocaleKwds(TypedDict, total=False):
  class TitleConfigKwds (line 7254) | class TitleConfigKwds(TypedDict, total=False):
  class TitleParamsKwds (line 7362) | class TitleParamsKwds(TypedDict, total=False):
  class TooltipContentKwds (line 7493) | class TooltipContentKwds(TypedDict, total=False):
  class TopLevelSelectionParameterKwds (line 7506) | class TopLevelSelectionParameterKwds(TypedDict, total=False):
  class VariableParameterKwds (line 7568) | class VariableParameterKwds(TypedDict, total=False):
  class ViewBackgroundKwds (line 7613) | class ViewBackgroundKwds(TypedDict, total=False):
  class ViewConfigKwds (line 7691) | class ViewConfigKwds(TypedDict, total=False):
  class ThemeConfig (line 7791) | class ThemeConfig(TypedDict, total=False):

FILE: altair/vegalite/v6/schema/_typing.py
  class Value (line 117) | class Value(TypedDict, Generic[T]):
  function is_color_hex (line 163) | def is_color_hex(obj: Any) -> TypeIs[ColorHex]:
  class RowColKwds (line 173) | class RowColKwds(TypedDict, Generic[T], total=False):
  class PaddingKwds (line 194) | class PaddingKwds(TypedDict, total=False):

FILE: altair/vegalite/v6/schema/channels.py
  class FieldChannelMixin (line 158) | class FieldChannelMixin:
    method to_dict (line 161) | def to_dict(
  class ValueChannelMixin (line 224) | class ValueChannelMixin:
    method to_dict (line 227) | def to_dict(
  class DatumChannelMixin (line 249) | class DatumChannelMixin:
    method to_dict (line 252) | def to_dict(
  class Angle (line 268) | class Angle(FieldChannelMixin, core.FieldOrDatumDefWithConditionMarkProp...
    method aggregate (line 492) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Angle: ...
    method aggregate (line 494) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 496) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 498) | def bandPosition(self, _: float, /) -> Angle: ...
    method bin (line 500) | def bin(self, _: bool | Bin | None, /) -> Angle: ...
    method bin (line 502) | def bin(
    method condition (line 517) | def condition(
    method condition (line 524) | def condition(
    method condition (line 532) | def condition(self, _: list[core.ConditionalValueDefnumberExprRef], /)...
    method field (line 534) | def field(self, _: str | RepeatRef, /) -> Angle: ...
    method field (line 536) | def field(
    method legend (line 542) | def legend(self, _: Legend | None, /) -> Angle: ...
    method legend (line 544) | def legend(
    method scale (line 651) | def scale(self, _: Scale | None, /) -> Angle: ...
    method scale (line 653) | def scale(
    method sort (line 703) | def sort(
    method sort (line 714) | def sort(
    method sort (line 722) | def sort(
    method timeUnit (line 729) | def timeUnit(
    method timeUnit (line 735) | def timeUnit(
    method title (line 745) | def title(self, _: str | Sequence[str] | None, /) -> Angle: ...
    method type (line 747) | def type(self, _: StandardType_T, /) -> Angle: ...
    method __init__ (line 749) | def __init__(
  class AngleDatum (line 794) | class AngleDatum(DatumChannelMixin, core.FieldOrDatumDefWithConditionDat...
    method bandPosition (line 905) | def bandPosition(self, _: float, /) -> AngleDatum: ...
    method condition (line 907) | def condition(
    method condition (line 914) | def condition(
    method condition (line 922) | def condition(
    method title (line 926) | def title(self, _: str | Sequence[str] | None, /) -> AngleDatum: ...
    method type (line 928) | def type(self, _: Type_T, /) -> AngleDatum: ...
    method __init__ (line 930) | def __init__(
  class AngleValue (line 950) | class AngleValue(
    method condition (line 970) | def condition(
    method condition (line 997) | def condition(
    method condition (line 1011) | def condition(
    method condition (line 1039) | def condition(
    method condition (line 1054) | def condition(
    method condition (line 1061) | def condition(
    method condition (line 1069) | def condition(
    method __init__ (line 1073) | def __init__(
  class Color (line 1083) | class Color(
    method aggregate (line 1310) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Color: ...
    method aggregate (line 1312) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 1314) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 1316) | def bandPosition(self, _: float, /) -> Color: ...
    method bin (line 1318) | def bin(self, _: bool | Bin | None, /) -> Color: ...
    method bin (line 1320) | def bin(
    method condition (line 1335) | def condition(
    method condition (line 1342) | def condition(
    method condition (line 1350) | def condition(
    method field (line 1354) | def field(self, _: str | RepeatRef, /) -> Color: ...
    method field (line 1356) | def field(
    method legend (line 1362) | def legend(self, _: Legend | None, /) -> Color: ...
    method legend (line 1364) | def legend(
    method scale (line 1471) | def scale(self, _: Scale | None, /) -> Color: ...
    method scale (line 1473) | def scale(
    method sort (line 1523) | def sort(
    method sort (line 1534) | def sort(
    method sort (line 1542) | def sort(
    method timeUnit (line 1549) | def timeUnit(
    method timeUnit (line 1555) | def timeUnit(
    method title (line 1565) | def title(self, _: str | Sequence[str] | None, /) -> Color: ...
    method type (line 1567) | def type(self, _: StandardType_T, /) -> Color: ...
    method __init__ (line 1569) | def __init__(
  class ColorDatum (line 1614) | class ColorDatum(
    method bandPosition (line 1727) | def bandPosition(self, _: float, /) -> ColorDatum: ...
    method condition (line 1729) | def condition(
    method condition (line 1736) | def condition(
    method condition (line 1744) | def condition(
    method title (line 1748) | def title(self, _: str | Sequence[str] | None, /) -> ColorDatum: ...
    method type (line 1750) | def type(self, _: Type_T, /) -> ColorDatum: ...
    method __init__ (line 1752) | def __init__(
  class ColorValue (line 1772) | class ColorValue(
    method condition (line 1793) | def condition(
    method condition (line 1820) | def condition(
    method condition (line 1834) | def condition(
    method condition (line 1862) | def condition(
    method condition (line 1877) | def condition(
    method condition (line 1884) | def condition(
    method condition (line 1892) | def condition(
    method __init__ (line 1896) | def __init__(
  class Column (line 1906) | class Column(FieldChannelMixin, core.RowColumnEncodingFieldDef):
    method aggregate (line 2115) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Column: ...
    method aggregate (line 2117) | def aggregate(
    method aggregate (line 2121) | def aggregate(
    method align (line 2125) | def align(self, _: LayoutAlign_T, /) -> Column: ...
    method bandPosition (line 2127) | def bandPosition(self, _: float, /) -> Column: ...
    method bin (line 2129) | def bin(self, _: bool | Bin | None, /) -> Column: ...
    method bin (line 2131) | def bin(
    method center (line 2146) | def center(self, _: bool, /) -> Column: ...
    method field (line 2148) | def field(self, _: str | RepeatRef, /) -> Column: ...
    method field (line 2150) | def field(
    method header (line 2156) | def header(self, _: Header | None, /) -> Column: ...
    method header (line 2158) | def header(
    method sort (line 2207) | def sort(
    method sort (line 2219) | def sort(
    method spacing (line 2227) | def spacing(self, _: float, /) -> Column: ...
    method timeUnit (line 2229) | def timeUnit(
    method timeUnit (line 2235) | def timeUnit(
    method title (line 2245) | def title(self, _: str | Sequence[str] | None, /) -> Column: ...
    method type (line 2247) | def type(self, _: StandardType_T, /) -> Column: ...
    method __init__ (line 2249) | def __init__(
  class Description (line 2296) | class Description(FieldChannelMixin, core.StringFieldDefWithCondition):
    method aggregate (line 2497) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Description: ...
    method aggregate (line 2499) | def aggregate(
    method aggregate (line 2503) | def aggregate(
    method bandPosition (line 2507) | def bandPosition(self, _: float, /) -> Description: ...
    method bin (line 2509) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Descript...
    method bin (line 2511) | def bin(
    method condition (line 2526) | def condition(
    method condition (line 2533) | def condition(
    method condition (line 2541) | def condition(
    method field (line 2545) | def field(self, _: str | RepeatRef, /) -> Description: ...
    method field (line 2547) | def field(
    method format (line 2553) | def format(self, _: str, /) -> Description: ...
    method format (line 2555) | def format(
    method format (line 2570) | def format(self, _: Map, /) -> Description: ...
    method formatType (line 2572) | def formatType(self, _: str, /) -> Description: ...
    method timeUnit (line 2574) | def timeUnit(
    method timeUnit (line 2580) | def timeUnit(
    method title (line 2590) | def title(self, _: str | Sequence[str] | None, /) -> Description: ...
    method type (line 2592) | def type(self, _: StandardType_T, /) -> Description: ...
    method __init__ (line 2594) | def __init__(
  class DescriptionValue (line 2628) | class DescriptionValue(ValueChannelMixin, core.StringValueDefWithConditi...
    method condition (line 2646) | def condition(
    method condition (line 2673) | def condition(
    method condition (line 2687) | def condition(
    method condition (line 2715) | def condition(
    method condition (line 2730) | def condition(
    method condition (line 2737) | def condition(
    method condition (line 2745) | def condition(
    method __init__ (line 2749) | def __init__(
  class Detail (line 2759) | class Detail(FieldChannelMixin, core.FieldDefWithoutScale):
    method aggregate (line 2918) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Detail: ...
    method aggregate (line 2920) | def aggregate(
    method aggregate (line 2924) | def aggregate(
    method bandPosition (line 2928) | def bandPosition(self, _: float, /) -> Detail: ...
    method bin (line 2930) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Detail: ...
    method bin (line 2932) | def bin(
    method field (line 2947) | def field(self, _: str | RepeatRef, /) -> Detail: ...
    method field (line 2949) | def field(
    method timeUnit (line 2955) | def timeUnit(
    method timeUnit (line 2961) | def timeUnit(
    method title (line 2971) | def title(self, _: str | Sequence[str] | None, /) -> Detail: ...
    method type (line 2973) | def type(self, _: StandardType_T, /) -> Detail: ...
    method __init__ (line 2975) | def __init__(
  class Facet (line 3003) | class Facet(FieldChannelMixin, core.FacetEncodingFieldDef):
    method aggregate (line 3248) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Facet: ...
    method aggregate (line 3250) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 3252) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method align (line 3254) | def align(self, _: RowColKwds[LayoutAlign_T] | LayoutAlign_T, /) -> Fa...
    method align (line 3256) | def align(
    method bandPosition (line 3263) | def bandPosition(self, _: float, /) -> Facet: ...
    method bin (line 3265) | def bin(self, _: bool | Bin | None, /) -> Facet: ...
    method bin (line 3267) | def bin(
    method bounds (line 3282) | def bounds(self, _: Literal["full", "flush"], /) -> Facet: ...
    method center (line 3284) | def center(self, _: bool | RowColKwds[bool], /) -> Facet: ...
    method center (line 3286) | def center(
    method columns (line 3290) | def columns(self, _: float, /) -> Facet: ...
    method field (line 3292) | def field(self, _: str | RepeatRef, /) -> Facet: ...
    method field (line 3294) | def field(
    method header (line 3300) | def header(self, _: Header | None, /) -> Facet: ...
    method header (line 3302) | def header(
    method sort (line 3351) | def sort(
    method sort (line 3363) | def sort(
    method spacing (line 3371) | def spacing(self, _: float | RowColKwds[float], /) -> Facet: ...
    method spacing (line 3373) | def spacing(
    method timeUnit (line 3377) | def timeUnit(
    method timeUnit (line 3383) | def timeUnit(
    method title (line 3393) | def title(self, _: str | Sequence[str] | None, /) -> Facet: ...
    method type (line 3395) | def type(self, _: StandardType_T, /) -> Facet: ...
    method __init__ (line 3397) | def __init__(
  class Fill (line 3448) | class Fill(
    method aggregate (line 3675) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Fill: ...
    method aggregate (line 3677) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 3679) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 3681) | def bandPosition(self, _: float, /) -> Fill: ...
    method bin (line 3683) | def bin(self, _: bool | Bin | None, /) -> Fill: ...
    method bin (line 3685) | def bin(
    method condition (line 3700) | def condition(
    method condition (line 3707) | def condition(
    method condition (line 3715) | def condition(
    method field (line 3719) | def field(self, _: str | RepeatRef, /) -> Fill: ...
    method field (line 3721) | def field(
    method legend (line 3727) | def legend(self, _: Legend | None, /) -> Fill: ...
    method legend (line 3729) | def legend(
    method scale (line 3836) | def scale(self, _: Scale | None, /) -> Fill: ...
    method scale (line 3838) | def scale(
    method sort (line 3888) | def sort(
    method sort (line 3899) | def sort(
    method sort (line 3907) | def sort(
    method timeUnit (line 3914) | def timeUnit(
    method timeUnit (line 3920) | def timeUnit(
    method title (line 3930) | def title(self, _: str | Sequence[str] | None, /) -> Fill: ...
    method type (line 3932) | def type(self, _: StandardType_T, /) -> Fill: ...
    method __init__ (line 3934) | def __init__(
  class FillDatum (line 3979) | class FillDatum(
    method bandPosition (line 4092) | def bandPosition(self, _: float, /) -> FillDatum: ...
    method condition (line 4094) | def condition(
    method condition (line 4101) | def condition(
    method condition (line 4109) | def condition(
    method title (line 4113) | def title(self, _: str | Sequence[str] | None, /) -> FillDatum: ...
    method type (line 4115) | def type(self, _: Type_T, /) -> FillDatum: ...
    method __init__ (line 4117) | def __init__(
  class FillValue (line 4137) | class FillValue(
    method condition (line 4158) | def condition(
    method condition (line 4185) | def condition(
    method condition (line 4199) | def condition(
    method condition (line 4227) | def condition(
    method condition (line 4242) | def condition(
    method condition (line 4249) | def condition(
    method condition (line 4257) | def condition(
    method __init__ (line 4261) | def __init__(
  class FillOpacity (line 4271) | class FillOpacity(
    method aggregate (line 4497) | def aggregate(self, _: NonArgAggregateOp_T, /) -> FillOpacity: ...
    method aggregate (line 4499) | def aggregate(
    method aggregate (line 4503) | def aggregate(
    method bandPosition (line 4507) | def bandPosition(self, _: float, /) -> FillOpacity: ...
    method bin (line 4509) | def bin(self, _: bool | Bin | None, /) -> FillOpacity: ...
    method bin (line 4511) | def bin(
    method condition (line 4526) | def condition(
    method condition (line 4533) | def condition(
    method condition (line 4541) | def condition(
    method field (line 4545) | def field(self, _: str | RepeatRef, /) -> FillOpacity: ...
    method field (line 4547) | def field(
    method legend (line 4553) | def legend(self, _: Legend | None, /) -> FillOpacity: ...
    method legend (line 4555) | def legend(
    method scale (line 4662) | def scale(self, _: Scale | None, /) -> FillOpacity: ...
    method scale (line 4664) | def scale(
    method sort (line 4714) | def sort(
    method sort (line 4725) | def sort(
    method sort (line 4733) | def sort(
    method timeUnit (line 4740) | def timeUnit(
    method timeUnit (line 4746) | def timeUnit(
    method title (line 4756) | def title(self, _: str | Sequence[str] | None, /) -> FillOpacity: ...
    method type (line 4758) | def type(self, _: StandardType_T, /) -> FillOpacity: ...
    method __init__ (line 4760) | def __init__(
  class FillOpacityDatum (line 4805) | class FillOpacityDatum(
    method bandPosition (line 4918) | def bandPosition(self, _: float, /) -> FillOpacityDatum: ...
    method condition (line 4920) | def condition(
    method condition (line 4927) | def condition(
    method condition (line 4935) | def condition(
    method title (line 4939) | def title(self, _: str | Sequence[str] | None, /) -> FillOpacityDatum:...
    method type (line 4941) | def type(self, _: Type_T, /) -> FillOpacityDatum: ...
    method __init__ (line 4943) | def __init__(
  class FillOpacityValue (line 4963) | class FillOpacityValue(
    method condition (line 4983) | def condition(
    method condition (line 5010) | def condition(
    method condition (line 5024) | def condition(
    method condition (line 5052) | def condition(
    method condition (line 5067) | def condition(
    method condition (line 5074) | def condition(
    method condition (line 5082) | def condition(
    method __init__ (line 5086) | def __init__(
  class Href (line 5096) | class Href(FieldChannelMixin, core.StringFieldDefWithCondition):
    method aggregate (line 5297) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Href: ...
    method aggregate (line 5299) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 5301) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 5303) | def bandPosition(self, _: float, /) -> Href: ...
    method bin (line 5305) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Href: ...
    method bin (line 5307) | def bin(
    method condition (line 5322) | def condition(
    method condition (line 5329) | def condition(
    method condition (line 5337) | def condition(self, _: list[core.ConditionalValueDefstringExprRef], /)...
    method field (line 5339) | def field(self, _: str | RepeatRef, /) -> Href: ...
    method field (line 5341) | def field(
    method format (line 5347) | def format(self, _: str, /) -> Href: ...
    method format (line 5349) | def format(
    method format (line 5364) | def format(self, _: Map, /) -> Href: ...
    method formatType (line 5366) | def formatType(self, _: str, /) -> Href: ...
    method timeUnit (line 5368) | def timeUnit(
    method timeUnit (line 5374) | def timeUnit(
    method title (line 5384) | def title(self, _: str | Sequence[str] | None, /) -> Href: ...
    method type (line 5386) | def type(self, _: StandardType_T, /) -> Href: ...
    method __init__ (line 5388) | def __init__(
  class HrefValue (line 5422) | class HrefValue(ValueChannelMixin, core.StringValueDefWithCondition):
    method condition (line 5440) | def condition(
    method condition (line 5467) | def condition(
    method condition (line 5481) | def condition(
    method condition (line 5509) | def condition(
    method condition (line 5524) | def condition(
    method condition (line 5531) | def condition(
    method condition (line 5539) | def condition(
    method __init__ (line 5543) | def __init__(
  class Key (line 5553) | class Key(FieldChannelMixin, core.FieldDefWithoutScale):
    method aggregate (line 5712) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Key: ...
    method aggregate (line 5714) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 5716) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 5718) | def bandPosition(self, _: float, /) -> Key: ...
    method bin (line 5720) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Key: ...
    method bin (line 5722) | def bin(
    method field (line 5737) | def field(self, _: str | RepeatRef, /) -> Key: ...
    method field (line 5739) | def field(
    method timeUnit (line 5745) | def timeUnit(
    method timeUnit (line 5751) | def timeUnit(
    method title (line 5761) | def title(self, _: str | Sequence[str] | None, /) -> Key: ...
    method type (line 5763) | def type(self, _: StandardType_T, /) -> Key: ...
    method __init__ (line 5765) | def __init__(
  class Latitude (line 5793) | class Latitude(FieldChannelMixin, core.LatLongFieldDef):
    method aggregate (line 5950) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Latitude: ...
    method aggregate (line 5952) | def aggregate(
    method aggregate (line 5956) | def aggregate(
    method bandPosition (line 5960) | def bandPosition(self, _: float, /) -> Latitude: ...
    method bin (line 5962) | def bin(self, _: None, /) -> Latitude: ...
    method field (line 5964) | def field(self, _: str | RepeatRef, /) -> Latitude: ...
    method field (line 5966) | def field(
    method timeUnit (line 5972) | def timeUnit(
    method timeUnit (line 5978) | def timeUnit(
    method title (line 5988) | def title(self, _: str | Sequence[str] | None, /) -> Latitude: ...
    method type (line 5990) | def type(self, _: Literal["quantitative"], /) -> Latitude: ...
    method __init__ (line 5992) | def __init__(
  class LatitudeDatum (line 6020) | class LatitudeDatum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 6124) | def bandPosition(self, _: float, /) -> LatitudeDatum: ...
    method title (line 6126) | def title(self, _: str | Sequence[str] | None, /) -> LatitudeDatum: ...
    method type (line 6128) | def type(self, _: Type_T, /) -> LatitudeDatum: ...
    method __init__ (line 6130) | def __init__(
  class Latitude2 (line 6144) | class Latitude2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 6238) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Latitude2: ...
    method aggregate (line 6240) | def aggregate(
    method aggregate (line 6244) | def aggregate(
    method bandPosition (line 6248) | def bandPosition(self, _: float, /) -> Latitude2: ...
    method bin (line 6250) | def bin(self, _: None, /) -> Latitude2: ...
    method field (line 6252) | def field(self, _: str | RepeatRef, /) -> Latitude2: ...
    method field (line 6254) | def field(
    method timeUnit (line 6260) | def timeUnit(
    method timeUnit (line 6266) | def timeUnit(
    method title (line 6276) | def title(self, _: str | Sequence[str] | None, /) -> Latitude2: ...
    method __init__ (line 6278) | def __init__(
  class Latitude2Datum (line 6304) | class Latitude2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 6408) | def bandPosition(self, _: float, /) -> Latitude2Datum: ...
    method title (line 6410) | def title(self, _: str | Sequence[str] | None, /) -> Latitude2Datum: ...
    method type (line 6412) | def type(self, _: Type_T, /) -> Latitude2Datum: ...
    method __init__ (line 6414) | def __init__(
  class Latitude2Value (line 6428) | class Latitude2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 6446) | def __init__(self, value, **kwds):
  class Longitude (line 6451) | class Longitude(FieldChannelMixin, core.LatLongFieldDef):
    method aggregate (line 6608) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Longitude: ...
    method aggregate (line 6610) | def aggregate(
    method aggregate (line 6614) | def aggregate(
    method bandPosition (line 6618) | def bandPosition(self, _: float, /) -> Longitude: ...
    method bin (line 6620) | def bin(self, _: None, /) -> Longitude: ...
    method field (line 6622) | def field(self, _: str | RepeatRef, /) -> Longitude: ...
    method field (line 6624) | def field(
    method timeUnit (line 6630) | def timeUnit(
    method timeUnit (line 6636) | def timeUnit(
    method title (line 6646) | def title(self, _: str | Sequence[str] | None, /) -> Longitude: ...
    method type (line 6648) | def type(self, _: Literal["quantitative"], /) -> Longitude: ...
    method __init__ (line 6650) | def __init__(
  class LongitudeDatum (line 6678) | class LongitudeDatum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 6782) | def bandPosition(self, _: float, /) -> LongitudeDatum: ...
    method title (line 6784) | def title(self, _: str | Sequence[str] | None, /) -> LongitudeDatum: ...
    method type (line 6786) | def type(self, _: Type_T, /) -> LongitudeDatum: ...
    method __init__ (line 6788) | def __init__(
  class Longitude2 (line 6802) | class Longitude2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 6896) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Longitude2: ...
    method aggregate (line 6898) | def aggregate(
    method aggregate (line 6902) | def aggregate(
    method bandPosition (line 6906) | def bandPosition(self, _: float, /) -> Longitude2: ...
    method bin (line 6908) | def bin(self, _: None, /) -> Longitude2: ...
    method field (line 6910) | def field(self, _: str | RepeatRef, /) -> Longitude2: ...
    method field (line 6912) | def field(
    method timeUnit (line 6918) | def timeUnit(
    method timeUnit (line 6924) | def timeUnit(
    method title (line 6934) | def title(self, _: str | Sequence[str] | None, /) -> Longitude2: ...
    method __init__ (line 6936) | def __init__(
  class Longitude2Datum (line 6962) | class Longitude2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 7066) | def bandPosition(self, _: float, /) -> Longitude2Datum: ...
    method title (line 7068) | def title(self, _: str | Sequence[str] | None, /) -> Longitude2Datum: ...
    method type (line 7070) | def type(self, _: Type_T, /) -> Longitude2Datum: ...
    method __init__ (line 7072) | def __init__(
  class Longitude2Value (line 7086) | class Longitude2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 7104) | def __init__(self, value, **kwds):
  class Opacity (line 7109) | class Opacity(
    method aggregate (line 7335) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Opacity: ...
    method aggregate (line 7337) | def aggregate(
    method aggregate (line 7341) | def aggregate(
    method bandPosition (line 7345) | def bandPosition(self, _: float, /) -> Opacity: ...
    method bin (line 7347) | def bin(self, _: bool | Bin | None, /) -> Opacity: ...
    method bin (line 7349) | def bin(
    method condition (line 7364) | def condition(
    method condition (line 7371) | def condition(
    method condition (line 7379) | def condition(
    method field (line 7383) | def field(self, _: str | RepeatRef, /) -> Opacity: ...
    method field (line 7385) | def field(
    method legend (line 7391) | def legend(self, _: Legend | None, /) -> Opacity: ...
    method legend (line 7393) | def legend(
    method scale (line 7500) | def scale(self, _: Scale | None, /) -> Opacity: ...
    method scale (line 7502) | def scale(
    method sort (line 7552) | def sort(
    method sort (line 7563) | def sort(
    method sort (line 7571) | def sort(
    method timeUnit (line 7578) | def timeUnit(
    method timeUnit (line 7584) | def timeUnit(
    method title (line 7594) | def title(self, _: str | Sequence[str] | None, /) -> Opacity: ...
    method type (line 7596) | def type(self, _: StandardType_T, /) -> Opacity: ...
    method __init__ (line 7598) | def __init__(
  class OpacityDatum (line 7643) | class OpacityDatum(DatumChannelMixin, core.FieldOrDatumDefWithConditionD...
    method bandPosition (line 7754) | def bandPosition(self, _: float, /) -> OpacityDatum: ...
    method condition (line 7756) | def condition(
    method condition (line 7763) | def condition(
    method condition (line 7771) | def condition(
    method title (line 7775) | def title(self, _: str | Sequence[str] | None, /) -> OpacityDatum: ...
    method type (line 7777) | def type(self, _: Type_T, /) -> OpacityDatum: ...
    method __init__ (line 7779) | def __init__(
  class OpacityValue (line 7799) | class OpacityValue(
    method condition (line 7819) | def condition(
    method condition (line 7846) | def condition(
    method condition (line 7860) | def condition(
    method condition (line 7888) | def condition(
    method condition (line 7903) | def condition(
    method condition (line 7910) | def condition(
    method condition (line 7918) | def condition(
    method __init__ (line 7922) | def __init__(
  class Order (line 7932) | class Order(FieldChannelMixin, core.OrderFieldDef):
    method aggregate (line 8091) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Order: ...
    method aggregate (line 8093) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 8095) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 8097) | def bandPosition(self, _: float, /) -> Order: ...
    method bin (line 8099) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Order: ...
    method bin (line 8101) | def bin(
    method field (line 8116) | def field(self, _: str | RepeatRef, /) -> Order: ...
    method field (line 8118) | def field(
    method sort (line 8124) | def sort(self, _: SortOrder_T, /) -> Order: ...
    method timeUnit (line 8126) | def timeUnit(
    method timeUnit (line 8132) | def timeUnit(
    method title (line 8142) | def title(self, _: str | Sequence[str] | None, /) -> Order: ...
    method type (line 8144) | def type(self, _: StandardType_T, /) -> Order: ...
    method __init__ (line 8146) | def __init__(
  class OrderValue (line 8176) | class OrderValue(ValueChannelMixin, core.OrderValueDef):
    method condition (line 8199) | def condition(
    method condition (line 8206) | def condition(
    method condition (line 8214) | def condition(self, _: list[core.ConditionalValueDefnumber], /) -> Ord...
    method __init__ (line 8216) | def __init__(
  class Radius (line 8226) | class Radius(FieldChannelMixin, core.PositionFieldDefBase):
    method aggregate (line 8464) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Radius: ...
    method aggregate (line 8466) | def aggregate(
    method aggregate (line 8470) | def aggregate(
    method bandPosition (line 8474) | def bandPosition(self, _: float, /) -> Radius: ...
    method bin (line 8476) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Radius: ...
    method bin (line 8478) | def bin(
    method field (line 8493) | def field(self, _: str | RepeatRef, /) -> Radius: ...
    method field (line 8495) | def field(
    method scale (line 8501) | def scale(self, _: Scale | None, /) -> Radius: ...
    method scale (line 8503) | def scale(
    method sort (line 8553) | def sort(
    method sort (line 8564) | def sort(
    method sort (line 8572) | def sort(
    method stack (line 8579) | def stack(self, _: bool | StackOffset_T | None, /) -> Radius: ...
    method timeUnit (line 8581) | def timeUnit(
    method timeUnit (line 8587) | def timeUnit(
    method title (line 8597) | def title(self, _: str | Sequence[str] | None, /) -> Radius: ...
    method type (line 8599) | def type(self, _: StandardType_T, /) -> Radius: ...
    method __init__ (line 8601) | def __init__(
  class RadiusDatum (line 8644) | class RadiusDatum(DatumChannelMixin, core.PositionDatumDefBase):
    method bandPosition (line 8791) | def bandPosition(self, _: float, /) -> RadiusDatum: ...
    method scale (line 8793) | def scale(self, _: Scale | None, /) -> RadiusDatum: ...
    method scale (line 8795) | def scale(
    method stack (line 8845) | def stack(self, _: bool | StackOffset_T | None, /) -> RadiusDatum: ...
    method title (line 8847) | def title(self, _: str | Sequence[str] | None, /) -> RadiusDatum: ...
    method type (line 8849) | def type(self, _: Type_T, /) -> RadiusDatum: ...
    method __init__ (line 8851) | def __init__(
  class RadiusValue (line 8873) | class RadiusValue(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 8891) | def __init__(self, value, **kwds):
  class Radius2 (line 8896) | class Radius2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 8990) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Radius2: ...
    method aggregate (line 8992) | def aggregate(
    method aggregate (line 8996) | def aggregate(
    method bandPosition (line 9000) | def bandPosition(self, _: float, /) -> Radius2: ...
    method bin (line 9002) | def bin(self, _: None, /) -> Radius2: ...
    method field (line 9004) | def field(self, _: str | RepeatRef, /) -> Radius2: ...
    method field (line 9006) | def field(
    method timeUnit (line 9012) | def timeUnit(
    method timeUnit (line 9018) | def timeUnit(
    method title (line 9028) | def title(self, _: str | Sequence[str] | None, /) -> Radius2: ...
    method __init__ (line 9030) | def __init__(
  class Radius2Datum (line 9056) | class Radius2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 9160) | def bandPosition(self, _: float, /) -> Radius2Datum: ...
    method title (line 9162) | def title(self, _: str | Sequence[str] | None, /) -> Radius2Datum: ...
    method type (line 9164) | def type(self, _: Type_T, /) -> Radius2Datum: ...
    method __init__ (line 9166) | def __init__(
  class Radius2Value (line 9180) | class Radius2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 9198) | def __init__(self, value, **kwds):
  class Row (line 9203) | class Row(FieldChannelMixin, core.RowColumnEncodingFieldDef):
    method aggregate (line 9412) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Row: ...
    method aggregate (line 9414) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 9416) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method align (line 9418) | def align(self, _: LayoutAlign_T, /) -> Row: ...
    method bandPosition (line 9420) | def bandPosition(self, _: float, /) -> Row: ...
    method bin (line 9422) | def bin(self, _: bool | Bin | None, /) -> Row: ...
    method bin (line 9424) | def bin(
    method center (line 9439) | def center(self, _: bool, /) -> Row: ...
    method field (line 9441) | def field(self, _: str | RepeatRef, /) -> Row: ...
    method field (line 9443) | def field(
    method header (line 9449) | def header(self, _: Header | None, /) -> Row: ...
    method header (line 9451) | def header(
    method sort (line 9500) | def sort(
    method sort (line 9512) | def sort(
    method spacing (line 9520) | def spacing(self, _: float, /) -> Row: ...
    method timeUnit (line 9522) | def timeUnit(
    method timeUnit (line 9528) | def timeUnit(
    method title (line 9538) | def title(self, _: str | Sequence[str] | None, /) -> Row: ...
    method type (line 9540) | def type(self, _: StandardType_T, /) -> Row: ...
    method __init__ (line 9542) | def __init__(
  class Shape (line 9589) | class Shape(
    method aggregate (line 9816) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Shape: ...
    method aggregate (line 9818) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 9820) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 9822) | def bandPosition(self, _: float, /) -> Shape: ...
    method bin (line 9824) | def bin(self, _: bool | Bin | None, /) -> Shape: ...
    method bin (line 9826) | def bin(
    method condition (line 9841) | def condition(
    method condition (line 9848) | def condition(
    method condition (line 9856) | def condition(
    method field (line 9860) | def field(self, _: str | RepeatRef, /) -> Shape: ...
    method field (line 9862) | def field(
    method legend (line 9868) | def legend(self, _: Legend | None, /) -> Shape: ...
    method legend (line 9870) | def legend(
    method scale (line 9977) | def scale(self, _: Scale | None, /) -> Shape: ...
    method scale (line 9979) | def scale(
    method sort (line 10029) | def sort(
    method sort (line 10040) | def sort(
    method sort (line 10048) | def sort(
    method timeUnit (line 10055) | def timeUnit(
    method timeUnit (line 10061) | def timeUnit(
    method title (line 10071) | def title(self, _: str | Sequence[str] | None, /) -> Shape: ...
    method type (line 10073) | def type(self, _: TypeForShape_T, /) -> Shape: ...
    method __init__ (line 10075) | def __init__(
  class ShapeDatum (line 10120) | class ShapeDatum(
    method bandPosition (line 10233) | def bandPosition(self, _: float, /) -> ShapeDatum: ...
    method condition (line 10235) | def condition(
    method condition (line 10242) | def condition(
    method condition (line 10250) | def condition(
    method title (line 10254) | def title(self, _: str | Sequence[str] | None, /) -> ShapeDatum: ...
    method type (line 10256) | def type(self, _: Type_T, /) -> ShapeDatum: ...
    method __init__ (line 10258) | def __init__(
  class ShapeValue (line 10278) | class ShapeValue(
    method condition (line 10299) | def condition(
    method condition (line 10326) | def condition(
    method condition (line 10340) | def condition(
    method condition (line 10368) | def condition(
    method condition (line 10383) | def condition(
    method condition (line 10390) | def condition(
    method condition (line 10398) | def condition(
    method __init__ (line 10402) | def __init__(
  class Size (line 10412) | class Size(FieldChannelMixin, core.FieldOrDatumDefWithConditionMarkPropF...
    method aggregate (line 10636) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Size: ...
    method aggregate (line 10638) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 10640) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 10642) | def bandPosition(self, _: float, /) -> Size: ...
    method bin (line 10644) | def bin(self, _: bool | Bin | None, /) -> Size: ...
    method bin (line 10646) | def bin(
    method condition (line 10661) | def condition(
    method condition (line 10668) | def condition(
    method condition (line 10676) | def condition(self, _: list[core.ConditionalValueDefnumberExprRef], /)...
    method field (line 10678) | def field(self, _: str | RepeatRef, /) -> Size: ...
    method field (line 10680) | def field(
    method legend (line 10686) | def legend(self, _: Legend | None, /) -> Size: ...
    method legend (line 10688) | def legend(
    method scale (line 10795) | def scale(self, _: Scale | None, /) -> Size: ...
    method scale (line 10797) | def scale(
    method sort (line 10847) | def sort(
    method sort (line 10858) | def sort(
    method sort (line 10866) | def sort(
    method timeUnit (line 10873) | def timeUnit(
    method timeUnit (line 10879) | def timeUnit(
    method title (line 10889) | def title(self, _: str | Sequence[str] | None, /) -> Size: ...
    method type (line 10891) | def type(self, _: StandardType_T, /) -> Size: ...
    method __init__ (line 10893) | def __init__(
  class SizeDatum (line 10938) | class SizeDatum(DatumChannelMixin, core.FieldOrDatumDefWithConditionDatu...
    method bandPosition (line 11049) | def bandPosition(self, _: float, /) -> SizeDatum: ...
    method condition (line 11051) | def condition(
    method condition (line 11058) | def condition(
    method condition (line 11066) | def condition(
    method title (line 11070) | def title(self, _: str | Sequence[str] | None, /) -> SizeDatum: ...
    method type (line 11072) | def type(self, _: Type_T, /) -> SizeDatum: ...
    method __init__ (line 11074) | def __init__(
  class SizeValue (line 11094) | class SizeValue(
    method condition (line 11114) | def condition(
    method condition (line 11141) | def condition(
    method condition (line 11155) | def condition(
    method condition (line 11183) | def condition(
    method condition (line 11198) | def condition(
    method condition (line 11205) | def condition(
    method condition (line 11213) | def condition(
    method __init__ (line 11217) | def __init__(
  class Stroke (line 11227) | class Stroke(
    method aggregate (line 11454) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Stroke: ...
    method aggregate (line 11456) | def aggregate(
    method aggregate (line 11460) | def aggregate(
    method bandPosition (line 11464) | def bandPosition(self, _: float, /) -> Stroke: ...
    method bin (line 11466) | def bin(self, _: bool | Bin | None, /) -> Stroke: ...
    method bin (line 11468) | def bin(
    method condition (line 11483) | def condition(
    method condition (line 11490) | def condition(
    method condition (line 11498) | def condition(
    method field (line 11502) | def field(self, _: str | RepeatRef, /) -> Stroke: ...
    method field (line 11504) | def field(
    method legend (line 11510) | def legend(self, _: Legend | None, /) -> Stroke: ...
    method legend (line 11512) | def legend(
    method scale (line 11619) | def scale(self, _: Scale | None, /) -> Stroke: ...
    method scale (line 11621) | def scale(
    method sort (line 11671) | def sort(
    method sort (line 11682) | def sort(
    method sort (line 11690) | def sort(
    method timeUnit (line 11697) | def timeUnit(
    method timeUnit (line 11703) | def timeUnit(
    method title (line 11713) | def title(self, _: str | Sequence[str] | None, /) -> Stroke: ...
    method type (line 11715) | def type(self, _: StandardType_T, /) -> Stroke: ...
    method __init__ (line 11717) | def __init__(
  class StrokeDatum (line 11762) | class StrokeDatum(
    method bandPosition (line 11875) | def bandPosition(self, _: float, /) -> StrokeDatum: ...
    method condition (line 11877) | def condition(
    method condition (line 11884) | def condition(
    method condition (line 11892) | def condition(
    method title (line 11896) | def title(self, _: str | Sequence[str] | None, /) -> StrokeDatum: ...
    method type (line 11898) | def type(self, _: Type_T, /) -> StrokeDatum: ...
    method __init__ (line 11900) | def __init__(
  class StrokeValue (line 11920) | class StrokeValue(
    method condition (line 11941) | def condition(
    method condition (line 11968) | def condition(
    method condition (line 11982) | def condition(
    method condition (line 12010) | def condition(
    method condition (line 12025) | def condition(
    method condition (line 12032) | def condition(
    method condition (line 12040) | def condition(
    method __init__ (line 12044) | def __init__(
  class StrokeDash (line 12054) | class StrokeDash(
    method aggregate (line 12280) | def aggregate(self, _: NonArgAggregateOp_T, /) -> StrokeDash: ...
    method aggregate (line 12282) | def aggregate(
    method aggregate (line 12286) | def aggregate(
    method bandPosition (line 12290) | def bandPosition(self, _: float, /) -> StrokeDash: ...
    method bin (line 12292) | def bin(self, _: bool | Bin | None, /) -> StrokeDash: ...
    method bin (line 12294) | def bin(
    method condition (line 12309) | def condition(
    method condition (line 12316) | def condition(
    method condition (line 12324) | def condition(
    method field (line 12328) | def field(self, _: str | RepeatRef, /) -> StrokeDash: ...
    method field (line 12330) | def field(
    method legend (line 12336) | def legend(self, _: Legend | None, /) -> StrokeDash: ...
    method legend (line 12338) | def legend(
    method scale (line 12445) | def scale(self, _: Scale | None, /) -> StrokeDash: ...
    method scale (line 12447) | def scale(
    method sort (line 12497) | def sort(
    method sort (line 12508) | def sort(
    method sort (line 12516) | def sort(
    method timeUnit (line 12523) | def timeUnit(
    method timeUnit (line 12529) | def timeUnit(
    method title (line 12539) | def title(self, _: str | Sequence[str] | None, /) -> StrokeDash: ...
    method type (line 12541) | def type(self, _: StandardType_T, /) -> StrokeDash: ...
    method __init__ (line 12543) | def __init__(
  class StrokeDashDatum (line 12588) | class StrokeDashDatum(
    method bandPosition (line 12701) | def bandPosition(self, _: float, /) -> StrokeDashDatum: ...
    method condition (line 12703) | def condition(
    method condition (line 12710) | def condition(
    method condition (line 12718) | def condition(
    method title (line 12722) | def title(self, _: str | Sequence[str] | None, /) -> StrokeDashDatum: ...
    method type (line 12724) | def type(self, _: Type_T, /) -> StrokeDashDatum: ...
    method __init__ (line 12726) | def __init__(
  class StrokeDashValue (line 12746) | class StrokeDashValue(
    method condition (line 12766) | def condition(
    method condition (line 12793) | def condition(
    method condition (line 12807) | def condition(
    method condition (line 12835) | def condition(
    method condition (line 12850) | def condition(
    method condition (line 12857) | def condition(
    method condition (line 12865) | def condition(
    method __init__ (line 12869) | def __init__(
  class StrokeOpacity (line 12879) | class StrokeOpacity(
    method aggregate (line 13105) | def aggregate(self, _: NonArgAggregateOp_T, /) -> StrokeOpacity: ...
    method aggregate (line 13107) | def aggregate(
    method aggregate (line 13111) | def aggregate(
    method bandPosition (line 13115) | def bandPosition(self, _: float, /) -> StrokeOpacity: ...
    method bin (line 13117) | def bin(self, _: bool | Bin | None, /) -> StrokeOpacity: ...
    method bin (line 13119) | def bin(
    method condition (line 13134) | def condition(
    method condition (line 13141) | def condition(
    method condition (line 13149) | def condition(
    method field (line 13153) | def field(self, _: str | RepeatRef, /) -> StrokeOpacity: ...
    method field (line 13155) | def field(
    method legend (line 13161) | def legend(self, _: Legend | None, /) -> StrokeOpacity: ...
    method legend (line 13163) | def legend(
    method scale (line 13270) | def scale(self, _: Scale | None, /) -> StrokeOpacity: ...
    method scale (line 13272) | def scale(
    method sort (line 13322) | def sort(
    method sort (line 13333) | def sort(
    method sort (line 13341) | def sort(
    method timeUnit (line 13348) | def timeUnit(
    method timeUnit (line 13354) | def timeUnit(
    method title (line 13364) | def title(self, _: str | Sequence[str] | None, /) -> StrokeOpacity: ...
    method type (line 13366) | def type(self, _: StandardType_T, /) -> StrokeOpacity: ...
    method __init__ (line 13368) | def __init__(
  class StrokeOpacityDatum (line 13413) | class StrokeOpacityDatum(
    method bandPosition (line 13526) | def bandPosition(self, _: float, /) -> StrokeOpacityDatum: ...
    method condition (line 13528) | def condition(
    method condition (line 13535) | def condition(
    method condition (line 13543) | def condition(
    method title (line 13547) | def title(self, _: str | Sequence[str] | None, /) -> StrokeOpacityDatu...
    method type (line 13549) | def type(self, _: Type_T, /) -> StrokeOpacityDatum: ...
    method __init__ (line 13551) | def __init__(
  class StrokeOpacityValue (line 13571) | class StrokeOpacityValue(
    method condition (line 13591) | def condition(
    method condition (line 13618) | def condition(
    method condition (line 13632) | def condition(
    method condition (line 13660) | def condition(
    method condition (line 13675) | def condition(
    method condition (line 13682) | def condition(
    method condition (line 13690) | def condition(
    method __init__ (line 13694) | def __init__(
  class StrokeWidth (line 13704) | class StrokeWidth(
    method aggregate (line 13930) | def aggregate(self, _: NonArgAggregateOp_T, /) -> StrokeWidth: ...
    method aggregate (line 13932) | def aggregate(
    method aggregate (line 13936) | def aggregate(
    method bandPosition (line 13940) | def bandPosition(self, _: float, /) -> StrokeWidth: ...
    method bin (line 13942) | def bin(self, _: bool | Bin | None, /) -> StrokeWidth: ...
    method bin (line 13944) | def bin(
    method condition (line 13959) | def condition(
    method condition (line 13966) | def condition(
    method condition (line 13974) | def condition(
    method field (line 13978) | def field(self, _: str | RepeatRef, /) -> StrokeWidth: ...
    method field (line 13980) | def field(
    method legend (line 13986) | def legend(self, _: Legend | None, /) -> StrokeWidth: ...
    method legend (line 13988) | def legend(
    method scale (line 14095) | def scale(self, _: Scale | None, /) -> StrokeWidth: ...
    method scale (line 14097) | def scale(
    method sort (line 14147) | def sort(
    method sort (line 14158) | def sort(
    method sort (line 14166) | def sort(
    method timeUnit (line 14173) | def timeUnit(
    method timeUnit (line 14179) | def timeUnit(
    method title (line 14189) | def title(self, _: str | Sequence[str] | None, /) -> StrokeWidth: ...
    method type (line 14191) | def type(self, _: StandardType_T, /) -> StrokeWidth: ...
    method __init__ (line 14193) | def __init__(
  class StrokeWidthDatum (line 14238) | class StrokeWidthDatum(
    method bandPosition (line 14351) | def bandPosition(self, _: float, /) -> StrokeWidthDatum: ...
    method condition (line 14353) | def condition(
    method condition (line 14360) | def condition(
    method condition (line 14368) | def condition(
    method title (line 14372) | def title(self, _: str | Sequence[str] | None, /) -> StrokeWidthDatum:...
    method type (line 14374) | def type(self, _: Type_T, /) -> StrokeWidthDatum: ...
    method __init__ (line 14376) | def __init__(
  class StrokeWidthValue (line 14396) | class StrokeWidthValue(
    method condition (line 14416) | def condition(
    method condition (line 14443) | def condition(
    method condition (line 14457) | def condition(
    method condition (line 14485) | def condition(
    method condition (line 14500) | def condition(
    method condition (line 14507) | def condition(
    method condition (line 14515) | def condition(
    method __init__ (line 14519) | def __init__(
  class Text (line 14529) | class Text(FieldChannelMixin, core.FieldOrDatumDefWithConditionStringFie...
    method aggregate (line 14730) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Text: ...
    method aggregate (line 14732) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 14734) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 14736) | def bandPosition(self, _: float, /) -> Text: ...
    method bin (line 14738) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Text: ...
    method bin (line 14740) | def bin(
    method condition (line 14755) | def condition(
    method condition (line 14762) | def condition(
    method condition (line 14770) | def condition(self, _: list[core.ConditionalValueDefTextExprRef], /) -...
    method field (line 14772) | def field(self, _: str | RepeatRef, /) -> Text: ...
    method field (line 14774) | def field(
    method format (line 14780) | def format(self, _: str, /) -> Text: ...
    method format (line 14782) | def format(
    method format (line 14797) | def format(self, _: Map, /) -> Text: ...
    method formatType (line 14799) | def formatType(self, _: str, /) -> Text: ...
    method timeUnit (line 14801) | def timeUnit(
    method timeUnit (line 14807) | def timeUnit(
    method title (line 14817) | def title(self, _: str | Sequence[str] | None, /) -> Text: ...
    method type (line 14819) | def type(self, _: StandardType_T, /) -> Text: ...
    method __init__ (line 14821) | def __init__(
  class TextDatum (line 14855) | class TextDatum(DatumChannelMixin, core.FieldOrDatumDefWithConditionStri...
    method bandPosition (line 15003) | def bandPosition(self, _: float, /) -> TextDatum: ...
    method condition (line 15005) | def condition(
    method condition (line 15012) | def condition(
    method condition (line 15020) | def condition(
    method format (line 15024) | def format(self, _: str, /) -> TextDatum: ...
    method format (line 15026) | def format(
    method format (line 15041) | def format(self, _: Map, /) -> TextDatum: ...
    method formatType (line 15043) | def formatType(self, _: str, /) -> TextDatum: ...
    method title (line 15045) | def title(self, _: str | Sequence[str] | None, /) -> TextDatum: ...
    method type (line 15047) | def type(self, _: Type_T, /) -> TextDatum: ...
    method __init__ (line 15049) | def __init__(
  class TextValue (line 15073) | class TextValue(ValueChannelMixin, core.ValueDefWithConditionStringField...
    method condition (line 15091) | def condition(
    method condition (line 15108) | def condition(
    method condition (line 15126) | def condition(
    method condition (line 15133) | def condition(
    method condition (line 15141) | def condition(
    method __init__ (line 15145) | def __init__(
  class Theta (line 15155) | class Theta(FieldChannelMixin, core.PositionFieldDefBase):
    method aggregate (line 15393) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Theta: ...
    method aggregate (line 15395) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 15397) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 15399) | def bandPosition(self, _: float, /) -> Theta: ...
    method bin (line 15401) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Theta: ...
    method bin (line 15403) | def bin(
    method field (line 15418) | def field(self, _: str | RepeatRef, /) -> Theta: ...
    method field (line 15420) | def field(
    method scale (line 15426) | def scale(self, _: Scale | None, /) -> Theta: ...
    method scale (line 15428) | def scale(
    method sort (line 15478) | def sort(
    method sort (line 15489) | def sort(
    method sort (line 15497) | def sort(
    method stack (line 15504) | def stack(self, _: bool | StackOffset_T | None, /) -> Theta: ...
    method timeUnit (line 15506) | def timeUnit(
    method timeUnit (line 15512) | def timeUnit(
    method title (line 15522) | def title(self, _: str | Sequence[str] | None, /) -> Theta: ...
    method type (line 15524) | def type(self, _: StandardType_T, /) -> Theta: ...
    method __init__ (line 15526) | def __init__(
  class ThetaDatum (line 15569) | class ThetaDatum(DatumChannelMixin, core.PositionDatumDefBase):
    method bandPosition (line 15716) | def bandPosition(self, _: float, /) -> ThetaDatum: ...
    method scale (line 15718) | def scale(self, _: Scale | None, /) -> ThetaDatum: ...
    method scale (line 15720) | def scale(
    method stack (line 15770) | def stack(self, _: bool | StackOffset_T | None, /) -> ThetaDatum: ...
    method title (line 15772) | def title(self, _: str | Sequence[str] | None, /) -> ThetaDatum: ...
    method type (line 15774) | def type(self, _: Type_T, /) -> ThetaDatum: ...
    method __init__ (line 15776) | def __init__(
  class ThetaValue (line 15798) | class ThetaValue(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 15816) | def __init__(self, value, **kwds):
  class Theta2 (line 15821) | class Theta2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 15915) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Theta2: ...
    method aggregate (line 15917) | def aggregate(
    method aggregate (line 15921) | def aggregate(
    method bandPosition (line 15925) | def bandPosition(self, _: float, /) -> Theta2: ...
    method bin (line 15927) | def bin(self, _: None, /) -> Theta2: ...
    method field (line 15929) | def field(self, _: str | RepeatRef, /) -> Theta2: ...
    method field (line 15931) | def field(
    method timeUnit (line 15937) | def timeUnit(
    method timeUnit (line 15943) | def timeUnit(
    method title (line 15953) | def title(self, _: str | Sequence[str] | None, /) -> Theta2: ...
    method __init__ (line 15955) | def __init__(
  class Theta2Datum (line 15981) | class Theta2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 16085) | def bandPosition(self, _: float, /) -> Theta2Datum: ...
    method title (line 16087) | def title(self, _: str | Sequence[str] | None, /) -> Theta2Datum: ...
    method type (line 16089) | def type(self, _: Type_T, /) -> Theta2Datum: ...
    method __init__ (line 16091) | def __init__(
  class Theta2Value (line 16105) | class Theta2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 16123) | def __init__(self, value, **kwds):
  class Time (line 16128) | class Time(FieldChannelMixin, core.TimeDef):
    method aggregate (line 16338) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Time: ...
    method aggregate (line 16340) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 16342) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 16344) | def bandPosition(self, _: float, /) -> Time: ...
    method bin (line 16346) | def bin(self, _: bool | Bin | None, /) -> Time: ...
    method bin (line 16348) | def bin(
    method field (line 16363) | def field(self, _: str | RepeatRef, /) -> Time: ...
    method field (line 16365) | def field(
    method rescale (line 16371) | def rescale(self, _: bool, /) -> Time: ...
    method scale (line 16373) | def scale(self, _: Scale | None, /) -> Time: ...
    method scale (line 16375) | def scale(
    method sort (line 16425) | def sort(
    method sort (line 16436) | def sort(
    method sort (line 16444) | def sort(
    method timeUnit (line 16451) | def timeUnit(
    method timeUnit (line 16457) | def timeUnit(
    method title (line 16467) | def title(self, _: str | Sequence[str] | None, /) -> Time: ...
    method type (line 16469) | def type(self, _: StandardType_T, /) -> Time: ...
    method __init__ (line 16471) | def __init__(
  class Tooltip (line 16514) | class Tooltip(FieldChannelMixin, core.StringFieldDefWithCondition):
    method aggregate (line 16715) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Tooltip: ...
    method aggregate (line 16717) | def aggregate(
    method aggregate (line 16721) | def aggregate(
    method bandPosition (line 16725) | def bandPosition(self, _: float, /) -> Tooltip: ...
    method bin (line 16727) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Tooltip:...
    method bin (line 16729) | def bin(
    method condition (line 16744) | def condition(
    method condition (line 16751) | def condition(
    method condition (line 16759) | def condition(
    method field (line 16763) | def field(self, _: str | RepeatRef, /) -> Tooltip: ...
    method field (line 16765) | def field(
    method format (line 16771) | def format(self, _: str, /) -> Tooltip: ...
    method format (line 16773) | def format(
    method format (line 16788) | def format(self, _: Map, /) -> Tooltip: ...
    method formatType (line 16790) | def formatType(self, _: str, /) -> Tooltip: ...
    method timeUnit (line 16792) | def timeUnit(
    method timeUnit (line 16798) | def timeUnit(
    method title (line 16808) | def title(self, _: str | Sequence[str] | None, /) -> Tooltip: ...
    method type (line 16810) | def type(self, _: StandardType_T, /) -> Tooltip: ...
    method __init__ (line 16812) | def __init__(
  class TooltipValue (line 16846) | class TooltipValue(ValueChannelMixin, core.StringValueDefWithCondition):
    method condition (line 16864) | def condition(
    method condition (line 16891) | def condition(
    method condition (line 16905) | def condition(
    method condition (line 16933) | def condition(
    method condition (line 16948) | def condition(
    method condition (line 16955) | def condition(
    method condition (line 16963) | def condition(
    method __init__ (line 16967) | def __init__(
  class Url (line 16977) | class Url(FieldChannelMixin, core.StringFieldDefWithCondition):
    method aggregate (line 17178) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Url: ...
    method aggregate (line 17180) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 17182) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 17184) | def bandPosition(self, _: float, /) -> Url: ...
    method bin (line 17186) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Url: ...
    method bin (line 17188) | def bin(
    method condition (line 17203) | def condition(
    method condition (line 17210) | def condition(
    method condition (line 17218) | def condition(self, _: list[core.ConditionalValueDefstringExprRef], /)...
    method field (line 17220) | def field(self, _: str | RepeatRef, /) -> Url: ...
    method field (line 17222) | def field(
    method format (line 17228) | def format(self, _: str, /) -> Url: ...
    method format (line 17230) | def format(
    method format (line 17245) | def format(self, _: Map, /) -> Url: ...
    method formatType (line 17247) | def formatType(self, _: str, /) -> Url: ...
    method timeUnit (line 17249) | def timeUnit(
    method timeUnit (line 17255) | def timeUnit(
    method title (line 17265) | def title(self, _: str | Sequence[str] | None, /) -> Url: ...
    method type (line 17267) | def type(self, _: StandardType_T, /) -> Url: ...
    method __init__ (line 17269) | def __init__(
  class UrlValue (line 17303) | class UrlValue(ValueChannelMixin, core.StringValueDefWithCondition):
    method condition (line 17321) | def condition(
    method condition (line 17348) | def condition(
    method condition (line 17362) | def condition(
    method condition (line 17390) | def condition(
    method condition (line 17405) | def condition(
    method condition (line 17412) | def condition(
    method condition (line 17420) | def condition(
    method __init__ (line 17424) | def __init__(
  class X (line 17434) | class X(FieldChannelMixin, core.PositionFieldDef):
    method aggregate (line 17689) | def aggregate(self, _: NonArgAggregateOp_T, /) -> X: ...
    method aggregate (line 17691) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 17693) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method axis (line 17695) | def axis(self, _: Axis | None, /) -> X: ...
    method axis (line 17697) | def axis(
    method bandPosition (line 17814) | def bandPosition(self, _: float, /) -> X: ...
    method bin (line 17816) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> X: ...
    method bin (line 17818) | def bin(
    method field (line 17833) | def field(self, _: str | RepeatRef, /) -> X: ...
    method field (line 17835) | def field(
    method impute (line 17841) | def impute(self, _: Impute | None, /) -> X: ...
    method impute (line 17843) | def impute(
    method scale (line 17852) | def scale(self, _: Scale | None, /) -> X: ...
    method scale (line 17854) | def scale(
    method sort (line 17904) | def sort(
    method sort (line 17915) | def sort(
    method sort (line 17923) | def sort(
    method stack (line 17930) | def stack(self, _: bool | StackOffset_T | None, /) -> X: ...
    method timeUnit (line 17932) | def timeUnit(
    method timeUnit (line 17938) | def timeUnit(
    method title (line 17948) | def title(self, _: str | Sequence[str] | None, /) -> X: ...
    method type (line 17950) | def type(self, _: StandardType_T, /) -> X: ...
    method __init__ (line 17952) | def __init__(
  class XDatum (line 17999) | class XDatum(DatumChannelMixin, core.PositionDatumDef):
    method axis (line 18163) | def axis(self, _: Axis | None, /) -> XDatum: ...
    method axis (line 18165) | def axis(
    method bandPosition (line 18282) | def bandPosition(self, _: float, /) -> XDatum: ...
    method impute (line 18284) | def impute(self, _: Impute | None, /) -> XDatum: ...
    method impute (line 18286) | def impute(
    method scale (line 18295) | def scale(self, _: Scale | None, /) -> XDatum: ...
    method scale (line 18297) | def scale(
    method stack (line 18347) | def stack(self, _: bool | StackOffset_T | None, /) -> XDatum: ...
    method title (line 18349) | def title(self, _: str | Sequence[str] | None, /) -> XDatum: ...
    method type (line 18351) | def type(self, _: Type_T, /) -> XDatum: ...
    method __init__ (line 18353) | def __init__(
  class XValue (line 18379) | class XValue(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 18397) | def __init__(self, value, **kwds):
  class X2 (line 18402) | class X2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 18496) | def aggregate(self, _: NonArgAggregateOp_T, /) -> X2: ...
    method aggregate (line 18498) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 18500) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 18502) | def bandPosition(self, _: float, /) -> X2: ...
    method bin (line 18504) | def bin(self, _: None, /) -> X2: ...
    method field (line 18506) | def field(self, _: str | RepeatRef, /) -> X2: ...
    method field (line 18508) | def field(
    method timeUnit (line 18514) | def timeUnit(
    method timeUnit (line 18520) | def timeUnit(
    method title (line 18530) | def title(self, _: str | Sequence[str] | None, /) -> X2: ...
    method __init__ (line 18532) | def __init__(
  class X2Datum (line 18558) | class X2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 18662) | def bandPosition(self, _: float, /) -> X2Datum: ...
    method title (line 18664) | def title(self, _: str | Sequence[str] | None, /) -> X2Datum: ...
    method type (line 18666) | def type(self, _: Type_T, /) -> X2Datum: ...
    method __init__ (line 18668) | def __init__(
  class X2Value (line 18682) | class X2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 18700) | def __init__(self, value, **kwds):
  class XError (line 18705) | class XError(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 18799) | def aggregate(self, _: NonArgAggregateOp_T, /) -> XError: ...
    method aggregate (line 18801) | def aggregate(
    method aggregate (line 18805) | def aggregate(
    method bandPosition (line 18809) | def bandPosition(self, _: float, /) -> XError: ...
    method bin (line 18811) | def bin(self, _: None, /) -> XError: ...
    method field (line 18813) | def field(self, _: str | RepeatRef, /) -> XError: ...
    method field (line 18815) | def field(
    method timeUnit (line 18821) | def timeUnit(
    method timeUnit (line 18827) | def timeUnit(
    method title (line 18837) | def title(self, _: str | Sequence[str] | None, /) -> XError: ...
    method __init__ (line 18839) | def __init__(
  class XErrorValue (line 18865) | class XErrorValue(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 18883) | def __init__(self, value, **kwds):
  class XError2 (line 18888) | class XError2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 18982) | def aggregate(self, _: NonArgAggregateOp_T, /) -> XError2: ...
    method aggregate (line 18984) | def aggregate(
    method aggregate (line 18988) | def aggregate(
    method bandPosition (line 18992) | def bandPosition(self, _: float, /) -> XError2: ...
    method bin (line 18994) | def bin(self, _: None, /) -> XError2: ...
    method field (line 18996) | def field(self, _: str | RepeatRef, /) -> XError2: ...
    method field (line 18998) | def field(
    method timeUnit (line 19004) | def timeUnit(
    method timeUnit (line 19010) | def timeUnit(
    method title (line 19020) | def title(self, _: str | Sequence[str] | None, /) -> XError2: ...
    method __init__ (line 19022) | def __init__(
  class XError2Value (line 19048) | class XError2Value(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 19066) | def __init__(self, value, **kwds):
  class XOffset (line 19071) | class XOffset(FieldChannelMixin, core.ScaleFieldDef):
    method aggregate (line 19279) | def aggregate(self, _: NonArgAggregateOp_T, /) -> XOffset: ...
    method aggregate (line 19281) | def aggregate(
    method aggregate (line 19285) | def aggregate(
    method bandPosition (line 19289) | def bandPosition(self, _: float, /) -> XOffset: ...
    method bin (line 19291) | def bin(self, _: bool | Bin | None, /) -> XOffset: ...
    method bin (line 19293) | def bin(
    method field (line 19308) | def field(self, _: str | RepeatRef, /) -> XOffset: ...
    method field (line 19310) | def field(
    method scale (line 19316) | def scale(self, _: Scale | None, /) -> XOffset: ...
    method scale (line 19318) | def scale(
    method sort (line 19368) | def sort(
    method sort (line 19379) | def sort(
    method sort (line 19387) | def sort(
    method timeUnit (line 19394) | def timeUnit(
    method timeUnit (line 19400) | def timeUnit(
    method title (line 19410) | def title(self, _: str | Sequence[str] | None, /) -> XOffset: ...
    method type (line 19412) | def type(self, _: StandardType_T, /) -> XOffset: ...
    method __init__ (line 19414) | def __init__(
  class XOffsetDatum (line 19455) | class XOffsetDatum(DatumChannelMixin, core.ScaleDatumDef):
    method bandPosition (line 19572) | def bandPosition(self, _: float, /) -> XOffsetDatum: ...
    method scale (line 19574) | def scale(self, _: Scale | None, /) -> XOffsetDatum: ...
    method scale (line 19576) | def scale(
    method title (line 19626) | def title(self, _: str | Sequence[str] | None, /) -> XOffsetDatum: ...
    method type (line 19628) | def type(self, _: Type_T, /) -> XOffsetDatum: ...
    method __init__ (line 19630) | def __init__(
  class XOffsetValue (line 19650) | class XOffsetValue(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 19668) | def __init__(self, value, **kwds):
  class Y (line 19673) | class Y(FieldChannelMixin, core.PositionFieldDef):
    method aggregate (line 19928) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Y: ...
    method aggregate (line 19930) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 19932) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method axis (line 19934) | def axis(self, _: Axis | None, /) -> Y: ...
    method axis (line 19936) | def axis(
    method bandPosition (line 20053) | def bandPosition(self, _: float, /) -> Y: ...
    method bin (line 20055) | def bin(self, _: bool | Bin | Literal["binned"] | None, /) -> Y: ...
    method bin (line 20057) | def bin(
    method field (line 20072) | def field(self, _: str | RepeatRef, /) -> Y: ...
    method field (line 20074) | def field(
    method impute (line 20080) | def impute(self, _: Impute | None, /) -> Y: ...
    method impute (line 20082) | def impute(
    method scale (line 20091) | def scale(self, _: Scale | None, /) -> Y: ...
    method scale (line 20093) | def scale(
    method sort (line 20143) | def sort(
    method sort (line 20154) | def sort(
    method sort (line 20162) | def sort(
    method stack (line 20169) | def stack(self, _: bool | StackOffset_T | None, /) -> Y: ...
    method timeUnit (line 20171) | def timeUnit(
    method timeUnit (line 20177) | def timeUnit(
    method title (line 20187) | def title(self, _: str | Sequence[str] | None, /) -> Y: ...
    method type (line 20189) | def type(self, _: StandardType_T, /) -> Y: ...
    method __init__ (line 20191) | def __init__(
  class YDatum (line 20238) | class YDatum(DatumChannelMixin, core.PositionDatumDef):
    method axis (line 20402) | def axis(self, _: Axis | None, /) -> YDatum: ...
    method axis (line 20404) | def axis(
    method bandPosition (line 20521) | def bandPosition(self, _: float, /) -> YDatum: ...
    method impute (line 20523) | def impute(self, _: Impute | None, /) -> YDatum: ...
    method impute (line 20525) | def impute(
    method scale (line 20534) | def scale(self, _: Scale | None, /) -> YDatum: ...
    method scale (line 20536) | def scale(
    method stack (line 20586) | def stack(self, _: bool | StackOffset_T | None, /) -> YDatum: ...
    method title (line 20588) | def title(self, _: str | Sequence[str] | None, /) -> YDatum: ...
    method type (line 20590) | def type(self, _: Type_T, /) -> YDatum: ...
    method __init__ (line 20592) | def __init__(
  class YValue (line 20618) | class YValue(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 20636) | def __init__(self, value, **kwds):
  class Y2 (line 20641) | class Y2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 20735) | def aggregate(self, _: NonArgAggregateOp_T, /) -> Y2: ...
    method aggregate (line 20737) | def aggregate(self, *, argmax: Optional[str | SchemaBase] = Undefined)...
    method aggregate (line 20739) | def aggregate(self, *, argmin: Optional[str | SchemaBase] = Undefined)...
    method bandPosition (line 20741) | def bandPosition(self, _: float, /) -> Y2: ...
    method bin (line 20743) | def bin(self, _: None, /) -> Y2: ...
    method field (line 20745) | def field(self, _: str | RepeatRef, /) -> Y2: ...
    method field (line 20747) | def field(
    method timeUnit (line 20753) | def timeUnit(
    method timeUnit (line 20759) | def timeUnit(
    method title (line 20769) | def title(self, _: str | Sequence[str] | None, /) -> Y2: ...
    method __init__ (line 20771) | def __init__(
  class Y2Datum (line 20797) | class Y2Datum(DatumChannelMixin, core.DatumDef):
    method bandPosition (line 20901) | def bandPosition(self, _: float, /) -> Y2Datum: ...
    method title (line 20903) | def title(self, _: str | Sequence[str] | None, /) -> Y2Datum: ...
    method type (line 20905) | def type(self, _: Type_T, /) -> Y2Datum: ...
    method __init__ (line 20907) | def __init__(
  class Y2Value (line 20921) | class Y2Value(ValueChannelMixin, core.PositionValueDef):
    method __init__ (line 20939) | def __init__(self, value, **kwds):
  class YError (line 20944) | class YError(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 21038) | def aggregate(self, _: NonArgAggregateOp_T, /) -> YError: ...
    method aggregate (line 21040) | def aggregate(
    method aggregate (line 21044) | def aggregate(
    method bandPosition (line 21048) | def bandPosition(self, _: float, /) -> YError: ...
    method bin (line 21050) | def bin(self, _: None, /) -> YError: ...
    method field (line 21052) | def field(self, _: str | RepeatRef, /) -> YError: ...
    method field (line 21054) | def field(
    method timeUnit (line 21060) | def timeUnit(
    method timeUnit (line 21066) | def timeUnit(
    method title (line 21076) | def title(self, _: str | Sequence[str] | None, /) -> YError: ...
    method __init__ (line 21078) | def __init__(
  class YErrorValue (line 21104) | class YErrorValue(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 21122) | def __init__(self, value, **kwds):
  class YError2 (line 21127) | class YError2(FieldChannelMixin, core.SecondaryFieldDef):
    method aggregate (line 21221) | def aggregate(self, _: NonArgAggregateOp_T, /) -> YError2: ...
    method aggregate (line 21223) | def aggregate(
    method aggregate (line 21227) | def aggregate(
    method bandPosition (line 21231) | def bandPosition(self, _: float, /) -> YError2: ...
    method bin (line 21233) | def bin(self, _: None, /) -> YError2: ...
    method field (line 21235) | def field(self, _: str | RepeatRef, /) -> YError2: ...
    method field (line 21237) | def field(
    method timeUnit (line 21243) | def timeUnit(
    method timeUnit (line 21249) | def timeUnit(
    method title (line 21259) | def title(self, _: str | Sequence[str] | None, /) -> YError2: ...
    method __init__ (line 21261) | def __init__(
  class YError2Value (line 21287) | class YError2Value(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 21305) | def __init__(self, value, **kwds):
  class YOffset (line 21310) | class YOffset(FieldChannelMixin, core.ScaleFieldDef):
    method aggregate (line 21518) | def aggregate(self, _: NonArgAggregateOp_T, /) -> YOffset: ...
    method aggregate (line 21520) | def aggregate(
    method aggregate (line 21524) | def aggregate(
    method bandPosition (line 21528) | def bandPosition(self, _: float, /) -> YOffset: ...
    method bin (line 21530) | def bin(self, _: bool | Bin | None, /) -> YOffset: ...
    method bin (line 21532) | def bin(
    method field (line 21547) | def field(self, _: str | RepeatRef, /) -> YOffset: ...
    method field (line 21549) | def field(
    method scale (line 21555) | def scale(self, _: Scale | None, /) -> YOffset: ...
    method scale (line 21557) | def scale(
    method sort (line 21607) | def sort(
    method sort (line 21618) | def sort(
    method sort (line 21626) | def sort(
    method timeUnit (line 21633) | def timeUnit(
    method timeUnit (line 21639) | def timeUnit(
    method title (line 21649) | def title(self, _: str | Sequence[str] | None, /) -> YOffset: ...
    method type (line 21651) | def type(self, _: StandardType_T, /) -> YOffset: ...
    method __init__ (line 21653) | def __init__(
  class YOffsetDatum (line 21694) | class YOffsetDatum(DatumChannelMixin, core.ScaleDatumDef):
    method bandPosition (line 21811) | def bandPosition(self, _: float, /) -> YOffsetDatum: ...
    method scale (line 21813) | def scale(self, _: Scale | None, /) -> YOffsetDatum: ...
    method scale (line 21815) | def scale(
    method title (line 21865) | def title(self, _: str | Sequence[str] | None, /) -> YOffsetDatum: ...
    method type (line 21867) | def type(self, _: Type_T, /) -> YOffsetDatum: ...
    method __init__ (line 21869) | def __init__(
  class YOffsetValue (line 21889) | class YOffsetValue(ValueChannelMixin, core.ValueDefnumber):
    method __init__ (line 21907) | def __init__(self, value, **kwds):
  class _EncodingMixin (line 21990) | class _EncodingMixin:
    method encode (line 21991) | def encode(
  class EncodeKwds (line 22308) | class EncodeKwds(TypedDict, total=False):

FILE: altair/vegalite/v6/schema/core.py
  function load_schema (line 488) | def load_schema() -> dict:
  class VegaLiteSchema (line 497) | class VegaLiteSchema(SchemaBase):
    method _default_wrapper_classes (line 501) | def _default_wrapper_classes(cls) -> Iterator[type[Any]]:
  class Root (line 505) | class Root(VegaLiteSchema):
    method __init__ (line 515) | def __init__(self, *args, **kwds):
  class Aggregate (line 519) | class Aggregate(VegaLiteSchema):
    method __init__ (line 524) | def __init__(self, *args, **kwds):
  class AggregateOp (line 528) | class AggregateOp(VegaLiteSchema):
    method __init__ (line 533) | def __init__(self, *args):
  class AggregatedFieldDef (line 537) | class AggregatedFieldDef(VegaLiteSchema):
    method __init__ (line 556) | def __init__(
  class Align (line 565) | class Align(VegaLiteSchema):
    method __init__ (line 570) | def __init__(self, *args):
  class AnyMark (line 574) | class AnyMark(VegaLiteSchema):
    method __init__ (line 579) | def __init__(self, *args, **kwds):
  class AnyMarkConfig (line 583) | class AnyMarkConfig(VegaLiteSchema):
    method __init__ (line 588) | def __init__(self, *args, **kwds):
  class AreaConfig (line 592) | class AreaConfig(AnyMarkConfig):
    method __init__ (line 996) | def __init__(
  class ArgmaxDef (line 1171) | class ArgmaxDef(Aggregate):
    method __init__ (line 1183) | def __init__(self, argmax: Optional[str | SchemaBase] = Undefined, **k...
  class ArgminDef (line 1187) | class ArgminDef(Aggregate):
    method __init__ (line 1199) | def __init__(self, argmin: Optional[str | SchemaBase] = Undefined, **k...
  class AutoSizeParams (line 1203) | class AutoSizeParams(VegaLiteSchema):
    method __init__ (line 1234) | def __init__(
  class AutosizeType (line 1244) | class AutosizeType(VegaLiteSchema):
    method __init__ (line 1249) | def __init__(self, *args):
  class Axis (line 1253) | class Axis(VegaLiteSchema):
    method __init__ (line 1633) | def __init__(
  class AxisConfig (line 1832) | class AxisConfig(VegaLiteSchema):
    method __init__ (line 2214) | def __init__(
  class AxisOrient (line 2415) | class AxisOrient(VegaLiteSchema):
    method __init__ (line 2420) | def __init__(self, *args):
  class AxisResolveMap (line 2424) | class AxisResolveMap(VegaLiteSchema):
    method __init__ (line 2438) | def __init__(
  class BBox (line 2447) | class BBox(VegaLiteSchema):
    method __init__ (line 2456) | def __init__(self, *args, **kwds):
  class BarConfig (line 2460) | class BarConfig(AnyMarkConfig):
    method __init__ (line 2858) | def __init__(
  class BaseTitleNoValueRefs (line 3039) | class BaseTitleNoValueRefs(VegaLiteSchema):
    method __init__ (line 3122) | def __init__(
  class BinExtent (line 3187) | class BinExtent(VegaLiteSchema):
    method __init__ (line 3192) | def __init__(self, *args, **kwds):
  class BinParams (line 3196) | class BinParams(VegaLiteSchema):
    method __init__ (line 3247) | def __init__(
  class Binding (line 3276) | class Binding(VegaLiteSchema):
    method __init__ (line 3281) | def __init__(self, *args, **kwds):
  class BindCheckbox (line 3285) | class BindCheckbox(Binding):
    method __init__ (line 3307) | def __init__(
  class BindDirect (line 3320) | class BindDirect(Binding):
    method __init__ (line 3343) | def __init__(
  class BindInput (line 3353) | class BindInput(Binding):
    method __init__ (line 3383) | def __init__(
  class BindRadioSelect (line 3404) | class BindRadioSelect(Binding):
    method __init__ (line 3431) | def __init__(
  class BindRange (line 3452) | class BindRange(Binding):
    method __init__ (line 3483) | def __init__(
  class BinnedTimeUnit (line 3506) | class BinnedTimeUnit(VegaLiteSchema):
    method __init__ (line 3511) | def __init__(self, *args):
  class Blend (line 3515) | class Blend(VegaLiteSchema):
    method __init__ (line 3520) | def __init__(self, *args):
  class BoxPlotConfig (line 3524) | class BoxPlotConfig(VegaLiteSchema):
    method __init__ (line 3557) | def __init__(
  class BrushConfig (line 3580) | class BrushConfig(VegaLiteSchema):
    method __init__ (line 3614) | def __init__(
  class Color (line 3639) | class Color(VegaLiteSchema):
    method __init__ (line 3644) | def __init__(self, *args, **kwds):
  class ColorDef (line 3648) | class ColorDef(VegaLiteSchema):
    method __init__ (line 3653) | def __init__(self, *args, **kwds):
  class ColorName (line 3657) | class ColorName(Color):
    method __init__ (line 3662) | def __init__(self, *args):
  class ColorScheme (line 3666) | class ColorScheme(VegaLiteSchema):
    method __init__ (line 3671) | def __init__(self, *args, **kwds):
  class Categorical (line 3675) | class Categorical(ColorScheme):
    method __init__ (line 3680) | def __init__(self, *args):
  class CompositeMark (line 3684) | class CompositeMark(AnyMark):
    method __init__ (line 3689) | def __init__(self, *args, **kwds):
  class BoxPlot (line 3693) | class BoxPlot(CompositeMark):
    method __init__ (line 3698) | def __init__(self, *args):
  class CompositeMarkDef (line 3702) | class CompositeMarkDef(AnyMark):
    method __init__ (line 3707) | def __init__(self, *args, **kwds):
  class BoxPlotDef (line 3711) | class BoxPlotDef(CompositeMarkDef):
    method __init__ (line 3801) | def __init__(
  class CompositionConfig (line 3836) | class CompositionConfig(VegaLiteSchema):
    method __init__ (line 3867) | def __init__(
  class ConditionalAxisColor (line 3876) | class ConditionalAxisColor(VegaLiteSchema):
    method __init__ (line 3881) | def __init__(self, *args, **kwds):
  class ConditionalAxisLabelAlign (line 3885) | class ConditionalAxisLabelAlign(VegaLiteSchema):
    method __init__ (line 3890) | def __init__(self, *args, **kwds):
  class ConditionalAxisLabelBaseline (line 3894) | class ConditionalAxisLabelBaseline(VegaLiteSchema):
    method __init__ (line 3899) | def __init__(self, *args, **kwds):
  class ConditionalAxisLabelFontStyle (line 3903) | class ConditionalAxisLabelFontStyle(VegaLiteSchema):
    method __init__ (line 3908) | def __init__(self, *args, **kwds):
  class ConditionalAxisLabelFontWeight (line 3912) | class ConditionalAxisLabelFontWeight(VegaLiteSchema):
    method __init__ (line 3917) | def __init__(self, *args, **kwds):
  class ConditionalAxisNumber (line 3921) | class ConditionalAxisNumber(VegaLiteSchema):
    method __init__ (line 3926) | def __init__(self, *args, **kwds):
  class ConditionalAxisNumberArray (line 3930) | class ConditionalAxisNumberArray(VegaLiteSchema):
    method __init__ (line 3935) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertyAlignnull (line 3939) | class ConditionalAxisPropertyAlignnull(VegaLiteSchema):
    method __init__ (line 3944) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertyColornull (line 3948) | class ConditionalAxisPropertyColornull(VegaLiteSchema):
    method __init__ (line 3953) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertyFontStylenull (line 3957) | class ConditionalAxisPropertyFontStylenull(VegaLiteSchema):
    method __init__ (line 3962) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertyFontWeightnull (line 3966) | class ConditionalAxisPropertyFontWeightnull(VegaLiteSchema):
    method __init__ (line 3971) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertyTextBaselinenull (line 3975) | class ConditionalAxisPropertyTextBaselinenull(VegaLiteSchema):
    method __init__ (line 3980) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertynumberArraynull (line 3984) | class ConditionalAxisPropertynumberArraynull(VegaLiteSchema):
    method __init__ (line 3989) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertynumbernull (line 3993) | class ConditionalAxisPropertynumbernull(VegaLiteSchema):
    method __init__ (line 3998) | def __init__(self, *args, **kwds):
  class ConditionalAxisPropertystringnull (line 4002) | class ConditionalAxisPropertystringnull(VegaLiteSchema):
    method __init__ (line 4007) | def __init__(self, *args, **kwds):
  class ConditionalAxisString (line 4011) | class ConditionalAxisString(VegaLiteSchema):
    method __init__ (line 4016) | def __init__(self, *args, **kwds):
  class ConditionalMarkPropFieldOrDatumDef (line 4020) | class ConditionalMarkPropFieldOrDatumDef(VegaLiteSchema):
    method __init__ (line 4025) | def __init__(self, *args, **kwds):
  class ConditionalMarkPropFieldOrDatumDefTypeForShape (line 4029) | class ConditionalMarkPropFieldOrDatumDefTypeForShape(VegaLiteSchema):
    method __init__ (line 4034) | def __init__(self, *args, **kwds):
  class ConditionalParameterMarkPropFieldOrDatumDef (line 4038) | class ConditionalParameterMarkPropFieldOrDatumDef(ConditionalMarkPropFie...
    method __init__ (line 4043) | def __init__(self, *args, **kwds):
  class ConditionalParameterMarkPropFieldOrDatumDefTypeForShape (line 4047) | class ConditionalParameterMarkPropFieldOrDatumDefTypeForShape(
    method __init__ (line 4056) | def __init__(self, *args, **kwds):
  class ConditionalPredicateMarkPropFieldOrDatumDef (line 4060) | class ConditionalPredicateMarkPropFieldOrDatumDef(ConditionalMarkPropFie...
    method __init__ (line 4065) | def __init__(self, *args, **kwds):
  class ConditionalPredicateMarkPropFieldOrDatumDefTypeForShape (line 4069) | class ConditionalPredicateMarkPropFieldOrDatumDefTypeForShape(
    method __init__ (line 4078) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefAlignnullExprRef (line 4082) | class ConditionalPredicateValueDefAlignnullExprRef(VegaLiteSchema):
    method __init__ (line 4089) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefColornullExprRef (line 4093) | class ConditionalPredicateValueDefColornullExprRef(VegaLiteSchema):
    method __init__ (line 4100) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefFontStylenullExprRef (line 4104) | class ConditionalPredicateValueDefFontStylenullExprRef(VegaLiteSchema):
    method __init__ (line 4111) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefFontWeightnullExprRef (line 4115) | class ConditionalPredicateValueDefFontWeightnullExprRef(VegaLiteSchema):
    method __init__ (line 4122) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefTextBaselinenullExprRef (line 4126) | class ConditionalPredicateValueDefTextBaselinenullExprRef(VegaLiteSchema):
    method __init__ (line 4133) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefnumberArraynullExprRef (line 4137) | class ConditionalPredicateValueDefnumberArraynullExprRef(VegaLiteSchema):
    method __init__ (line 4144) | def __init__(self, *args, **kwds):
  class ConditionalPredicateValueDefnumbernullExprRef (line 4148) | class ConditionalPredicateValueDefnumbernullExprRef(VegaLiteSchema):
    method __init__ (line 4155) | def __init__(self, *args, **kwds):
  class ConditionalStringFieldDef (line 4159) | class ConditionalStringFieldDef(VegaLiteSchema):
    method __init__ (line 4164) | def __init__(self, *args, **kwds):
  class ConditionalParameterStringFieldDef (line 4168) | class ConditionalParameterStringFieldDef(ConditionalStringFieldDef):
    method __init__ (line 4363) | def __init__(
  class ConditionalPredicateStringFieldDef (line 4396) | class ConditionalPredicateStringFieldDef(ConditionalStringFieldDef):
    method __init__ (line 4588) | def __init__(
  class ConditionalValueDefGradientstringnullExprRef (line 4619) | class ConditionalValueDefGradientstringnullExprRef(VegaLiteSchema):
    method __init__ (line 4626) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefGradientstringnullExprRef (line 4630) | class ConditionalParameterValueDefGradientstringnullExprRef(
    method __init__ (line 4653) | def __init__(
  class ConditionalPredicateValueDefGradientstringnullExprRef (line 4663) | class ConditionalPredicateValueDefGradientstringnullExprRef(
    method __init__ (line 4683) | def __init__(
  class ConditionalValueDefTextExprRef (line 4692) | class ConditionalValueDefTextExprRef(VegaLiteSchema):
    method __init__ (line 4697) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefTextExprRef (line 4701) | class ConditionalParameterValueDefTextExprRef(ConditionalValueDefTextExp...
    method __init__ (line 4720) | def __init__(
  class ConditionalPredicateValueDefTextExprRef (line 4730) | class ConditionalPredicateValueDefTextExprRef(ConditionalValueDefTextExp...
    method __init__ (line 4746) | def __init__(
  class ConditionalValueDefnumber (line 4755) | class ConditionalValueDefnumber(VegaLiteSchema):
    method __init__ (line 4760) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefnumber (line 4764) | class ConditionalParameterValueDefnumber(ConditionalValueDefnumber):
    method __init__ (line 4783) | def __init__(
  class ConditionalPredicateValueDefnumber (line 4793) | class ConditionalPredicateValueDefnumber(ConditionalValueDefnumber):
    method __init__ (line 4809) | def __init__(
  class ConditionalValueDefnumberArrayExprRef (line 4818) | class ConditionalValueDefnumberArrayExprRef(VegaLiteSchema):
    method __init__ (line 4823) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefnumberArrayExprRef (line 4827) | class ConditionalParameterValueDefnumberArrayExprRef(
    method __init__ (line 4850) | def __init__(
  class ConditionalPredicateValueDefnumberArrayExprRef (line 4860) | class ConditionalPredicateValueDefnumberArrayExprRef(
    method __init__ (line 4880) | def __init__(
  class ConditionalValueDefnumberExprRef (line 4889) | class ConditionalValueDefnumberExprRef(VegaLiteSchema):
    method __init__ (line 4894) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefnumberExprRef (line 4898) | class ConditionalParameterValueDefnumberExprRef(ConditionalValueDefnumbe...
    method __init__ (line 4917) | def __init__(
  class ConditionalPredicateValueDefnumberExprRef (line 4927) | class ConditionalPredicateValueDefnumberExprRef(ConditionalValueDefnumbe...
    method __init__ (line 4943) | def __init__(
  class ConditionalValueDefstringExprRef (line 4952) | class ConditionalValueDefstringExprRef(VegaLiteSchema):
    method __init__ (line 4957) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefstringExprRef (line 4961) | class ConditionalParameterValueDefstringExprRef(ConditionalValueDefstrin...
    method __init__ (line 4980) | def __init__(
  class ConditionalPredicateValueDefstringExprRef (line 4990) | class ConditionalPredicateValueDefstringExprRef(ConditionalValueDefstrin...
    method __init__ (line 5006) | def __init__(
  class ConditionalValueDefstringnullExprRef (line 5015) | class ConditionalValueDefstringnullExprRef(VegaLiteSchema):
    method __init__ (line 5020) | def __init__(self, *args, **kwds):
  class ConditionalParameterValueDefstringnullExprRef (line 5024) | class ConditionalParameterValueDefstringnullExprRef(
    method __init__ (line 5047) | def __init__(
  class ConditionalPredicateValueDefstringnullExprRef (line 5057) | class ConditionalPredicateValueDefstringnullExprRef(
    method __init__ (line 5077) | def __init__(
  class Config (line 5086) | class Config(VegaLiteSchema):
    method __init__ (line 5363) | def __init__(
  class Cursor (line 5518) | class Cursor(VegaLiteSchema):
    method __init__ (line 5523) | def __init__(self, *args):
  class Cyclical (line 5527) | class Cyclical(ColorScheme):
    method __init__ (line 5532) | def __init__(self, *args):
  class Data (line 5536) | class Data(VegaLiteSchema):
    method __init__ (line 5541) | def __init__(self, *args, **kwds):
  class DataFormat (line 5545) | class DataFormat(VegaLiteSchema):
    method __init__ (line 5550) | def __init__(self, *args, **kwds):
  class CsvDataFormat (line 5554) | class CsvDataFormat(DataFormat):
    method __init__ (line 5585) | def __init__(
  class DataSource (line 5594) | class DataSource(Data):
    method __init__ (line 5599) | def __init__(self, *args, **kwds):
  class Datasets (line 5603) | class Datasets(VegaLiteSchema):
    method __init__ (line 5608) | def __init__(self, **kwds):
  class Day (line 5612) | class Day(VegaLiteSchema):
    method __init__ (line 5617) | def __init__(self, *args):
  class DictInlineDataset (line 5621) | class DictInlineDataset(VegaLiteSchema):
    method __init__ (line 5626) | def __init__(self, **kwds):
  class DictSelectionInit (line 5630) | class DictSelectionInit(VegaLiteSchema):
    method __init__ (line 5635) | def __init__(self, **kwds):
  class DictSelectionInitInterval (line 5639) | class DictSelectionInitInterval(VegaLiteSchema):
    method __init__ (line 5644) | def __init__(self, **kwds):
  class Diverging (line 5648) | class Diverging(ColorScheme):
    method __init__ (line 5653) | def __init__(self, *args):
  class DomainUnionWith (line 5657) | class DomainUnionWith(VegaLiteSchema):
    method __init__ (line 5670) | def __init__(
  class DsvDataFormat (line 5680) | class DsvDataFormat(DataFormat):
    method __init__ (line 5715) | def __init__(
  class Element (line 5725) | class Element(VegaLiteSchema):
    method __init__ (line 5730) | def __init__(self, *args):
  class Encoding (line 5734) | class Encoding(VegaLiteSchema):
    method __init__ (line 5930) | def __init__(
  class ErrorBand (line 6017) | class ErrorBand(CompositeMark):
    method __init__ (line 6022) | def __init__(self, *args):
  class ErrorBandConfig (line 6026) | class ErrorBandConfig(VegaLiteSchema):
    method __init__ (line 6075) | def __init__(
  class ErrorBandDef (line 6094) | class ErrorBandDef(CompositeMarkDef):
    method __init__ (line 6166) | def __init__(
  class ErrorBar (line 6195) | class ErrorBar(CompositeMark):
    method __init__ (line 6200) | def __init__(self, *args):
  class ErrorBarConfig (line 6204) | class ErrorBarConfig(VegaLiteSchema):
    method __init__ (line 6233) | def __init__(
  class ErrorBarDef (line 6252) | class ErrorBarDef(CompositeMarkDef):
    method __init__ (line 6304) | def __init__(
  class ErrorBarExtent (line 6333) | class ErrorBarExtent(VegaLiteSchema):
    method __init__ (line 6338) | def __init__(self, *args):
  class Expr (line 6342) | class Expr(VegaLiteSchema):
    method __init__ (line 6347) | def __init__(self, *args):
  class ExprRef (line 6351) | class ExprRef(VegaLiteSchema):
    method __init__ (line 6363) | def __init__(self, expr: Optional[str] = Undefined, **kwds):
  class FacetEncodingFieldDef (line 6367) | class FacetEncodingFieldDef(VegaLiteSchema):
    method __init__ (line 6610) | def __init__(
  class FacetFieldDef (line 6660) | class FacetFieldDef(VegaLiteSchema):
    method __init__ (line 6841) | def __init__(
  class FacetMapping (line 6879) | class FacetMapping(VegaLiteSchema):
    method __init__ (line 6893) | def __init__(
  class FacetedEncoding (line 6902) | class FacetedEncoding(VegaLiteSchema):
    method __init__ (line 7106) | def __init__(
  class Feature (line 7199) | class Feature(VegaLiteSchema):
    method __init__ (line 7228) | def __init__(
  class FeatureCollection (line 7247) | class FeatureCollection(VegaLiteSchema):
    method __init__ (line 7270) | def __init__(
  class FeatureGeometryGeoJsonProperties (line 7280) | class FeatureGeometryGeoJsonProperties(VegaLiteSchema):
    method __init__ (line 7309) | def __init__(
  class Field (line 7328) | class Field(VegaLiteSchema):
    method __init__ (line 7333) | def __init__(self, *args, **kwds):
  class FieldDefWithoutScale (line 7337) | class FieldDefWithoutScale(VegaLiteSchema):
    method __init__ (line 7494) | def __init__(
  class FieldName (line 7521) | class FieldName(Field):
    method __init__ (line 7526) | def __init__(self, *args):
  class FieldOrDatumDefWithConditionStringFieldDefstring (line 7530) | class FieldOrDatumDefWithConditionStringFieldDefstring(VegaLiteSchema):
    method __init__ (line 7729) | def __init__(
  class FieldRange (line 7760) | class FieldRange(VegaLiteSchema):
    method __init__ (line 7772) | def __init__(self, field: Optional[str] = Undefined, **kwds):
  class Fit (line 7776) | class Fit(VegaLiteSchema):
    method __init__ (line 7781) | def __init__(self, *args, **kwds):
  class FontStyle (line 7785) | class FontStyle(VegaLiteSchema):
    method __init__ (line 7790) | def __init__(self, *args):
  class FontWeight (line 7794) | class FontWeight(VegaLiteSchema):
    method __init__ (line 7799) | def __init__(self, *args):
  class Format (line 7803) | class Format(VegaLiteSchema):
    method __init__ (line 7808) | def __init__(self, *args, **kwds):
  class Dict (line 7812) | class Dict(Format):
    method __init__ (line 7817) | def __init__(self, **kwds):
  class FormatConfig (line 7821) | class FormatConfig(VegaLiteSchema):
    method __init__ (line 7884) | def __init__(
  class Generator (line 7905) | class Generator(Data):
    method __init__ (line 7910) | def __init__(self, *args, **kwds):
  class GenericUnitSpecEncodingAnyMark (line 7914) | class GenericUnitSpecEncodingAnyMark(VegaLiteSchema):
    method __init__ (line 7951) | def __init__(
  class GeoJsonFeature (line 7978) | class GeoJsonFeature(Fit):
    method __init__ (line 8007) | def __init__(
  class GeoJsonFeatureCollection (line 8026) | class GeoJsonFeatureCollection(Fit):
    method __init__ (line 8049) | def __init__(
  class GeoJsonProperties (line 8059) | class GeoJsonProperties(VegaLiteSchema):
    method __init__ (line 8064) | def __init__(self, *args, **kwds):
  class Geometry (line 8068) | class Geometry(VegaLiteSchema):
    method __init__ (line 8077) | def __init__(self, *args, **kwds):
  class GeometryCollection (line 8081) | class GeometryCollection(Geometry):
    method __init__ (line 8104) | def __init__(
  class Gradient (line 8114) | class Gradient(VegaLiteSchema):
    method __init__ (line 8119) | def __init__(self, *args, **kwds):
  class GradientStop (line 8123) | class GradientStop(VegaLiteSchema):
    method __init__ (line 8137) | def __init__(
  class GraticuleGenerator (line 8146) | class GraticuleGenerator(Generator):
    method __init__ (line 8160) | def __init__(
  class GraticuleParams (line 8169) | class GraticuleParams(VegaLiteSchema):
    method __init__ (line 8199) | def __init__(
  class Header (line 8228) | class Header(VegaLiteSchema):
    method __init__ (line 8396) | def __init__(
  class HeaderConfig (line 8481) | class HeaderConfig(VegaLiteSchema):
    method __init__ (line 8629) | def __init__(
  class HexColor (line 8714) | class HexColor(Color):
    method __init__ (line 8719) | def __init__(self, *args):
  class ImputeMethod (line 8723) | class ImputeMethod(VegaLiteSchema):
    method __init__ (line 8728) | def __init__(self, *args):
  class ImputeParams (line 8732) | class ImputeParams(VegaLiteSchema):
    method __init__ (line 8770) | def __init__(
  class ImputeSequence (line 8783) | class ImputeSequence(VegaLiteSchema):
    method __init__ (line 8800) | def __init__(
  class InlineData (line 8810) | class InlineData(DataSource):
    method __init__ (line 8828) | def __init__(
  class InlineDataset (line 8846) | class InlineDataset(VegaLiteSchema):
    method __init__ (line 8851) | def __init__(self, *args, **kwds):
  class Interpolate (line 8855) | class Interpolate(VegaLiteSchema):
    method __init__ (line 8860) | def __init__(self, *args):
  class IntervalSelectionConfig (line 8864) | class IntervalSelectionConfig(VegaLiteSchema):
    method __init__ (line 8965) | def __init__(
  class IntervalSelectionConfigWithoutType (line 8992) | class IntervalSelectionConfigWithoutType(VegaLiteSchema):
    method __init__ (line 9086) | def __init__(
  class JoinAggregateFieldDef (line 9111) | class JoinAggregateFieldDef(VegaLiteSchema):
    method __init__ (line 9130) | def __init__(
  class JsonDataFormat (line 9139) | class JsonDataFormat(DataFormat):
    method __init__ (line 9175) | def __init__(
  class LabelOverlap (line 9185) | class LabelOverlap(VegaLiteSchema):
    method __init__ (line 9190) | def __init__(self, *args, **kwds):
  class LatLongDef (line 9194) | class LatLongDef(VegaLiteSchema):
    method __init__ (line 9199) | def __init__(self, *args, **kwds):
  class LatLongFieldDef (line 9203) | class LatLongFieldDef(LatLongDef):
    method __init__ (line 9358) | def __init__(
  class LayerRepeatMapping (line 9385) | class LayerRepeatMapping(VegaLiteSchema):
    method __init__ (line 9401) | def __init__(
  class LayoutAlign (line 9411) | class LayoutAlign(VegaLiteSchema):
    method __init__ (line 9416) | def __init__(self, *args):
  class Legend (line 9420) | class Legend(VegaLiteSchema):
    method __init__ (line 9722) | def __init__(
  class LegendBinding (line 9899) | class LegendBinding(VegaLiteSchema):
    method __init__ (line 9904) | def __init__(self, *args, **kwds):
  class LegendConfig (line 9908) | class LegendConfig(VegaLiteSchema):
    method __init__ (line 10188) | def __init__(
  class LegendOrient (line 10385) | class LegendOrient(VegaLiteSchema):
    method __init__ (line 10390) | def __init__(self, *args):
  class LegendResolveMap (line 10394) | class LegendResolveMap(VegaLiteSchema):
    method __init__ (line 10428) | def __init__(
  class LegendStreamBinding (line 10461) | class LegendStreamBinding(LegendBinding):
    method __init__ (line 10473) | def __init__(self, legend: Optional[str | SchemaBase | Map] = Undefine...
  class LineConfig (line 10477) | class LineConfig(AnyMarkConfig):
    method __init__ (line 10871) | def __init__(
  class LineString (line 11044) | class LineString(Geometry):
    method __init__ (line 11067) | def __init__(
  class LinearGradient (line 11077) | class LinearGradient(Gradient):
    method __init__ (line 11109) | def __init__(
  class Locale (line 11125) | class Locale(VegaLiteSchema):
    method __init__ (line 11139) | def __init__(
  class LookupData (line 11148) | class LookupData(VegaLiteSchema):
    method __init__ (line 11165) | def __init__(
  class LookupSelection (line 11175) | class LookupSelection(VegaLiteSchema):
    method __init__ (line 11192) | def __init__(
  class Mark (line 11202) | class Mark(AnyMark):
    method __init__ (line 11211) | def __init__(self, *args):
  class MarkConfig (line 11215) | class MarkConfig(AnyMarkConfig):
    method __init__ (line 11595) | def __init__(
  class MarkDef (line 11766) | class MarkDef(AnyMark):
    method __init__ (line 12238) | def __init__(
  class MarkInvalidDataMode (line 12445) | class MarkInvalidDataMode(VegaLiteSchema):
    method __init__ (line 12450) | def __init__(self, *args):
  class MarkPropDefGradientstringnull (line 12454) | class MarkPropDefGradientstringnull(VegaLiteSchema):
    method __init__ (line 12459) | def __init__(self, *args, **kwds):
  class FieldOrDatumDefWithConditionDatumDefGradientstringnull (line 12463) | class FieldOrDatumDefWithConditionDatumDefGradientstringnull(
    method __init__ (line 12576) | def __init__(
  class FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull (line 12597) | class FieldOrDatumDefWithConditionMarkPropFieldDefGradientstringnull(
    method __init__ (line 12823) | def __init__(
  class MarkPropDefnumber (line 12867) | class MarkPropDefnumber(VegaLiteSchema):
    method __init__ (line 12872) | def __init__(self, *args, **kwds):
  class MarkPropDefnumberArray (line 12876) | class MarkPropDefnumberArray(VegaLiteSchema):
    method __init__ (line 12881) | def __init__(self, *args, **kwds):
  class MarkPropDefstringnullTypeForShape (line 12885) | class MarkPropDefstringnullTypeForShape(VegaLiteSchema):
    method __init__ (line 12890) | def __init__(self, *args, **kwds):
  class MarkType (line 12894) | class MarkType(VegaLiteSchema):
    method __init__ (line 12899) | def __init__(self, *args):
  class Month (line 12903) | class Month(VegaLiteSchema):
    method __init__ (line 12908) | def __init__(self, *args):
  class MultiLineString (line 12912) | class MultiLineString(Geometry):
    method __init__ (line 12935) | def __init__(
  class MultiPoint (line 12947) | class MultiPoint(Geometry):
    method __init__ (line 12970) | def __init__(
  class MultiPolygon (line 12980) | class MultiPolygon(Geometry):
    method __init__ (line 13003) | def __init__(
  class NamedData (line 13015) | class NamedData(DataSource):
    method __init__ (line 13034) | def __init__(
  class NonArgAggregateOp (line 13043) | class NonArgAggregateOp(Aggregate):
    method __init__ (line 13048) | def __init__(self, *args):
  class NonNormalizedSpec (line 13052) | class NonNormalizedSpec(VegaLiteSchema):
    method __init__ (line 13061) | def __init__(self, *args, **kwds):
  class NumberLocale (line 13065) | class NumberLocale(VegaLiteSchema):
    method __init__ (line 13093) | def __init__(
  class NumericArrayMarkPropDef (line 13118) | class NumericArrayMarkPropDef(VegaLiteSchema):
    method __init__ (line 13123) | def __init__(self, *args, **kwds):
  class FieldOrDatumDefWithConditionDatumDefnumberArray (line 13127) | class FieldOrDatumDefWithConditionDatumDefnumberArray(
    method __init__ (line 13238) | def __init__(
  class FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray (line 13259) | class FieldOrDatumDefWithConditionMarkPropFieldDefnumberArray(
    method __init__ (line 13485) | def __init__(
  class NumericMarkPropDef (line 13529) | class NumericMarkPropDef(VegaLiteSchema):
    method __init__ (line 13534) | def __init__(self, *args, **kwds):
  class FieldOrDatumDefWithConditionDatumDefnumber (line 13538) | class FieldOrDatumDefWithConditionDatumDefnumber(MarkPropDefnumber, Nume...
    method __init__ (line 13647) | def __init__(
  class FieldOrDatumDefWithConditionMarkPropFieldDefnumber (line 13668) | class FieldOrDatumDefWithConditionMarkPropFieldDefnumber(
    method __init__ (line 13894) | def __init__(
  class OffsetDef (line 13938) | class OffsetDef(VegaLiteSchema):
    method __init__ (line 13943) | def __init__(self, *args, **kwds):
  class OrderFieldDef (line 13947) | class OrderFieldDef(VegaLiteSchema):
    method __init__ (line 14104) | def __init__(
  class OrderOnlyDef (line 14133) | class OrderOnlyDef(VegaLiteSchema):
    method __init__ (line 14145) | def __init__(self, sort: Optional[SchemaBase | SortOrder_T] = Undefine...
  class OrderValueDef (line 14149) | class OrderValueDef(VegaLiteSchema):
    method __init__ (line 14170) | def __init__(
  class Orient (line 14179) | class Orient(VegaLiteSchema):
    method __init__ (line 14184) | def __init__(self, *args):
  class Orientation (line 14188) | class Orientation(VegaLiteSchema):
    method __init__ (line 14193) | def __init__(self, *args):
  class OverlayMarkDef (line 14197) | class OverlayMarkDef(VegaLiteSchema):
    method __init__ (line 14609) | def __init__(
  class Padding (line 14800) | class Padding(VegaLiteSchema):
    method __init__ (line 14805) | def __init__(self, *args, **kwds):
  class ParameterExtent (line 14809) | class ParameterExtent(BinExtent):
    method __init__ (line 14814) | def __init__(self, *args, **kwds):
  class ParameterName (line 14818) | class ParameterName(VegaLiteSchema):
    method __init__ (line 14823) | def __init__(self, *args):
  class Parse (line 14827) | class Parse(VegaLiteSchema):
    method __init__ (line 14832) | def __init__(self, **kwds):
  class ParseValue (line 14836) | class ParseValue(VegaLiteSchema):
    method __init__ (line 14841) | def __init__(self, *args):
  class Point (line 14845) | class Point(Geometry):
    method __init__ (line 14888) | def __init__(
  class PointSelectionConfig (line 14898) | class PointSelectionConfig(VegaLiteSchema):
    method __init__ (line 14998) | def __init__(
  class PointSelectionConfigWithoutType (line 15023) | class PointSelectionConfigWithoutType(VegaLiteSchema):
    method __init__ (line 15116) | def __init__(
  class PolarDef (line 15139) | class PolarDef(VegaLiteSchema):
    method __init__ (line 15144) | def __init__(self, *args, **kwds):
  class Polygon (line 15148) | class Polygon(Geometry):
    method __init__ (line 15171) | def __init__(
  class Position (line 15183) | class Position(VegaLiteSchema):
    method __init__ (line 15209) | def __init__(self, *args):
  class Position2Def (line 15213) | class Position2Def(VegaLiteSchema):
    method __init__ (line 15218) | def __init__(self, *args, **kwds):
  class DatumDef (line 15222) | class DatumDef(LatLongDef, Position2Def):
    method __init__ (line 15324) | def __init__(
  class PositionDatumDefBase (line 15339) | class PositionDatumDefBase(PolarDef):
    method __init__ (line 15484) | def __init__(
  class PositionDef (line 15507) | class PositionDef(VegaLiteSchema):
    method __init__ (line 15512) | def __init__(self, *args, **kwds):
  class PositionDatumDef (line 15516) | class PositionDatumDef(PositionDef):
    method __init__ (line 15678) | def __init__(
  class PositionFieldDef (line 15705) | class PositionFieldDef(PositionDef):
    method __init__ (line 15958) | def __init__(
  class PositionFieldDefBase (line 16004) | class PositionFieldDefBase(PolarDef):
    method __init__ (line 16240) | def __init__(
  class PositionValueDef (line 16282) | class PositionValueDef(PolarDef, Position2Def, PositionDef):
    method __init__ (line 16299) | def __init__(
  class PredicateComposition (line 16309) | class PredicateComposition(VegaLiteSchema):
    method __init__ (line 16314) | def __init__(self, *args, **kwds):
    method __invert__ (line 16317) | def __invert__(self) -> PredicateComposition:
    method __and__ (line 16320) | def __and__(self, other: SchemaBase) -> PredicateComposition:
    method __or__ (line 16323) | def __or__(self, other: SchemaBase) -> PredicateComposition:
  class LogicalAndPredicate (line 16327) | class LogicalAndPredicate(PredicateComposition):
    method __init__ (line 16339) | def __init__(self, **kwds):
  class LogicalNotPredicate (line 16343) | class LogicalNotPredicate(PredicateComposition):
    method __init__ (line 16355) | def __init__(self, **kwds):
  class LogicalOrPredicate (line 16359) | class LogicalOrPredicate(PredicateComposition):
    method __init__ (line 16371) | def __init__(self, **kwds):
  class Predicate (line 16375) | class Predicate(PredicateComposition):
    method __init__ (line 16380) | def __init__(self, *args, **kwds):
  class FieldEqualPredicate (line 16384) | class FieldEqualPredicate(Predicate):
    method __init__ (line 16400) | def __init__(
  class FieldGTEPredicate (line 16414) | class FieldGTEPredicate(Predicate):
    method __init__ (line 16430) | def __init__(
  class FieldGTPredicate (line 16444) | class FieldGTPredicate(Predicate):
    method __init__ (line 16460) | def __init__(
  class FieldLTEPredicate (line 16472) | class FieldLTEPredicate(Predicate):
    method __init__ (line 16488) | def __init__(
  class FieldLTPredicate (line 16502) | class FieldLTPredicate(Predicate):
    method __init__ (line 16518) | def __init__(
  class FieldOneOfPredicate (line 16530) | class FieldOneOfPredicate(Predicate):
    method __init__ (line 16547) | def __init__(
  class FieldRangePredicate (line 16564) | class FieldRangePredicate(Predicate):
    method __init__ (line 16581) | def __init__(
  class FieldValidPredicate (line 16598) | class FieldValidPredicate(Predicate):
    method __init__ (line 16616) | def __init__(
  class ParameterPredicate (line 16628) | class ParameterPredicate(Predicate):
    method __init__ (line 16643) | def __init__(
  class Projection (line 16652) | class Projection(VegaLiteSchema):
    method __init__ (line 16762) | def __init__(
  class ProjectionConfig (line 16829) | class ProjectionConfig(VegaLiteSchema):
    method __init__ (line 16939) | def __init__(
  class ProjectionType (line 17006) | class ProjectionType(VegaLiteSchema):
    method __init__ (line 17011) | def __init__(self, *args):
  class RadialGradient (line 17015) | class RadialGradient(Gradient):
    method __init__ (line 17061) | def __init__(
  class RangeConfig (line 17088) | class RangeConfig(VegaLiteSchema):
    method __init__ (line 17116) | def __init__(
  class RangeRawArray (line 17167) | class RangeRawArray(VegaLiteSchema):
    method __init__ (line 17172) | def __init__(self, *args):
  class RangeScheme (line 17176) | class RangeScheme(VegaLiteSchema):
    method __init__ (line 17181) | def __init__(self, *args, **kwds):
  class RangeEnum (line 17185) | class RangeEnum(RangeScheme):
    method __init__ (line 17190) | def __init__(self, *args):
  class RangeRaw (line 17194) | class RangeRaw(RangeScheme):
    method __init__ (line 17199) | def __init__(self, *args):
  class RectConfig (line 17203) | class RectConfig(AnyMarkConfig):
    method __init__ (line 17597) | def __init__(
  class RelativeBandSize (line 17776) | class RelativeBandSize(VegaLiteSchema):
    method __init__ (line 17789) | def __init__(self, band: Optional[float] = Undefined, **kwds):
  class RepeatMapping (line 17793) | class RepeatMapping(VegaLiteSchema):
    method __init__ (line 17807) | def __init__(
  class RepeatRef (line 17816) | class RepeatRef(Field):
    method __init__ (line 17830) | def __init__(
  class Resolve (line 17838) | class Resolve(VegaLiteSchema):
    method __init__ (line 17858) | def __init__(
  class ResolveMode (line 17868) | class ResolveMode(VegaLiteSchema):
    method __init__ (line 17873) | def __init__(self, *args):
  class RowColLayoutAlign (line 17877) | class RowColLayoutAlign(VegaLiteSchema):
    method __init__ (line 17891) | def __init__(
  class RowColboolean (line 17900) | class RowColboolean(VegaLiteSchema):
    method __init__ (line 17914) | def __init__(
  class RowColnumber (line 17923) | class RowColnumber(VegaLiteSchema):
    method __init__ (line 17937) | def __init__(
  class RowColumnEncodingFieldDef (line 17946) | class RowColumnEncodingFieldDef(VegaLiteSchema):
    method __init__ (line 18153) | def __init__(
  class Scale (line 18199) | class Scale(VegaLiteSchema):
    method __init__ (line 18461) | def __init__(
  class ScaleBins (line 18539) | class ScaleBins(VegaLiteSchema):
    method __init__ (line 18544) | def __init__(self, *args, **kwds):
  class ScaleBinParams (line 18548) | class ScaleBinParams(ScaleBins):
    method __init__ (line 18568) | def __init__(
  class ScaleConfig (line 18578) | class ScaleConfig(VegaLiteSchema):
    method __init__ (line 18742) | def __init__(
  class ScaleDatumDef (line 18825) | class ScaleDatumDef(OffsetDef):
    method __init__ (line 18940) | def __init__(
  class ScaleFieldDef (line 18961) | class ScaleFieldDef(OffsetDef):
    method __init__ (line 19167) | def __init__(
  class ScaleInterpolateEnum (line 19207) | class ScaleInterpolateEnum(VegaLiteSchema):
    method __init__ (line 19212) | def __init__(self, *args):
  class ScaleInterpolateParams (line 19216) | class ScaleInterpolateParams(VegaLiteSchema):
    method __init__ (line 19230) | def __init__
Condensed preview — 535 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,801K chars).
[
  {
    "path": ".gitattributes",
    "chars": 19,
    "preview": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yml",
    "chars": 1438,
    "preview": "name: Bug report\ndescription: Report something that is broken\nlabels: [\"bug\", \"needs-triage\"]\nbody:\n  - type: markdown\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 459,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Question\n    url: https://stackoverflow.com/tags/altair\n    about: "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yml",
    "chars": 1065,
    "preview": "name: Feature request\ndescription: Suggest an improvement\nlabels: [\"enhancement\"]\nbody:\n  - type: markdown\n    attribute"
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 226,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"monthly\"\n "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1127,
    "preview": "<!-- Click \"Preview\" to read this message; then delete it. -->\n\n## Thanks for contributing to Altair! 🎉\n\nPlease follow t"
  },
  {
    "path": ".github/release.yml",
    "chars": 437,
    "preview": "changelog:\n  categories:\n    - title: Breaking\n      labels:\n        - breaking\n    - title: Deprecation\n      labels:\n "
  },
  {
    "path": ".github/workflows/build-free-threaded.yml",
    "chars": 1649,
    "preview": "name: build-free-threaded\n\non:\n  workflow_dispatch:  # Manual trigger only; no automatic CI runs\n\nenv:\n  UV_SYSTEM_PYTHO"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 4141,
    "preview": "name: build\n\non: [push, pull_request]\n\nenv:\n  UV_SYSTEM_PYTHON: 1\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strateg"
  },
  {
    "path": ".github/workflows/check-pr.yml",
    "chars": 340,
    "preview": "name: \"Lint PR\"\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n\npermissions:\n "
  },
  {
    "path": ".github/workflows/docbuild.yml",
    "chars": 757,
    "preview": "name: docbuild\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/check"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 821,
    "preview": "name: lint\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    name: ruff-mypy\n    steps:\n    - nam"
  },
  {
    "path": ".github/workflows/weekly.yml",
    "chars": 12924,
    "preview": "---\nname: Weekly Build and Publish\n'on':\n  schedule:\n    - cron: '0 3 * * 1'  # Weekly on Mondays at 3am UTC\n  workflow_"
  },
  {
    "path": ".gitignore",
    "chars": 923,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 176,
    "preview": "# Contributor Covenant Code of Conduct\n\nAs a project of the Vega Organization, we use the [Vega Code of Conduct](https:/"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 10299,
    "preview": "# Feedback and Contribution\n\nWe welcome any input, feedback, bug reports, and contributions via [Altair's\nGitHub Reposit"
  },
  {
    "path": "LICENSE",
    "chars": 1497,
    "preview": "Copyright (c) 2015-2025, Vega-Altair Developers\nAll rights reserved.\n\nRedistribution and use in source and binary forms,"
  },
  {
    "path": "NOTES_FOR_MAINTAINERS.md",
    "chars": 4861,
    "preview": "# Notes for Maintainers of Altair\n\n## Auto-generating the Python code\n\nThe core Python API for Altair can be found in th"
  },
  {
    "path": "README.md",
    "chars": 6502,
    "preview": "# Vega-Altair <a href=\"https://altair-viz.github.io/\"><img align=\"right\" src=\"https://altair-viz.github.io/_static/altai"
  },
  {
    "path": "RELEASING.md",
    "chars": 2585,
    "preview": "1. Check all [Vega project](https://github.com/orgs/vega/repositories?type=source) versions are up-to-date. See [NOTES_F"
  },
  {
    "path": "altair/__init__.py",
    "chars": 17715,
    "preview": "# ruff: noqa\n__version__ = \"6.1.0dev\"\n\n# The content of __all__ is automatically written by\n# tools/update_init_file.py."
  },
  {
    "path": "altair/_magics.py",
    "chars": 3174,
    "preview": "\"\"\"Magic functions for rendering vega-lite specifications.\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nimport wa"
  },
  {
    "path": "altair/datasets/__init__.py",
    "chars": 4490,
    "preview": "\"\"\"\nLoad example datasets *remotely* from `vega-datasets`_.\n\nProvides **70+** datasets, used throughout our `Example Gal"
  },
  {
    "path": "altair/datasets/_cache.py",
    "chars": 14298,
    "preview": "from __future__ import annotations\n\nimport os\nimport sys\nfrom collections import defaultdict\nfrom importlib.util import "
  },
  {
    "path": "altair/datasets/_constraints.py",
    "chars": 3243,
    "preview": "\"\"\"Set-like guards for matching metadata to an implementation.\"\"\"\n\nfrom __future__ import annotations\n\nfrom collections."
  },
  {
    "path": "altair/datasets/_data.py",
    "chars": 10474,
    "preview": "\"\"\"\nData object interface for Altair datasets.\n\nThis module provides a `data` object that allows accessing datasets as a"
  },
  {
    "path": "altair/datasets/_exceptions.py",
    "chars": 3823,
    "preview": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from collections.abc import "
  },
  {
    "path": "altair/datasets/_loader.py",
    "chars": 10236,
    "preview": "from __future__ import annotations\n\nimport typing as t\nfrom typing import Generic, final, overload\n\nfrom altair.datasets"
  },
  {
    "path": "altair/datasets/_reader.py",
    "chars": 19356,
    "preview": "\"\"\"\nBackend for ``alt.datasets.Loader``.\n\nNotes\n-----\nExtending would be more ergonomic if `read`, `scan`, `_constraints"
  },
  {
    "path": "altair/datasets/_readimpl.py",
    "chars": 15597,
    "preview": "\"\"\"Individual read functions and siuations they support.\"\"\"\n\nfrom __future__ import annotations\n\nimport sys\nfrom enum im"
  },
  {
    "path": "altair/datasets/_typing.py",
    "chars": 6509,
    "preview": "# The contents of this file are automatically written by\n# tools/datasets.__init__.py. Do not modify directly.\n\nfrom __f"
  },
  {
    "path": "altair/expr/__init__.py",
    "chars": 81699,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\n\"\""
  },
  {
    "path": "altair/expr/consts.py",
    "chars": 602,
    "preview": "from __future__ import annotations\n\nCONST_LISTING = {\n    \"NaN\": \"not a number (same as JavaScript literal NaN)\",\n    \"L"
  },
  {
    "path": "altair/expr/core.py",
    "chars": 8539,
    "preview": "from __future__ import annotations\n\nimport datetime as dt\nimport sys\nfrom typing import TYPE_CHECKING, Any, Literal, Uni"
  },
  {
    "path": "altair/expr/funcs.py",
    "chars": 33826,
    "preview": "from __future__ import annotations\n\nFUNCTION_LISTING = {\n    \"isArray\": r\"Returns true if _value_ is an array, false oth"
  },
  {
    "path": "altair/jupyter/__init__.py",
    "chars": 876,
    "preview": "try:\n    import anywidget  # noqa: F401\nexcept ImportError:\n    # When anywidget isn't available, create stand-in Jupyte"
  },
  {
    "path": "altair/jupyter/js/README.md",
    "chars": 172,
    "preview": "# JupyterChart\nThis directory contains the JavaScript portion of the Altair `JupyterChart`. The `JupyterChart` is based "
  },
  {
    "path": "altair/jupyter/js/index.js",
    "chars": 8053,
    "preview": "import vegaEmbed from \"https://esm.sh/vega-embed@v7?deps=vega@6&deps=vega-lite@6.1.0\";\nimport lodashDebounce from \"https"
  },
  {
    "path": "altair/jupyter/jupyter_chart.py",
    "chars": 15231,
    "preview": "from __future__ import annotations\n\nimport json\nimport pathlib\nfrom typing import Any\n\nimport anywidget\nimport traitlets"
  },
  {
    "path": "altair/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "altair/theme.py",
    "chars": 8062,
    "preview": "\"\"\"Customizing chart configuration defaults.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, A"
  },
  {
    "path": "altair/typing/__init__.py",
    "chars": 1956,
    "preview": "\"\"\"Public types to ease integrating with `altair`.\"\"\"\n\nfrom __future__ import annotations\n\n__all__ = [\n    \"ChannelAngle"
  },
  {
    "path": "altair/utils/__init__.py",
    "chars": 1054,
    "preview": "from .core import (\n    SHORTHAND_KEYS,\n    display_traceback,\n    infer_encoding_types,\n    infer_vegalite_type_for_pan"
  },
  {
    "path": "altair/utils/_dfi_types.py",
    "chars": 6512,
    "preview": "# DataFrame Interchange Protocol Types\n# Copied from https://data-apis.org/dataframe-protocol/latest/API.html,\n# changed"
  },
  {
    "path": "altair/utils/_importers.py",
    "chars": 3604,
    "preview": "from __future__ import annotations\n\nfrom importlib.metadata import version as importlib_version\nfrom typing import TYPE_"
  },
  {
    "path": "altair/utils/_show.py",
    "chars": 2310,
    "preview": "from __future__ import annotations\n\nimport webbrowser\nfrom http.server import BaseHTTPRequestHandler, HTTPServer\nfrom ty"
  },
  {
    "path": "altair/utils/_transformed_data.py",
    "chars": 19063,
    "preview": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Any, overload\n\nfrom altair import (\n    Chart,\n   "
  },
  {
    "path": "altair/utils/_vegafusion_data.py",
    "chars": 9647,
    "preview": "from __future__ import annotations\n\nimport uuid\nfrom importlib.metadata import version as importlib_version\nfrom typing "
  },
  {
    "path": "altair/utils/compiler.py",
    "chars": 465,
    "preview": "from collections.abc import Callable\nfrom typing import Any\n\nfrom altair.utils import PluginRegistry\n\n# ================"
  },
  {
    "path": "altair/utils/core.py",
    "chars": 32356,
    "preview": "\"\"\"Utility routines.\"\"\"\n\nfrom __future__ import annotations\n\nimport itertools\nimport json\nimport re\nimport sys\nimport tr"
  },
  {
    "path": "altair/utils/data.py",
    "chars": 14627,
    "preview": "from __future__ import annotations\n\nimport hashlib\nimport json\nimport random\nimport sys\nfrom collections.abc import Call"
  },
  {
    "path": "altair/utils/deprecation.py",
    "chars": 5620,
    "preview": "from __future__ import annotations\n\nimport sys\nimport threading\nimport warnings\nfrom typing import TYPE_CHECKING, Litera"
  },
  {
    "path": "altair/utils/display.py",
    "chars": 8567,
    "preview": "from __future__ import annotations\n\nimport json\nimport pkgutil\nimport textwrap\nimport uuid\nfrom collections.abc import C"
  },
  {
    "path": "altair/utils/execeval.py",
    "chars": 2647,
    "preview": "from __future__ import annotations\n\nimport ast\nimport sys\nfrom typing import TYPE_CHECKING, Any, Literal, overload\n\nif T"
  },
  {
    "path": "altair/utils/html.py",
    "chars": 13763,
    "preview": "from __future__ import annotations\n\nimport json\nfrom typing import Any, Literal\n\nimport jinja2\n\nfrom altair.utils._impor"
  },
  {
    "path": "altair/utils/mimebundle.py",
    "chars": 12923,
    "preview": "from __future__ import annotations\n\nimport struct\nfrom typing import TYPE_CHECKING, Any, Literal, cast, overload\n\nfrom ."
  },
  {
    "path": "altair/utils/plugin_registry.py",
    "chars": 10044,
    "preview": "from __future__ import annotations\n\nimport sys\nfrom collections.abc import Callable\nfrom functools import partial\nfrom i"
  },
  {
    "path": "altair/utils/save.py",
    "chars": 10365,
    "preview": "from __future__ import annotations\n\nimport json\nimport pathlib\nimport warnings\nfrom typing import IO, TYPE_CHECKING, Any"
  },
  {
    "path": "altair/utils/schemapi.py",
    "chars": 64125,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\nfro"
  },
  {
    "path": "altair/utils/selection.py",
    "chars": 3928,
    "preview": "from __future__ import annotations\n\nfrom dataclasses import dataclass\nfrom typing import Any, NewType\n\n# Type representi"
  },
  {
    "path": "altair/utils/server.py",
    "chars": 4100,
    "preview": "\"\"\"\nA Simple server used to show altair graphics from a prompt or script.\n\nThis is adapted from the mpld3 package; see\nh"
  },
  {
    "path": "altair/vegalite/__init__.py",
    "chars": 37,
    "preview": "# ruff: noqa: F403\nfrom .v6 import *\n"
  },
  {
    "path": "altair/vegalite/api.py",
    "chars": 35,
    "preview": "# ruff: noqa\nfrom .v6.api import *\n"
  },
  {
    "path": "altair/vegalite/data.py",
    "chars": 1783,
    "preview": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, overload\n\nfrom altair.utils.core import sanitize_p"
  },
  {
    "path": "altair/vegalite/display.py",
    "chars": 342,
    "preview": "from altair.utils.display import (\n    DefaultRendererReturnType,\n    Displayable,\n    HTMLRenderer,\n    RendererRegistr"
  },
  {
    "path": "altair/vegalite/schema.py",
    "chars": 75,
    "preview": "\"\"\"Altair schema wrappers.\"\"\"\n\n# ruff: noqa: F403\nfrom .v6.schema import *\n"
  },
  {
    "path": "altair/vegalite/v6/__init__.py",
    "chars": 16123,
    "preview": "# ruff: noqa: F403, F405\nfrom altair.expr.core import datum\nfrom altair.vegalite.v6 import api, compiler, schema\nfrom al"
  },
  {
    "path": "altair/vegalite/v6/api.py",
    "chars": 202626,
    "preview": "from __future__ import annotations\n\nimport functools\nimport hashlib\nimport io\nimport itertools\nimport json\nimport operat"
  },
  {
    "path": "altair/vegalite/v6/compiler.py",
    "chars": 816,
    "preview": "from typing import Final\n\nfrom altair.utils._importers import import_vl_convert\nfrom altair.utils.compiler import VegaLi"
  },
  {
    "path": "altair/vegalite/v6/data.py",
    "chars": 1175,
    "preview": "from typing import Final\n\nfrom altair.utils._vegafusion_data import vegafusion_data_transformer\nfrom altair.vegalite.dat"
  },
  {
    "path": "altair/vegalite/v6/display.py",
    "chars": 6087,
    "preview": "from __future__ import annotations\n\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING, Final\n\nfrom altair.utils."
  },
  {
    "path": "altair/vegalite/v6/schema/__init__.py",
    "chars": 14606,
    "preview": "# ruff: noqa: F403, F405\n# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do"
  },
  {
    "path": "altair/vegalite/v6/schema/_config.py",
    "chars": 310625,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\nfr"
  },
  {
    "path": "altair/vegalite/v6/schema/_typing.py",
    "chars": 23515,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\nfr"
  },
  {
    "path": "altair/vegalite/v6/schema/channels.py",
    "chars": 1203824,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\nfr"
  },
  {
    "path": "altair/vegalite/v6/schema/core.py",
    "chars": 1600448,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\nfr"
  },
  {
    "path": "altair/vegalite/v6/schema/mixins.py",
    "chars": 87010,
    "preview": "# The contents of this file are automatically written by\n# tools/generate_schema_wrapper.py. Do not modify directly.\n\nfr"
  },
  {
    "path": "altair/vegalite/v6/schema/vega-lite-schema.json",
    "chars": 1878969,
    "preview": "{\n  \"$ref\": \"#/definitions/TopLevelSpec\",\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"definitions\": {\n   "
  },
  {
    "path": "altair/vegalite/v6/schema/vega-themes.json",
    "chars": 25729,
    "preview": "{\n  \"carbong10\": {\n    \"config\": {\n      \"arc\": {\n        \"fill\": \"#6929c4\"\n      },\n      \"area\": {\n        \"fill\": \"#6"
  },
  {
    "path": "altair/vegalite/v6/theme.py",
    "chars": 3725,
    "preview": "\"\"\"Tools for enabling and registering chart themes.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHEC"
  },
  {
    "path": "doc/.gitignore",
    "chars": 132,
    "preview": "_build\n\n# gallery is auto-generated; don't version-control it\ngallery\n_images\n\n# generated class documentation\nuser_guid"
  },
  {
    "path": "doc/_static/altair-gallery.css",
    "chars": 2926,
    "preview": ".figure {\n    float: left;\n    margin: 10px;\n    width: auto;\n    height: 220px;\n}\n\n.figure.minigallery {\n    height: au"
  },
  {
    "path": "doc/_static/altair-plot.css",
    "chars": 175,
    "preview": ".vega-actions a {\n    margin-right: 12px;\n    color: #757575;\n    font-weight: normal;\n    font-size: 13px;\n}\n\n.vega-emb"
  },
  {
    "path": "doc/_static/chart.html",
    "chars": 1053,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"https://cdn.jsdelivr.net/npm/vega@6\"></script>\n  <script src=\"https://cdn.j"
  },
  {
    "path": "doc/_static/custom.css",
    "chars": 2558,
    "preview": "html[data-theme=\"light\"] {\n  --pst-color-primary: rgb(93, 154, 181);\n  --pst-color-secondary: rgb(93, 154, 181);\n  --pst"
  },
  {
    "path": "doc/_static/theme_overrides.css",
    "chars": 761,
    "preview": "/* override table width restrictions */\n@media screen and (min-width: 767px) {\n\n    .wy-table-responsive table td {\n    "
  },
  {
    "path": "doc/_templates/class.rst",
    "chars": 241,
    "preview": ":mod:`{{module}}`.{{objname}}\n{{ underline }}==============\n\n.. currentmodule:: {{ module }}\n\n.. autoclass:: {{ objname "
  },
  {
    "path": "doc/_templates/navbar-project.html",
    "chars": 98,
    "preview": "<a class=\"navbar-brand\" href=\"{{ pathto(master_doc) }}\">\n<p class=\"title\">{{ project }}</p>\n</a>\n\n"
  },
  {
    "path": "doc/_templates/sidebar-logo.html",
    "chars": 475,
    "preview": "<div class=\"navbar-brand-box\">\n    <a class=\"navbar-brand text-wrap\" href=\"{{ pathto('index') }}\">\n      {% if logo %}\n "
  },
  {
    "path": "doc/about/citing.rst",
    "chars": 1413,
    "preview": "Citing\n===============\n\nVega-Altair\n-----------\nIf you use Vega-Altair in academic work, please consider citing\n`Altair:"
  },
  {
    "path": "doc/about/code_of_conduct.rst",
    "chars": 171,
    "preview": "Code of Conduct\n===============\n\nAs a project of the Vega Organization, we use the `Vega Code of Conduct <https://github"
  },
  {
    "path": "doc/about/governance.rst",
    "chars": 601,
    "preview": "Governance\n==========\nVega-Altair's governance structure is based on GitHub's\n`Minimum Viable Governance <https://github"
  },
  {
    "path": "doc/about/roadmap.rst",
    "chars": 292,
    "preview": "Roadmap\n=======\n\nThe roadmap for Vega-Altair and related projects can be found in\n`this project board <https://github.co"
  },
  {
    "path": "doc/about/versioning.rst",
    "chars": 1944,
    "preview": "Versioning\n==========\nVega-Altair has historically released major versions that coincide with those of Vega-Lite_.\n\nAs t"
  },
  {
    "path": "doc/case_studies/exploring-weather.rst",
    "chars": 9576,
    "preview": ".. _exploring-weather:\n\nExploring Seattle Weather\n-------------------------\n\n(This tutorial is adapted from `Vega-Lite's"
  },
  {
    "path": "doc/case_studies/index.rst",
    "chars": 159,
    "preview": "Tutorials\n---------\n\nThese tutorials explore more advanced use cases than the gallery.\n\n.. toctree::\n   :hidden:\n\n   exp"
  },
  {
    "path": "doc/case_studies/numpy-tooltip-images.rst",
    "chars": 8264,
    "preview": ".. _numpy-tooltip-imgs:\n\nDisplaying Numpy Images in Tooltips\n-----------------------------------\n\nIn this tutorial,\nyou’"
  },
  {
    "path": "doc/conf.py",
    "chars": 12135,
    "preview": "# !/usr/bin/env python3\n#\n# altair documentation build configuration file, created by\n# sphinx-quickstart on Wed Sep  7 "
  },
  {
    "path": "doc/getting_started/getting_help.rst",
    "chars": 819,
    "preview": "Getting Help\n============\n\nAltair is BSD-licensed and the source is available on `GitHub`_,\nwhere you can also report `b"
  },
  {
    "path": "doc/getting_started/installation.rst",
    "chars": 2030,
    "preview": ".. currentmodule:: altair\n\n.. _installation:\n\nInstallation\n============\n\nAltair can be installed, along with all its opt"
  },
  {
    "path": "doc/getting_started/overview.rst",
    "chars": 1792,
    "preview": ".. _overview:\n\nOverview\n========\n\nVega-Altair is a declarative statistical visualization library for Python, based on\nVe"
  },
  {
    "path": "doc/getting_started/project_philosophy.rst",
    "chars": 3261,
    "preview": "Project Philosophy\n==================\n\nMany excellent plotting libraries exist in Python, including:\n\n* `Matplotlib <htt"
  },
  {
    "path": "doc/getting_started/resources.rst",
    "chars": 5645,
    "preview": ".. _resources:\n\nResources\n=========\n\nWe hope to make it easier to find learning resources and projects related to Altair"
  },
  {
    "path": "doc/getting_started/starting.rst",
    "chars": 8907,
    "preview": ".. _starting:\n\nBasic Statistical Visualization\n===================================\n\n(This tutorial is adapted from `Vega"
  },
  {
    "path": "doc/index.rst",
    "chars": 2493,
    "preview": ":html_theme.sidebar_secondary.remove:\n\nVega-Altair: Declarative Visualization in Python\n================================"
  },
  {
    "path": "doc/releases/changes.rst",
    "chars": 155,
    "preview": ":orphan:\n\nRelease Notes\n=============\n\nWe have moved the release notes to GitHub. You can now find them `here <https://g"
  },
  {
    "path": "doc/user_guide/api.rst",
    "chars": 16288,
    "preview": ".. _api:\n\nAPI Reference\n=============\n\nThis is the class and function reference of Altair, and the following content\nis "
  },
  {
    "path": "doc/user_guide/compound_charts.rst",
    "chars": 14004,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-compound:\n\nLayered & Multi-View Charts\n---------------------------\nAlong with "
  },
  {
    "path": "doc/user_guide/configuration.rst",
    "chars": 9254,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-configuration:\n\nTop-Level Chart Configuration\n=============================\nMa"
  },
  {
    "path": "doc/user_guide/custom_renderers.rst",
    "chars": 2297,
    "preview": "\n.. _customizing-renderers:\n\nCustomizing Renderers\n=====================\nA renderer, as introduced in :ref:`renderers`, "
  },
  {
    "path": "doc/user_guide/customization.rst",
    "chars": 26055,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-customization:\n\nCustomizing Visualizations\n==========================\n\nAltair'"
  },
  {
    "path": "doc/user_guide/data.rst",
    "chars": 24053,
    "preview": ".. currentmodule:: altair\n    \n.. _user-guide-data:\n\nSpecifying Data\n---------------\n\nThe basic data model used by Altai"
  },
  {
    "path": "doc/user_guide/data_transformers.rst",
    "chars": 6896,
    "preview": ".. _data-transformers:\n\nData Transformers\n=================\n\nBefore a Vega-Lite or Vega specification can be passed to a"
  },
  {
    "path": "doc/user_guide/display_frontends.rst",
    "chars": 29117,
    "preview": ".. _displaying-charts:\n\nDisplaying Altair Charts\n========================\n\nAltair produces `Vega-Lite`_ visualizations, "
  },
  {
    "path": "doc/user_guide/encodings/channel_options.rst",
    "chars": 3279,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-encoding-channel-options:\n\nChannel Options\n---------------\n\nSome encoding chan"
  },
  {
    "path": "doc/user_guide/encodings/channels.rst",
    "chars": 9324,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-encoding-channels:\n\nChannels\n--------\n\nAltair provides a number of encoding ch"
  },
  {
    "path": "doc/user_guide/encodings/index.rst",
    "chars": 23116,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-encoding:\n\nEncodings\n---------\n\nThe key to creating meaningful visualizations "
  },
  {
    "path": "doc/user_guide/interactions/bindings_widgets.rst",
    "chars": 14733,
    "preview": ".. currentmodule:: altair\n\n.. _binding-parameters:\n\nBindings & Widgets\n~~~~~~~~~~~~~~~~~~\n\nWith an understanding of the "
  },
  {
    "path": "doc/user_guide/interactions/expressions.rst",
    "chars": 8459,
    "preview": ".. currentmodule:: altair\n\n.. _expressions:\n\nExpressions\n~~~~~~~~~~~\n\nAltair allows custom interactions by utilizing the"
  },
  {
    "path": "doc/user_guide/interactions/index.rst",
    "chars": 1779,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-interactions:\n\nInteractive Charts\n==================\n\nOne of the unique featur"
  },
  {
    "path": "doc/user_guide/interactions/jupyter_chart.rst",
    "chars": 15200,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-jupyterchart:\n\nJupyterChart\n============\nThe ``JupyterChart`` class, introduce"
  },
  {
    "path": "doc/user_guide/interactions/parameters.rst",
    "chars": 27006,
    "preview": ".. currentmodule:: altair\n\n.. _parameters:\n\nParameters, Conditions, & Filters\n=================================\n\nParamet"
  },
  {
    "path": "doc/user_guide/internals.rst",
    "chars": 8645,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-internals:\n\nAltair Internals\n================\nThis section will provide some d"
  },
  {
    "path": "doc/user_guide/large_datasets.rst",
    "chars": 16528,
    "preview": ".. _large-datasets:\n\nLarge Datasets\n--------------\nIf you try to create a plot that will directly embed a dataset with m"
  },
  {
    "path": "doc/user_guide/marks/arc.rst",
    "chars": 3761,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-arc-marks:\n\nArc\n~~~\n\nArc marks are circular arcs defined by a center point plu"
  },
  {
    "path": "doc/user_guide/marks/area.rst",
    "chars": 5908,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-area-marks:\n\nArea\n~~~~~~~~~~\n``area`` represent multiple data element as a sin"
  },
  {
    "path": "doc/user_guide/marks/bar.rst",
    "chars": 4307,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-bar-marks:\n\nBar\n~~~\n\nBar marks are useful in many visualizations, including ba"
  },
  {
    "path": "doc/user_guide/marks/boxplot.rst",
    "chars": 4419,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-boxplot-marks:\n\nBox Plot\n~~~~~~~~~\n\nA box plot summarizes a distribution of qu"
  },
  {
    "path": "doc/user_guide/marks/circle.rst",
    "chars": 777,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-circle-marks:\n\nCircle\n~~~~~~\n\n``circle`` mark is similar to ``point`` mark, ex"
  },
  {
    "path": "doc/user_guide/marks/errorband.rst",
    "chars": 5147,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-errorband-marks:\n\nError Band\n~~~~~~~~~~\n\nAn error band summarizes an error ran"
  },
  {
    "path": "doc/user_guide/marks/errorbar.rst",
    "chars": 7973,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-errorbar-marks:\n\nError Bar\n~~~~~~~~~~\n\nAn error bar summarizes an error range "
  },
  {
    "path": "doc/user_guide/marks/geoshape.rst",
    "chars": 23954,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-geoshape-marks:\n\nGeoshape\n^^^^^^^^^^^^^\n``mark_geoshape`` represents an arbitr"
  },
  {
    "path": "doc/user_guide/marks/image.rst",
    "chars": 5612,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-image-marks:\n\nImage\n~~~~~~\n\nImage marks allow external images, such as icons o"
  },
  {
    "path": "doc/user_guide/marks/index.rst",
    "chars": 5262,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-marks:\n\nMarks\n~~~~~\n\nWe saw in :ref:`user-guide-encoding` that the :meth:`~Cha"
  },
  {
    "path": "doc/user_guide/marks/line.rst",
    "chars": 10744,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-line-marks:\n\nLine\n~~~~\nThe ``line`` mark represents the data points stored in "
  },
  {
    "path": "doc/user_guide/marks/point.rst",
    "chars": 5971,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-point-marks:\n\nPoint\n~~~~~\n``point`` mark represents each data point with a sym"
  },
  {
    "path": "doc/user_guide/marks/rect.rst",
    "chars": 2658,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-rect-marks:\n\nRect\n~~~~\n\nThe ``rect`` mark represents an arbitrary rectangle.\n\n"
  },
  {
    "path": "doc/user_guide/marks/rule.rst",
    "chars": 6726,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-rule-marks:\n\nRule\n~~~~\nThe ``rule`` mark represents each data point as a line "
  },
  {
    "path": "doc/user_guide/marks/square.rst",
    "chars": 711,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-square-marks:\n\nSquare\n~~~~~~\n``square`` mark is similar to ``point`` mark, exc"
  },
  {
    "path": "doc/user_guide/marks/text.rst",
    "chars": 7094,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-text-marks:\n\nText\n~~~~~~\n``text`` mark represents each data point with a text "
  },
  {
    "path": "doc/user_guide/marks/tick.rst",
    "chars": 1461,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-tick-marks:\n\nTick\n~~~~\nThe ``tick`` mark represents each data point as a short"
  },
  {
    "path": "doc/user_guide/marks/trail.rst",
    "chars": 2186,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-trail-marks:\n\nTrail\n~~~~~\nThe ``trail`` mark represents the data points stored"
  },
  {
    "path": "doc/user_guide/saving_charts.rst",
    "chars": 7552,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-saving:\n\nSaving Altair Charts\n--------------------\nAltair chart objects have a"
  },
  {
    "path": "doc/user_guide/scale_resolve.rst",
    "chars": 3108,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-resolve:\n\nScale & Guide Resolution\n------------------------\nWhen creating comp"
  },
  {
    "path": "doc/user_guide/times_and_dates.rst",
    "chars": 8614,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-time:\n\nTimes & Dates\n=============\nWorking with dates, times, and timezones is"
  },
  {
    "path": "doc/user_guide/transform/aggregate.rst",
    "chars": 10594,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-aggregate-transform:\n\nAggregate\n~~~~~~~~~\nThere are two ways to aggregate data"
  },
  {
    "path": "doc/user_guide/transform/bin.rst",
    "chars": 2587,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-bin-transform:\n\nBin\n~~~\nAs with :ref:`user-guide-aggregate-transform`, there a"
  },
  {
    "path": "doc/user_guide/transform/calculate.rst",
    "chars": 1991,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-calculate-transform:\n\nCalculate\n~~~~~~~~~\nThe calculate transform allows the u"
  },
  {
    "path": "doc/user_guide/transform/density.rst",
    "chars": 1514,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-density-transform:\n\nDensity\n~~~~~~~\nThe density transform performs one-dimensi"
  },
  {
    "path": "doc/user_guide/transform/extent.rst",
    "chars": 1549,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-extent-transform:\n\nExtent\n~~~~~~\nThe extent transform can be used to find the "
  },
  {
    "path": "doc/user_guide/transform/filter.rst",
    "chars": 6708,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-filter-transform:\n\nFilter\n~~~~~~\nThe filter transform removes objects from a d"
  },
  {
    "path": "doc/user_guide/transform/flatten.rst",
    "chars": 1791,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-flatten-transform:\n\nFlatten\n~~~~~~~\nThe flatten transform can be used to extra"
  },
  {
    "path": "doc/user_guide/transform/fold.rst",
    "chars": 1466,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-fold-transform:\n\nFold\n~~~~\nThe fold transform is, in short, a way to convert w"
  },
  {
    "path": "doc/user_guide/transform/impute.rst",
    "chars": 3425,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-impute-transform:\n\nImpute\n~~~~~~\nThe impute transform allows you to fill-in mi"
  },
  {
    "path": "doc/user_guide/transform/index.rst",
    "chars": 7068,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-transformations:\n\nData Transformations\n--------------------\nIt is often necess"
  },
  {
    "path": "doc/user_guide/transform/joinaggregate.rst",
    "chars": 2253,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-joinaggregate-transform:\n\nJoin Aggregate\n~~~~~~~~~~~~~~\nThe Join Aggregate tra"
  },
  {
    "path": "doc/user_guide/transform/loess.rst",
    "chars": 1027,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-loess-transform:\n\nLOESS\n~~~~~\nThe LOESS transform (LOcally Estimated Scatterpl"
  },
  {
    "path": "doc/user_guide/transform/lookup.rst",
    "chars": 4480,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-lookup-transform:\n\nLookup\n~~~~~~\nThe Lookup transform extends a primary data s"
  },
  {
    "path": "doc/user_guide/transform/pivot.rst",
    "chars": 2431,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-pivot-transform:\n\nPivot\n~~~~~\nThe pivot transform is, in short, a way to conve"
  },
  {
    "path": "doc/user_guide/transform/quantile.rst",
    "chars": 1006,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-quantile-transform:\n\nQuantile\n~~~~~~~~\nThe quantile transform calculates empir"
  },
  {
    "path": "doc/user_guide/transform/regression.rst",
    "chars": 1602,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-regression-transform:\n\nRegression\n~~~~~~~~~~\n\nThe regression transform fits tw"
  },
  {
    "path": "doc/user_guide/transform/sample.rst",
    "chars": 968,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-sample-transform:\n\nSample\n~~~~~~\nThe sample transform is one of the simpler of"
  },
  {
    "path": "doc/user_guide/transform/stack.rst",
    "chars": 1534,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-stack-transform:\n\nStack\n~~~~~\nThe stack transform allows you to compute values"
  },
  {
    "path": "doc/user_guide/transform/timeunit.rst",
    "chars": 3503,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-timeunit-transform:\n\nTimeUnit\n~~~~~~~~\nTimeUnit transforms are used to discret"
  },
  {
    "path": "doc/user_guide/transform/window.rst",
    "chars": 7263,
    "preview": ".. currentmodule:: altair\n\n.. _user-guide-window-transform:\n\nWindow\n~~~~~~\nThe window transform performs calculations ov"
  },
  {
    "path": "paper/paper.bib",
    "chars": 2684,
    "preview": "@article{2011-d3,\n title = {D3: Data-Driven Documents},\n author = {Bostock, Michael and Ogievetsky, Vadim and Heer, Jeff"
  },
  {
    "path": "paper/paper.md",
    "chars": 4955,
    "preview": "---\ntitle: 'Altair: Interactive Statistical Visualizations for Python'\ntags:\n  - Python\n  - visualization\n  - statistics"
  },
  {
    "path": "pyproject.toml",
    "chars": 12115,
    "preview": "# this file contains:\n# 1 build system configuration\n# 2 project configuration\n# 3 tool configuration, for:\n# - hatch\n# "
  },
  {
    "path": "sphinxext/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "sphinxext/altairgallery.py",
    "chars": 11596,
    "preview": "from __future__ import annotations\n\nimport collections\nimport hashlib\nimport json\nimport random\nimport shutil\nimport war"
  },
  {
    "path": "sphinxext/code_ref.py",
    "chars": 12203,
    "preview": "\"\"\"Sphinx extension providing formatted code blocks, referencing some function.\"\"\"\n\nfrom __future__ import annotations\n\n"
  },
  {
    "path": "sphinxext/schematable.py",
    "chars": 7281,
    "preview": "from __future__ import annotations\n\nimport importlib\nimport re\nimport warnings\nfrom typing import TYPE_CHECKING, Any\n\nfr"
  },
  {
    "path": "sphinxext/utils.py",
    "chars": 6575,
    "preview": "from __future__ import annotations\n\nimport ast\nimport hashlib\nimport itertools\nimport json\nimport re\nfrom pathlib import"
  },
  {
    "path": "tests/__init__.py",
    "chars": 8833,
    "preview": "from __future__ import annotations\n\nimport pkgutil\nimport re\nimport sys\nfrom importlib.util import find_spec\nfrom pathli"
  },
  {
    "path": "tests/altair_theme_test.py",
    "chars": 5291,
    "preview": "# ruff: noqa: E711\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from alta"
  },
  {
    "path": "tests/examples_arguments_syntax/__init__.py",
    "chars": 1013,
    "preview": "import os\nfrom typing import Set\n\n# Set of the names of examples that should have SVG static images.\n# This is for examp"
  },
  {
    "path": "tests/examples_arguments_syntax/airport_connections.py",
    "chars": 2041,
    "preview": "\"\"\"\nConnections Among U.S. Airports Interactive\n-------------------------------------------\nThis example shows all the c"
  },
  {
    "path": "tests/examples_arguments_syntax/annual_weather_heatmap.py",
    "chars": 649,
    "preview": "\"\"\"\nAnnual Weather Heatmap\n----------------------\n\"\"\"\n# category: tables\nimport altair as alt\nfrom altair.datasets impor"
  },
  {
    "path": "tests/examples_arguments_syntax/anscombe_plot.py",
    "chars": 768,
    "preview": "\"\"\"\nAnscombe's Quartet\n------------------\n\n`Anscombe's Quartet <https://en.wikipedia.org/wiki/Anscombe%27s_quartet>`_\nis"
  },
  {
    "path": "tests/examples_arguments_syntax/area_chart_gradient.py",
    "chars": 781,
    "preview": "\"\"\"\nArea Chart with Gradient\n------------------------\nThis example shows how to make an area chart with a gradient fill."
  },
  {
    "path": "tests/examples_arguments_syntax/area_faceted.py",
    "chars": 537,
    "preview": "\"\"\"\nFaceted Area Chart\n------------------\nMultiple area subcharts, one for each company.\nWe also show filtering out one "
  },
  {
    "path": "tests/examples_arguments_syntax/bar_and_line_with_dual_axis.py",
    "chars": 502,
    "preview": "\"\"\"\nBar Chart with Line on Dual Axis\n--------------------------------\nThis example shows how to combine two plots and ke"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_faceted_compact.py",
    "chars": 2163,
    "preview": "\"\"\"\nCompact Faceted Grid of Bar Charts\n==================================\nA simple grid of bar charts to compare perform"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_horizontal.py",
    "chars": 341,
    "preview": "\"\"\"\nHorizontal Bar Chart\n--------------------\nThis example is a bar chart drawn horizontally by putting the quantitative"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_sorted.py",
    "chars": 299,
    "preview": "\"\"\"\nSorted Bar Chart\n================\nThis example shows a bar chart sorted by a calculated value.\n\"\"\"\n# category: bar c"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_highlighted_bar.py",
    "chars": 546,
    "preview": "\"\"\"\nBar Chart with Highlighted Bar\n------------------------------\nThis example shows a basic bar chart with a single bar"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_highlighted_segment.py",
    "chars": 721,
    "preview": "\"\"\"\nBar Chart with Highlighted Segment\n----------------------------------\nThis example shows a bar chart that highlights"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_labels.py",
    "chars": 371,
    "preview": "\"\"\"\nBar Chart with Labels\n=====================\nThis example shows a basic horizontal bar chart with labels created with"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_labels_measured_luminance.py",
    "chars": 815,
    "preview": "\"\"\"\nBar Chart with Labels based on Measured Luminance\n=================================================\nThis example sho"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_mean_line.py",
    "chars": 418,
    "preview": "\"\"\"\nBar Chart with Line at Mean\n---------------------------\nThis example shows the mean value overlaid on a bar chart.\n\""
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_negatives.py",
    "chars": 500,
    "preview": "\"\"\"\nBar Chart with Negative Values\n==============================\nThis example shows a bar chart with both positive and "
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_range.py",
    "chars": 936,
    "preview": "\"\"\"\nBar Chart with Range\n====================\nThis example shows a range bar chart where each bar displays information o"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_chart_with_single_threshold.py",
    "chars": 887,
    "preview": "\"\"\"\nBar Chart Highlighting Values beyond a Threshold\n------------------------------------------------\nThis example shows"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_faceted_stacked.py",
    "chars": 449,
    "preview": "\"\"\"\nFaceted Stacked Bar Chart\n=========================\nA horizontal stacked bar chart using barley crop yield data.\nThe"
  },
  {
    "path": "tests/examples_arguments_syntax/bar_rounded.py",
    "chars": 400,
    "preview": "\"\"\"\nBar Chart with Rounded Edges\n----------------------------\nThis example shows how to create a bar chart with rounded "
  },
  {
    "path": "tests/examples_arguments_syntax/bar_with_rolling_mean.py",
    "chars": 676,
    "preview": "\"\"\"\nBar Chart with Rolling Mean\n---------------------------\nA bar chart overlaid with a rolling mean. In this example th"
  },
  {
    "path": "tests/examples_arguments_syntax/beckers_barley_facet.py",
    "chars": 1246,
    "preview": "\"\"\"\nBecker's Barley Faceted Plot\n----------------------------\nThe example demonstrates the faceted charts created by Ric"
  },
  {
    "path": "tests/examples_arguments_syntax/beckers_barley_wrapped_facet.py",
    "chars": 876,
    "preview": "\"\"\"\nBecker's Barley Wrapped Facet Plot\n----------------------------------\nThe example demonstrates the faceted charts cr"
  },
  {
    "path": "tests/examples_arguments_syntax/boxplot.py",
    "chars": 544,
    "preview": "\"\"\"\nBoxplot with Min/Max Whiskers\n------------------------------\nThis example shows how to make a boxplot using US Popul"
  },
  {
    "path": "tests/examples_arguments_syntax/bubble_plot.py",
    "chars": 298,
    "preview": "\"\"\"\nBubble Plot\n-----------------\nThis example shows how to make a bubble plot.\n\"\"\"\n# category: scatter plots\nimport alt"
  }
]

// ... and 335 more files (download for full content)

About this extraction

This page contains the full source code of the vega/altair GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 535 files (7.1 MB), approximately 1.9M tokens, and a symbol index with 4110 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!