# Technical Documentation: thu-ml/tianshou

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/thu-ml/tianshou)

### Overview (`README.md`)

<div align="center">
  <a href="http://tianshou.readthedocs.io"><img width="300px" height="auto" src="https://github.com/thu-ml/tianshou/raw/master/docs/_static/images/tianshou-logo.png"></a>
</div>

---

[](https://pypi.org/project/tianshou/) [](https://tianshou.org/en/master/) [](https://github.com/thu-ml/tianshou/actions) [](https://codecov.io/gh/thu-ml/tianshou) [](https://github.com/thu-ml/tianshou/issues) [](https://github.com/thu-ml/tianshou/stargazers) [](https://github.com/thu-ml/tianshou/network) [](https://github.com/thu-ml/tianshou/blob/master/LICENSE)

> [!NOTE]
> **Tianshou version 2 is here!**  
> 
> We have released the new major version of Tianshou on PyPI.  
> Version 2 is a complete overhaul of the software design of the procedural API, in which
>   * we establish a clear separation between learning algorithms and policies (via the separate abstractions `Algorithm` and `Policy`).
>   * we provide more well-defined, more usable interfaces with extensive documentation of all algorithm and trainer parameters,
>     renaming some parameters to make their names more consistent and intuitive.
>   * the class hierarchy is fully revised, establishing a clear separation between on-policy, off-policy and offline algorithms
>     at the type level and ensuring that all inheritance relationships are meaningful.
> 
> Because of the extent of the changes, this version is not backwards compatible with previous versions of Tianshou.
> For migration information, please see the [change log](CHANGELOG.md). 

**Tianshou** ([天授](https://baike.baidu.com/item/%E5%A4%A9%E6%8E%88)) is a reinforcement learning (RL) library based on pure PyTorch and [Gymnasium](http://github.com/Farama-Foundation/Gymnasium). Tianshou's main features at a glance are:

1. Modular low-level interfaces for algorithm developers (RL researchers) that are both flexible, hackable and type-safe.
1. Convenient high-level interfaces for applications of RL (training an implemented algorithm on a custom environment).
1. Large scope: online (on- and off-policy) and offline RL, experimental support for multi-agent RL (MARL), experimental support for model-based RL, and more

Unlike other reinforcement learning libraries, which may have complex codebases,
unfriendly high-level APIs, or are not optimized for speed, Tianshou provides a high-performance, modularized framework
and user-friendly interfaces for building deep reinforcement learning agents. One more aspect that sets Tianshou apart is its
generality: it supports online and offline RL, multi-agent RL, and model-based algorithms.

Tianshou aims at enabling concise implementations, both for researchers and practitioners, without sacrificing flexibility.

Supported algorithms include:

- [Deep Q-Network (DQN)](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf)
- [Double DQN](https://arxiv.org/pdf/1509.06461.pdf)
- [Dueling DQN](https://arxiv.org/pdf/1511.06581.pdf)
- [Branching DQN](https://arxiv.org/pdf/1711.08946.pdf)
- [Categorical DQN (C51)](https://arxiv.org/pdf/1707.06887.pdf)
- [Rainbow DQN (Rainbow)](https://arxiv.org/pdf/1710.02298.pdf)
- [Quantile Regression DQN (QRDQN)](https://arxiv.org/pdf/1710.10044.pdf)
- [Implicit Quantile Network (IQN)](https://arxiv.org/pdf/1806.06923.pdf)
- [Fully-parameterized Quantile Function (FQF)](https://arxiv.org/pdf/1911.02140.pdf)
- [Policy Gradient (PG)](https://papers.nips.cc/paper/1713-policy-gradient-methods-for-reinforcement-learning-with-function-approximation.pdf)
- [Natural Policy Gradient (NPG)](https://proceedings.neurips.cc/paper/2001/file/4b86abe48d358ecf194c56c69108433e-Paper.pdf)
- [Advantage Actor-Critic (A2C)](https://openai.com/blog/baselines-acktr-a2c/)
- [Trust Region Policy Optimization (TRPO)](https://arxiv.org/pdf/1502.05477.pdf)
- [Proximal Policy Optimization (PPO)](https://arxiv.org/pdf/1707.06347.pdf)
- [Deep Deterministic Policy Gradient (DDPG)](https://arxiv.org/pdf/1509.02971.pdf)
- [Twin Delayed DDPG (TD3)](https://arxiv.org/pdf/1802.09477.pdf)
- [Soft Actor-Critic (SAC)](https://arxiv.org/pdf/1812.05905.pdf)
- [Randomized Ensembled Double Q-Learning (REDQ)](https://arxiv.org/pdf/2101.05982.pdf)
- [Discrete Soft Actor-Critic (SAC-Discrete)](https://arxiv.org/pdf/1910.07207.pdf)
- [Vanilla Imitation Learning](https://en.wikipedia.org/wiki/Apprenticeship_learning)
- [Batch-Constrained deep Q-Learning (BCQ)](https://arxiv.org/pdf/1812.02900.pdf)
- [Conservative Q-Learning (CQL)](https://arxiv.org/pdf/2006.04779.pdf)
- [Twin Delayed DDPG with Behavior Cloning (TD3+BC)](https://arxiv.org/pdf/2106.06860.pdf)
- [Discrete Batch-Constrained deep Q-Learning (BCQ-Discrete)](https://arxiv.org/pdf/1910.01708.pdf)
- [Discrete Conservative Q-Learning (CQL-Discrete)](https://arxiv.org/pdf/2006.04779.pdf)
- [Discrete Critic Regularized Regression (CRR-Discrete)](https://arxiv.org/pdf/2006.15134.pdf)
- [Generative Adversarial Imitation Learning (GAIL)](https://arxiv.org/pdf/1606.03476.pdf)
- [Prioritized Experience Replay (PER)](https://arxiv.org/pdf/1511.05952.pdf)
- [Generalized Advantage Estimator (GAE)](https://arxiv.org/pdf/1506.02438.pdf)
- [Posterior Sampling Reinforcement Learning (PSRL)](https://www.ece.uvic.ca/~bctill/papers/learning/Strens_2000.pdf)
- [Intrinsic Curiosity Module (ICM)](https://arxiv.org/pdf/1705.05363.pdf)
- [Hindsight Experience Replay (HER)](https://arxiv.org/pdf/1707.01495.pdf)

Other noteworthy features:

- Elegant framework with dual APIs:
  - Tianshou's high-level API maximizes ease of use for application development while still retaining a high degree
    of flexibility.
  - The fundamental procedural API provides a maximum of flexibility for algorithm development without being
    overly verbose.
- State-of-the-art results in [MuJoCo benchmarks](https://github.com/thu-ml/tianshou/tree/master/examples/mujoco) for REINFORCE/A2C/TRPO/PPO/DDPG/TD3/SAC algorithms
- Support for vectorized environments (synchronous or asynchronous) for all algorithms (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#parallel-sampling))
- Support for super-fast vectorized environments based on [EnvPool](https://github.com/sail-sg/envpool/) for all algorithms (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#envpool-integration))
- Support for recurrent state representations in actor networks and critic networks (RNN-style training for POMDPs) (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#rnn-style-training))
- Support any type of environment state/action (e.g. a dict, a self-defined class, ...) [Usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#user-defined-environment-and-different-state-representation)
- Support for customized training processes (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#customize-training-process))
- Support n-step returns estimation and prioritized experience replay for all Q-learning based algorithms; GAE, nstep and PER are highly optimized thanks to numba's just-in-time compilation and vectorized numpy operations
- Support for multi-agent RL (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#multi-agent-reinforcement-learning))
- Support for logging based on both [TensorBoard](https://www.tensorflow.org/tensorboard) and [W&B](https://wandb.ai/)
- Support for multi-GPU training (see [usage](https://tianshou.readthedocs.io/en/master/01_tutorials/07_cheatsheet.html#multi-gpu))
- Comprehensive documentation, PEP8 code-style checking, type checking and thorough [tests](https://github.com/thu-ml/tianshou/actions)

In Chinese, Tianshou means divinely ordained, being derived to the gift of being born.
Tianshou is a reinforcement learning platform, and the nature of RL is not learn from humans.
So taking "Tianshou" means that there is no teacher to learn from, but rather to learn by oneself through constant interaction with the environment.

“天授”意指上天所授，引申为与生具有的天赋。天授是强化学习平台，而强化学习算法并不是向人类学习的，所以取“天授”意思是没有老师来教，而是自己通过跟环境不断交互来进行学习。

## Installation

Tianshou is currently hosted on [PyPI](https://pypi.org/project/tianshou/) and [conda-forge](https://github.com/conda-forge/tianshou-feedstock). It requires Python >= 3.11.

For installing the most recent version of Tianshou, the best way is clone the repository and install it with [poetry](https://python-poetry.org/)
(which you need to install on your system first)

```bash
git clone git@github.com:thu-ml/tianshou.git
cd tianshou
poetry install
```

You can also install the dev requirements by adding `--with dev` or the extras
for say mujoco and acceleration by [envpool](https://github.com/sail-sg/envpool)
by adding `--extras "mujoco envpool"`

If you wish to install multiple extras, ensure that you include them in a single command. Sequential calls to `poetry install --extras xxx` will overwrite prior installations, leaving only the last specified extras installed.
Or you may install all the following extras by adding `--all-extras`.

Available extras are:

- `atari` (for Atari environments)
- `box2d` (for Box2D environments)
- `classic_control` (for classic control (discrete) environments)
- `mujoco` (for MuJoCo environments)
- `mujoco-py` (for legacy mujoco-py environments[^1])
- `pybullet` (for pybullet environments)
- `robotics` (for gymnasium-robotics environments)
- `vizdoom` (for ViZDoom environments)
- `envpool` (for [envpool](https://github.com/sail-sg/envpool/) integration)
- `argparse` (in order to be able to run the high level API examples)

[^1]:
    `mujoco-py` is a legacy package and is not recommended for new projects.
    It is only included for compatibility with older projects.
    Also note that there may be compatibility issues with macOS newer than
    Monterey.

Otherwise, you can install the latest release from PyPI (currently
far behind the master) with the following command:

```bash
$ pip install tianshou
```

If you are using Anaconda or Miniconda, you can install Tianshou from conda-forge:

```bash
$ conda install tianshou -c conda-forge
```

Alternatively to the poetry install, you can also install the latest source version through GitHub:

```bash
$ pip install git+https://github.com/thu-ml/tianshou.git@master --upgrade
```

Finally, you may check the installation via your Python console as follows:

```python
import tianshou
print(tianshou.__version__)
```

If no errors are reported, you have successfully installed Tianshou.

## Documentation

Find example scripts in the [test/](  https://github.com/thu-ml/tianshou/blob/master/test) and [examples/](https://github.com/thu-ml/tianshou/blob/master/examples) folders.

Tutorials and API documentation are hosted on [tianshou.readthedocs.io](https://tianshou.readthedocs.io/).

## Why Tianshou?

### Comprehensive Functionality

### High Software Engineering Standards

| RL Platform                                                        | Documentation                                                                                                                                                        | Code Coverage                                                                                                                                                | Type Hints         | Last Update                                                                                                       |
| ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | ----------------------------------------------------------------------------------------------------------------- |
| [Stable-Baselines3](https://github.com/DLR-RM/stable-baselines3)   | [](https://stable-baselines3.readthedocs.io/en/master/?badge=master) | [](https://gitlab.com/araffin/stable-baselines3/-/commits/master) | :heavy_check_mark: |      |
| [Ray/RLlib](https://github.com/ray-project/ray/tree/master/rllib/) | [](http://docs.ray.io/en/master/rllib.html)                                                           | :heavy_minus_sign:<sup>(1)</sup>                                                                                                                             | :heavy_check_mark: |               |
| [SpinningUp](https://github.com/openai/spinningup)                 | [](https://spinningup.openai.com/)                                                                                 | :x:                                                                                                                                                          | :x:                |             |
| [Dopamine](https://github.com/google/dopamine)                     | [](https://github.com/google/dopamine/tree/master/docs)                                                          | :x:                                                                                                                                                          | :x:                |               |
| [ACME](https://github.com/deepmind/acme)                           | [](https://github.com/deepmind/acme/blob/master/docs/index.md)                                                   | :heavy_minus_sign:<sup>(1)</sup>                                                                                                                             | :heavy_check_mark: |                 |
| [Sample Factory](https://github.com/alex-petrenko/sample-factory)  | [:heavy_minus_sign:](https://arxiv.org/abs/2006.11751)                                                                                                               | [](https://codecov.io/gh/alex-petrenko/sample-factory)           | :x:                |  |
|                                                                    |                                                                                                                                                                      |                                                                                                                                                              |                    |                                                                                                                   |
| [Tianshou](https://github.com/thu-ml/tianshou)                     | [](https://tianshou.readthedocs.io/en/master)                                                           | [](https://codecov.io/gh/thu-ml/tianshou)                                                     | :heavy_check_mark: |               |

<sup>(1): it has continuous integration but the coverage rate is not available</sup>

### Reproducible, High-Quality Results

Tianshou is rigorously tested. In contrast to other RL platforms, **our tests include the full agent training procedure for all of the implemented algorithms**. Our tests would fail once if any of the agents failed to achieve a consistent level of performance on limited epochs.
Our tests thus ensure reproducibility.
Check out the [GitHub Actions](https://github.com/thu-ml/tianshou/actions) page for more detail.

Atari and MuJoCo benchmark results can be found in the [examples/atari/](examples/atari/) and [examples/mujoco/](examples/mujoco/) folders respectively. **Our MuJoCo results reach or exceed the level of performance of most existing benchmarks.**

### Algorithm Abstraction

Reinforcement learning algorithms are build on abstractions for

- on-policy algorithms (`OnPolicyAlgorithm`),
- off-policy algorithms (`OffPolicyAlgorithm`), and
- offline algorithms (`OfflineAlgorithm`),

all of which clearly separate the core algorithm from the training process and the respective environment interactions.

In each case, the implementation of an algorithm necessarily involves only the implementation of methods for

- pre-processing a batch of data, augmenting it with necessary information/sufficient statistics for learning (`_preprocess_batch`),
- updating model parameters based on an augmented batch of data (`_update_with_batch`).

The implementation of these methods suffices for a new algorithm to be applicable within Tianshou,
making experimentation with new approaches particularly straightforward.

## Quick Start

Tianshou provides two API levels:

- the high-level interface, which provides ease of use for end users seeking to run deep reinforcement learning applications
- the procedural interface, which provides a maximum of control, especially for very advanced users and developers of reinforcement learning algorithms.

In the following, let us consider an example application using the _CartPole_ gymnasium environment.
We shall apply the deep Q-network (DQN) learning algorithm using both APIs.

### High-Level API

In the high-level API, the basis for an RL experiment is an `ExperimentBuilder`
with which we can build the experiment we then seek to run.
Since we want to use DQN, we use the specialization `DQNExperimentBuilder`.

The high-level API provides largely declarative semantics, i.e. the code is
almost exclusively concerned with configuration that controls what to do
(rather than how to do it).

```
/* Detailed source-code truncated for AI context efficiency. */
```

The experiment builder takes three arguments:

- the environment factory for the creation of environments. In this case,
  we use an existing factory implementation for gymnasium environments.
- the experiment configuration, which controls persistence and the overall
  experiment flow. In this case, we have configured that we want to observe
  the agent's behavior after it is trained (`watch=True`) for a number of
  episodes (`watch_num_episodes=100`). We have disabled persistence, because
  we do not want to save training logs, the agent or its configuration for
  future use.
- the training configuration, which controls fundamental training parameters,
  such as the total number of epochs we run the experiment for (`num_epochs=10`)  
  and the number of environment steps each epoch shall consist of
  (`epoch_num_steps=10000`).
  Every epoch consists of a series of data collection (rollout) steps and
  training steps.
  The parameter `collection_step_num_env_steps` controls the amount of data that is
  collected in each collection step and after each collection step, we
  perform a training step, applying a gradient-based update based on a sample
  of data (`batch_size=64`) taken from the buffer of data that has been
  collected. For further details, see the documentation of configuration class.

We then proceed to configure some of the parameters of the DQN algorithm itself:
For instance, we control the epsilon parameter for exploration.
We want to use random exploration during rollouts for training (`eps_training`),
but we don't when evaluating the agent's performance in the test environments
(`eps_inference`).
Furthermore, we configure model parameters of the network for the Q function,
parametrising the number of hidden layers of the default MLP factory.

Find the script in [examples/discrete/discrete_dqn_hl.py](examples/discrete/discrete_dqn_hl.py).
Here's a run (with the training time cut short):

<p align="center" style="text-algin:center">
  <img src="docs/_static/images/discrete_dqn_hl.gif">
</p>

Find many further applications of the high-level API in the `examples/` folder;
look for scripts ending with `_hl.py`.
Note that most of these examples require the extra `argparse`
(install it by adding `--extras argparse` when invoking poetry).

### Procedural API

Let us now consider an analogous example in the procedural API.
Find the full script in [examples/discrete/discrete_dqn.py](https://github.com/thu-ml/tianshou/blob/master/examples/discrete/discrete_dqn.py).

First, import the relevant packages:

```python
import gymnasium as gym
import tianshou as ts
from tianshou.algorithm.modelfree.dqn import DiscreteQLearningPolicy
from tianshou.algorithm.optim import AdamOptimizerFactory
from tianshou.data import CollectStats
from tianshou.trainer import OffPolicyTrainerParams
from tianshou.utils.net.common import Net
from tianshou.utils.space_info import SpaceInfo
from torch.utils.tensorboard import SummaryWriter
```

Define hyper-parameters:

```python
task = 'CartPole-v1'
lr, epoch, batch_size = 1e-3, 10, 64
num_training_envs, num_test_envs = 10, 100
gamma, n_step, target_freq = 0.9, 3, 320
buffer_size = 20000
eps_train, eps_test = 0.1, 0.05
epoch_num_steps, collection_step_num_env_steps = 10000, 10
```

Initialize the logger:

```python
logger = ts.utils.TensorboardLogger(SummaryWriter('log/dqn'))
```

Create the environments:

```python
# You can also try SubprocVectorEnv, which will use parallelization
training_envs = ts.env.DummyVectorEnv([lambda: gym.make(task) for _ in range(num_training_envs)])
test_envs = ts.env.DummyVectorEnv([lambda: gym.make(task) for _ in range(num_test_envs)])
```

Create the network, policy, and algorithm:

```python
# Create the network
# Note: You can easily define other networks.
# See https://tianshou.readthedocs.io/en/master/01_tutorials/00_dqn.html#build-the-network
env = gym.make(task, render_mode="human")
assert isinstance(env.action_space, gym.spaces.Discrete)
space_info = SpaceInfo.from_env(env)
state_shape = space_info.observation_info.obs_shape
action_shape = space_info.action_info.action_shape
net = Net(state_shape=state_shape, action_shape=action_shape, hidden_sizes=[128, 128, 128])
optim = AdamOptimizerFactory(lr=lr)

# Create the policy
policy = DiscreteQLearningPolicy(
    model=net,
    action_space=env.action_space,
    eps_training=eps_train,
    eps_inference=eps_test
)

# Create the algorithm with the policy and optimizer factory
algorithm = DQN(
    policy=policy,
    optim=AdamOptimizerFactory(lr=lr),
    gamma=gamma,
    n_step_return_horizon=n_step,
    target_update_freq=target_freq
)
```

Set up the collectors:

```python
training_collector = ts.data.Collector[CollectStats](
  algorithm,
  training_envs,
  ts.data.VectorReplayBuffer(buffer_size, num_training_envs),
  exploration_noise=True,
)
test_collector = ts.data.Collector[CollectStats](
  algorithm,
  test_envs,
  exploration_noise=True,
) 
```

Let's train the model using the algorithm:

```python
result = algorithm.run_training(
  OffPolicyTrainerParams(
    training_collector=training_collector,
    test_collector=test_collector,
    max_epochs=epoch,
    epoch_num_steps=epoch_num_steps,
    collection_step_num_env_steps=collection_step_num_env_steps,
    test_step_num_episodes=num_test_envs,
    batch_size=batch_size,
    update_step_num_gradient_steps_per_sample=1 / collection_step_num_env_steps,
    stop_fn=lambda mean_rewards: mean_rewards >= env.spec.reward_threshold,
    logger=logger,
    test_in_training=True,
  )
)
print(f"Finished training in {result.timing.total_time} seconds")
```

This is how you could manually save/load the trained policy (it's exactly the same as loading a `torch.nn.module`):

```python
torch.save(policy.state_dict(), 'dqn.pth')
policy.load_state_dict(torch.load('dqn.pth'))
```

Now let's watch the agent with 35 FPS:

```python
collector = ts.data.Collector(policy, env, exploration_noise=True)
collector.collect(n_episode=1, render=1 / 35)
```

Inspect the data saved in TensorBoard:

```bash
$ tensorboard --logdir log/dqn
```

Please read the [documentation](https://tianshou.readthedocs.io) for advanced usage.

## Contributing

Tianshou is still under development.
Further algorithms and features are continuously being added, and we always welcome contributions to help make Tianshou better.
If you would like to contribute, please check out [this link](CONTRIBUTING.md).

## Citing Tianshou

If you find Tianshou useful, please cite it in your publications.

```latex
@article{tianshou,
  author  = {Jiayi Weng and Huayu Chen and Dong Yan and Kaichao You and Alexis Duburcq and Minghao Zhang and Yi Su and Hang Su and Jun Zhu},
  title   = {Tianshou: A Highly Modularized Deep Reinforcement Learning Library},
  journal = {Journal of Machine Learning Research},
  year    = {2022},
  volume  = {23},
  number  = {267},
  pages   = {1--6},
  url     = {http://jmlr.org/papers/v23/21-1127.html}
}
```

## Acknowledgments

Tianshou is supported by [appliedAI Institute for Europe](https://www.appliedai-institute.de/en/),
a non-profit organization committed to providing long-term support and development.

Tianshou was previously a reinforcement learning platform based on TensorFlow. You can check out the branch [`priv`](https://github.com/thu-ml/tianshou/tree/priv) for more detail. Many thanks to [Haosheng Zou](https://github.com/HaoshengZou)'s pioneering work for Tianshou before version 0.1.1.

We would like to thank [TSAIL](http://ml.cs.tsinghua.edu.cn/) and [Institute for Artificial Intelligence, Tsinghua University](http://ml.cs.tsinghua.edu.cn/thuai/) for providing such an excellent AI research platform.

---

### Overview (`examples/atari/README.md`)

# Atari Environment

## EnvPool

We highly recommend using envpool to run the following experiments. To install, in a linux machine, type:

```bash
pip install envpool
```

After that, `atari_wrapper` will automatically switch to envpool's Atari env. EnvPool's implementation is much faster (
about 2\~3x faster for pure execution speed, 1.5x for overall RL training pipeline) than python vectorized env
implementation, and it's behavior is consistent to that approach (OpenAI wrapper), which will describe below.

For more information, please refer to
EnvPool's [GitHub](https://github.com/sail-sg/envpool/), [Docs](https://envpool.readthedocs.io/en/latest/api/atari.html),
and [3rd-party report](https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/#solving-pong-in-5-minutes-with-ppo--envpool).

## ALE-py

The sample speed is \~3000 env step per second (\~12000 Atari frame per second in fact since we use frame_stack=4) under
the normal mode (use a CNN policy and a collector, also storing data into the buffer).

The env wrapper is a crucial thing. Without wrappers, the agent cannot perform well enough on Atari games. Many existing
RL codebases use [OpenAI wrapper](https://github.com/openai/baselines/blob/master/baselines/common/atari_wrappers.py),
but it is not the original DeepMind version ([related issue](https://github.com/openai/baselines/issues/240)). Dopamine
has a different [wrapper](https://github.com/google/dopamine/blob/master/dopamine/discrete_domains/atari_lib.py) but
unfortunately it cannot work very well in our codebase.

# DQN (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                          | parameters                                                                      | time cost           |
|-----------------------------|-------------|---------------------------------------|---------------------------------------------------------------------------------|---------------------|
| PongNoFrameskip-v4          | 20          |          | `python3 atari_dqn.py --task "PongNoFrameskip-v4" --batch_size 64`              | ~30 min (~15 epoch) |
| BreakoutNoFrameskip-v4      | 316         |      | `python3 atari_dqn.py --task "BreakoutNoFrameskip-v4" --num_test_envs 100`      | 3~4h (100 epoch)    |
| EnduroNoFrameskip-v4        | 670         |        | `python3 atari_dqn.py --task "EnduroNoFrameskip-v4 " --num_test_envs 100`       | 3~4h (100 epoch)    |
| QbertNoFrameskip-v4         | 7307        |         | `python3 atari_dqn.py --task "QbertNoFrameskip-v4" --num_test_envs 100`         | 3~4h (100 epoch)    |
| MsPacmanNoFrameskip-v4      | 2107        |      | `python3 atari_dqn.py --task "MsPacmanNoFrameskip-v4" --num_test_envs 100`      | 3~4h (100 epoch)    |
| SeaquestNoFrameskip-v4      | 2088        |      | `python3 atari_dqn.py --task "SeaquestNoFrameskip-v4" --num_test_envs 100`      | 3~4h (100 epoch)    |
| SpaceInvadersNoFrameskip-v4 | 812.2       |  | `python3 atari_dqn.py --task "SpaceInvadersNoFrameskip-v4" --num_test_envs 100` | 3~4h (100 epoch)    |

Note: The `eps_train_final` and `eps_test` in the original DQN paper is 0.1 and 0.01,
but [some works](https://github.com/google/dopamine/tree/master/baselines) found that smaller eps helps improve the
performance. Also, a large batchsize (say 64 instead of 32) will help faster convergence but will slow down the training
speed.

We haven't tuned this result to the best, so have fun with playing these hyperparameters!

# C51 (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                          | parameters                                                         |
|-----------------------------|-------------|---------------------------------------|--------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20          |          | `python3 atari_c51.py --task "PongNoFrameskip-v4" --batch_size 64` |
| BreakoutNoFrameskip-v4      | 536.6       |      | `python3 atari_c51.py --task "BreakoutNoFrameskip-v4" --n-step 1`  |
| EnduroNoFrameskip-v4        | 1032        |        | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " `             |
| QbertNoFrameskip-v4         | 16245       |         | `python3 atari_c51.py --task "QbertNoFrameskip-v4"`                |
| MsPacmanNoFrameskip-v4      | 3133        |      | `python3 atari_c51.py --task "MsPacmanNoFrameskip-v4"`             |
| SeaquestNoFrameskip-v4      | 6226        |      | `python3 atari_c51.py --task "SeaquestNoFrameskip-v4"`             |
| SpaceInvadersNoFrameskip-v4 | 988.5       |  | `python3 atari_c51.py --task "SpaceInvadersNoFrameskip-v4"`        |

Note: The selection of `n_step` is based on Figure 6 in the [Rainbow](https://arxiv.org/abs/1710.02298) paper.

# QRDQN (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                            | parameters                                                           |
|-----------------------------|-------------|-----------------------------------------|----------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20          |          | `python3 atari_qrdqn.py --task "PongNoFrameskip-v4" --batch_size 64` |
| BreakoutNoFrameskip-v4      | 409.2       |      | `python3 atari_qrdqn.py --task "BreakoutNoFrameskip-v4" --n-step 1`  |
| EnduroNoFrameskip-v4        | 1055.9      |        | `python3 atari_qrdqn.py --task "EnduroNoFrameskip-v4"`               |
| QbertNoFrameskip-v4         | 14990       |         | `python3 atari_qrdqn.py --task "QbertNoFrameskip-v4"`                |
| MsPacmanNoFrameskip-v4      | 2886        |      | `python3 atari_qrdqn.py --task "MsPacmanNoFrameskip-v4"`             |
| SeaquestNoFrameskip-v4      | 5676        |      | `python3 atari_qrdqn.py --task "SeaquestNoFrameskip-v4"`             |
| SpaceInvadersNoFrameskip-v4 | 938         |  | `python3 atari_qrdqn.py --task "SpaceInvadersNoFrameskip-v4"`        |

# IQN (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                           | parameters                                                         |
|-----------------------------|-------------|----------------------------------------|--------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20.3        |           | `python3 atari_iqn.py --task "PongNoFrameskip-v4" --batch_size 64` |
| BreakoutNoFrameskip-v4      | 496.7       |       | `python3 atari_iqn.py --task "BreakoutNoFrameskip-v4" --n-step 1`  |
| EnduroNoFrameskip-v4        | 1545        |         | `python3 atari_iqn.py --task "EnduroNoFrameskip-v4"`               |
| QbertNoFrameskip-v4         | 15342.5     |          | `python3 atari_iqn.py --task "QbertNoFrameskip-v4"`                |
| MsPacmanNoFrameskip-v4      | 2915        |       | `python3 atari_iqn.py --task "MsPacmanNoFrameskip-v4"`             |
| SeaquestNoFrameskip-v4      | 4874        |       | `python3 atari_iqn.py --task "SeaquestNoFrameskip-v4"`             |
| SpaceInvadersNoFrameskip-v4 | 1498.5      |  | `python3 atari_iqn.py --task "SpaceInvadersNoFrameskip-v4"`        |

# FQF (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                           | parameters                                                         |
|-----------------------------|-------------|----------------------------------------|--------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20.7        |           | `python3 atari_fqf.py --task "PongNoFrameskip-v4" --batch_size 64` |
| BreakoutNoFrameskip-v4      | 517.3       |       | `python3 atari_fqf.py --task "BreakoutNoFrameskip-v4" --n-step 1`  |
| EnduroNoFrameskip-v4        | 2240.5      |         | `python3 atari_fqf.py --task "EnduroNoFrameskip-v4"`               |
| QbertNoFrameskip-v4         | 16172.5     |          | `python3 atari_fqf.py --task "QbertNoFrameskip-v4"`                |
| MsPacmanNoFrameskip-v4      | 2429        |       | `python3 atari_fqf.py --task "MsPacmanNoFrameskip-v4"`             |
| SeaquestNoFrameskip-v4      | 10775       |       | `python3 atari_fqf.py --task "SeaquestNoFrameskip-v4"`             |
| SpaceInvadersNoFrameskip-v4 | 2482        |  | `python3 atari_fqf.py --task "SpaceInvadersNoFrameskip-v4"`        |

# Rainbow (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                               | parameters                                                             |
|-----------------------------|-------------|--------------------------------------------|------------------------------------------------------------------------|
| PongNoFrameskip-v4          | 21          |           | `python3 atari_rainbow.py --task "PongNoFrameskip-v4" --batch_size 64` |
| BreakoutNoFrameskip-v4      | 684.6       |       | `python3 atari_rainbow.py --task "BreakoutNoFrameskip-v4" --n-step 1`  |
| EnduroNoFrameskip-v4        | 1625.9      |         | `python3 atari_rainbow.py --task "EnduroNoFrameskip-v4"`               |
| QbertNoFrameskip-v4         | 16192.5     |          | `python3 atari_rainbow.py --task "QbertNoFrameskip-v4"`                |
| MsPacmanNoFrameskip-v4      | 3101        |       | `python3 atari_rainbow.py --task "MsPacmanNoFrameskip-v4"`             |
| SeaquestNoFrameskip-v4      | 2126        |       | `python3 atari_rainbow.py --task "SeaquestNoFrameskip-v4"`             |
| SpaceInvadersNoFrameskip-v4 | 1794.5      |  | `python3 atari_rainbow.py --task "SpaceInvadersNoFrameskip-v4"`        |

# PPO (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                           | parameters                                                       |
|-----------------------------|-------------|----------------------------------------|------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20.2        |           | `python3 atari_ppo.py --task "PongNoFrameskip-v4"`               |
| BreakoutNoFrameskip-v4      | 441.8       |       | `python3 atari_ppo.py --task "BreakoutNoFrameskip-v4"`           |
| EnduroNoFrameskip-v4        | 1245.4      |         | `python3 atari_ppo.py --task "EnduroNoFrameskip-v4"`             |
| QbertNoFrameskip-v4         | 17395       |          | `python3 atari_ppo.py --task "QbertNoFrameskip-v4"`              |
| MsPacmanNoFrameskip-v4      | 2098        |       | `python3 atari_ppo.py --task "MsPacmanNoFrameskip-v4"`           |
| SeaquestNoFrameskip-v4      | 882         |       | `python3 atari_ppo.py --task "SeaquestNoFrameskip-v4" --lr 1e-4` |
| SpaceInvadersNoFrameskip-v4 | 1340.5      |  | `python3 atari_ppo.py --task "SpaceInvadersNoFrameskip-v4"`      |

# SAC (single run)

One epoch here is equal to 100,000 env step, 100 epochs stand for 10M.

| task                        | best reward | reward curve                                    | parameters                                                                                         |
|-----------------------------|-------------|-------------------------------------------------|----------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4          | 20.1        |           | `python3 atari_sac.py --task "PongNoFrameskip-v4"`                                                 |
| BreakoutNoFrameskip-v4      | 211.2       |       | `python3 atari_sac.py --task "BreakoutNoFrameskip-v4" --n-step 1 --actor-lr 1e-4 --critic-lr 1e-4` |
| EnduroNoFrameskip-v4        | 1290.7      |         | `python3 atari_sac.py --task "EnduroNoFrameskip-v4"`                                               |
| QbertNoFrameskip-v4         | 13157.5     |          | `python3 atari_sac.py --task "QbertNoFrameskip-v4"`                                                |
| MsPacmanNoFrameskip-v4      | 3836        |       | `python3 atari_sac.py --task "MsPacmanNoFrameskip-v4"`                                             |
| SeaquestNoFrameskip-v4      | 1772        |       | `python3 atari_sac.py --task "SeaquestNoFrameskip-v4"`                                             |
| SpaceInvadersNoFrameskip-v4 | 649         |  | `python3 atari_sac.py --task "SpaceInvadersNoFrameskip-v4"`                                        |

---

### Overview (`examples/box2d/README.md`)

# Bipedal-Hardcore-SAC

- Our default choice: remove the done flag penalty, will soon converge to \~280 reward within 100 epochs (10M env steps,
  3~4 hours, see the image below)
- If the done penalty is not removed, it converges much slower than before, about 200 epochs (20M env steps) to reach
  the same performance (\~200 reward)



# BipedalWalker-BDQ

- To demonstrate the cpabilities of the BDQ to scale up to big discrete action spaces, we run it on a discretized
  version of the BipedalWalker-v3 environment, where the number of possible actions in each dimension is 25, for a total
  of 25^4 = 390 625 possible actions. A usaual DQN architecture would use 25^4 output neurons for the Q-network, thus
  scaling exponentially with the number of action space dimensions, while the Branching architecture scales linearly and
  uses only 25*4 output neurons.

---

### Overview (`examples/inverse/README.md`)

# Inverse Reinforcement Learning

In inverse reinforcement learning setting, the agent learns a policy from interaction with an environment without reward
and a fixed dataset which is collected with an expert policy.

## Continuous control

Once the dataset is collected, it will not be changed during training. We
use [d4rl](https://github.com/rail-berkeley/d4rl) datasets to train agent for continuous control. You can refer
to [d4rl](https://github.com/rail-berkeley/d4rl) to see how to use d4rl datasets.

We provide implementation of GAIL algorithm for continuous control.

### Train

You can parse d4rl datasets into a `ReplayBuffer` , and set it as the parameter `expert_buffer` of `GAILPolicy`.
`irl_gail.py` is an example of inverse RL using the d4rl dataset.

To train an agent with BCQ algorithm:

```bash
python irl_gail.py --task HalfCheetah-v2 --expert-data-task halfcheetah-expert-v2
```

## GAIL (single run)

| task           | best reward | reward curve                             | parameters                                                                               |
|----------------|-------------|------------------------------------------|------------------------------------------------------------------------------------------|
| HalfCheetah-v2 | 5177.07     |  | `python3 irl_gail.py --task "HalfCheetah-v2" --expert-data-task "halfcheetah-expert-v2"` |
| Hopper-v2      | 1761.44     |       | `python3 irl_gail.py --task "Hopper-v2" --expert-data-task "hopper-expert-v2"`           |
| Walker2d-v2    | 2020.77     |     | `python3 irl_gail.py --task "Walker2d-v2" --expert-data-task "walker2d-expert-v2"`       |

---

### Overview (`examples/modelbased/README.md`)

# PSRL

`NChain-v0`: `python3 psrl.py --task NChain-v0 --epoch_num_steps 10 --rew-mean-prior 0 --rew-std-prior 1`

`FrozenLake-v0`:
`python3 psrl.py --task FrozenLake-v0 --epoch_num_steps 1000 --rew-mean-prior 0 --rew-std-prior 1 --add-done-loop --epoch 20`

`Taxi-v3`: `python3 psrl.py --task Taxi-v3 --epoch_num_steps 1000 --rew-mean-prior 0 --rew-std-prior 2 --epoch 20`

---

### Overview (`examples/mujoco/README.md`)

# Tianshou's Mujoco Benchmark

We benchmarked Tianshou algorithm implementations in 9 out of 13 environments from the MuJoCo Gym task
suite<sup>[[1]](#footnote1)</sup>.

For each supported algorithm and supported mujoco environments, we provide:

- Default hyperparameters used for benchmark and scripts to reproduce the benchmark;
- A comparison of performance (or code level details) with other open source implementations or classic papers;
- Graphs and raw data that can be used for research purposes<sup>[[2]](#footnote2)</sup>;
- Log details obtained during training<sup>[[2]](#footnote2)</sup>;
- Pretrained agents<sup>[[2]](#footnote2)</sup>;
- Some hints on how to tune the algorithm.

Supported algorithms are listed below:

- [Deep Deterministic Policy Gradient (DDPG)](https://arxiv.org/pdf/1509.02971.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/e605bdea942b408126ef4fbc740359773259c9ec)
- [Twin Delayed DDPG (TD3)](https://arxiv.org/pdf/1802.09477.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/e605bdea942b408126ef4fbc740359773259c9ec)
- [Soft Actor-Critic (SAC)](https://arxiv.org/pdf/1812.05905.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/e605bdea942b408126ef4fbc740359773259c9ec)
- [REINFORCE algorithm](https://papers.nips.cc/paper/1999/file/464d828b85b0bed98e80ade0a5c43b0f-Paper.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/e27b5a26f330de446fe15388bf81c3777f024fb9)
- [Natural Policy Gradient](https://proceedings.neurips.cc/paper/2001/file/4b86abe48d358ecf194c56c69108433e-Paper.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/844d7703c313009c4c364edb4018c91de93439ca)
- [Advantage Actor-Critic (A2C)](https://openai.com/blog/baselines-acktr-a2c/), [commit id](https://github.com/thu-ml/tianshou/tree/1730a9008ad6bb67cac3b21347bed33b532b17bc)
- [Proximal Policy Optimization (PPO)](https://arxiv.org/pdf/1707.06347.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/6426a39796db052bafb7cabe85c764db20a722b0)
- [Trust Region Policy Optimization (TRPO)](https://arxiv.org/pdf/1502.05477.pdf), [commit id](https://github.com/thu-ml/tianshou/tree/5057b5c89e6168220272c9c28a15b758a72efc32)
- [Hindsight Experience Replay (HER)](https://arxiv.org/abs/1707.01495)

## EnvPool

We highly recommend using envpool to run the following experiments. To install, in a linux machine, type:

```bash
pip install envpool
```

After that, `make_mujoco_env` will automatically switch to envpool's Mujoco env. EnvPool's implementation is much
faster (about 2\~3x faster for pure execution speed, 1.5x for overall RL training pipeline in average) than python
vectorized env implementation, and it's behavior is consistent to gym's Mujoco env.

For more information, please refer to EnvPool's [GitHub](https://github.com/sail-sg/envpool/)
and [Docs](https://envpool.readthedocs.io/en/latest/api/mujoco.html).

## Usage

Run

```bash
$ python mujoco_sac.py --task Ant-v3
```

Logs is saved in `./log/` and can be monitored with tensorboard.

```bash
$ tensorboard --logdir log
```

You can also reproduce the benchmark (e.g. SAC in Ant-v3) with the example script we provide under `examples/mujoco/`:

```bash
$ ./run_experiments.sh Ant-v3 sac
```

This will start 10 experiments with different seeds.

Now that all the experiments are finished, we can convert all tfevent files into csv files and then try plotting the
results.

```bash
# generate csv
$ ./tools.py --root-dir ./results/Ant-v3/sac
# generate figures
$ ./plotter.py --root-dir ./results/Ant-v3 --shaded-std --legend-pattern "\\w+"
# generate numerical result (support multiple groups: `--root-dir ./` instead of single dir)
$ ./analysis.py --root-dir ./results --norm
```

## Example benchmark

<img src="./benchmark/Ant-v3/offpolicy.png" width="500" height="450">

Other graphs can be found under `examples/mujuco/benchmark/`

For pretrained agents, detailed graphs (single agent, single game) and log details, please refer
to [https://cloud.tsinghua.edu.cn/d/f45fcfc5016043bc8fbc/](https://cloud.tsinghua.edu.cn/d/f45fcfc5016043bc8fbc/).

## Offpolicy algorithms

### Notes

1. In offpolicy algorithms (DDPG, TD3, SAC), the shared hyperparameters are almost the same, and unless otherwise
   stated, hyperparameters are consistent with those used for benchmark in SpinningUp's implementations (e.g. we use
   batchsize 256 in DDPG/TD3/SAC while SpinningUp use 100. Minor difference also lies with `start-timesteps`, data loop
   method `collection_step_num_env_steps`, method to deal with/bootstrap truncated steps because of timelimit and
   unfinished/collecting episodes (contribute to performance improvement), etc.).
2. By comparison to both classic literature and open source implementations (e.g.,
   SpinningUp)<sup>[[1]](#footnote1)</sup><sup>[[2]](#footnote2)</sup>, Tianshou's implementations of DDPG, TD3, and SAC
   are roughly at-parity with or better than the best reported results for these algorithms, so you can definitely use
   Tianshou's benchmark for research purposes.
3. We didn't compare offpolicy algorithms to OpenAI
   baselines [benchmark](https://github.com/openai/baselines/blob/master/benchmarks_mujoco1M.htm), because for now it
   seems that they haven't provided benchmark for offpolicy algorithms, but
   in [SpinningUp docs](https://spinningup.openai.com/en/latest/spinningup/bench.html) they stated that "SpinningUp
   implementations of DDPG, TD3, and SAC are roughly at-parity with the best-reported results for these algorithms", so
   we think lack of comparisons with OpenAI baselines is okay.

### DDPG

|      Environment       |   Tianshou (1M)   | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench.html) | [TD3 paper (DDPG)](https://arxiv.org/abs/1802.09477) | [TD3 paper (OurDDPG)](https://arxiv.org/abs/1802.09477) |
|:----------------------:|:-----------------:|:--------------------------------------------------------------------------------------:|:----------------------------------------------------:|:-------------------------------------------------------:|
|          Ant           |     990.4±4.3     |                                          ~840                                          |                      **1005.3**                      |                          888.8                          |
|      HalfCheetah       | **11718.7±465.6** |                                         ~11000                                         |                        3305.6                        |                         8577.3                          |
|         Hopper         | **2197.0±971.6**  |                                         ~1800                                          |                      **2020.5**                      |                         1860.0                          |
|        Walker2d        |   1400.6±905.0    |                                         ~1950                                          |                        1843.6                        |                       **3098.1**                        |
|        Swimmer         |   **144.1±6.5**   |                                          ~137                                          |                          N                           |                            N                            |
|        Humanoid        |  **177.3±77.6**   |                                           N                                            |                          N                           |                            N                            |
|        Reacher         |   **-3.3±0.3**    |                                           N                                            |                        -6.51                         |                          -4.01                          |
|    InvertedPendulum    |  **1000.0±0.0**   |                                           N                                            |                      **1000.0**                      |                       **1000.0**                        |
| InvertedDoublePendulum |   8364.3±2778.9   |                                           N                                            |                      **9355.5**                      |                         8370.0                          |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup><sup>[[6]](#footnote6)</sup>

### TD3

|      Environment       |   Tianshou (1M)   | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench.html) | [TD3 paper](https://arxiv.org/abs/1802.09477) |
|:----------------------:|:-----------------:|:--------------------------------------------------------------------------------------:|:---------------------------------------------:|
|          Ant           | **5116.4±799.9**  |                                         ~3800                                          |                 4372.4±1000.3                 |
|      HalfCheetah       | **10201.2±772.8** |                                         ~9750                                          |                 9637.0±859.1                  |
|         Hopper         |   3472.2±116.8    |                                         ~2860                                          |               **3564.1±114.7**                |
|        Walker2d        |   3982.4±274.5    |                                         ~4000                                          |               **4682.8±539.6**                |
|        Swimmer         |  **104.2±34.2**   |                                          ~78                                           |                       N                       |
|        Humanoid        | **5189.5±178.5**  |                                           N                                            |                       N                       |
|        Reacher         |   **-2.7±0.2**    |                                           N                                            |                   -3.6±0.6                    |
|    InvertedPendulum    |  **1000.0±0.0**   |                                           N                                            |                **1000.0±0.0**                 |
| InvertedDoublePendulum |  **9349.2±14.3**  |                                           N                                            |                **9337.5±15.0**                |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup><sup>[[6]](#footnote6)</sup>

#### Hints for TD3

1. TD3's learning rate is set to 3e-4 while it is 1e-3 for DDPG/SAC. However, there is NO enough evidence to support our
   choice of such hyperparameters (we simply choose them because SpinningUp do so) and you can try playing with those
   hyperparameters to see if you can improve performance. Do tell us if you can!

### SAC

|      Environment       |   Tianshou (1M)    | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench.html) | [SAC paper](https://arxiv.org/abs/1801.01290) |
|:----------------------:|:------------------:|:--------------------------------------------------------------------------------------:|:---------------------------------------------:|
|          Ant           |  **5850.2±475.7**  |                                         ~3980                                          |                     ~3720                     |
|      HalfCheetah       | **12138.8±1049.3** |                                         ~11520                                         |                    ~10400                     |
|         Hopper         |  **3542.2±51.5**   |                                         ~3150                                          |                     ~3370                     |
|        Walker2d        |  **5007.0±251.5**  |                                         ~4250                                          |                     ~3740                     |
|        Swimmer         |    **44.4±0.5**    |                                         ~41.7                                          |                       N                       |
|        Humanoid        |  **5488.5±81.2**   |                                           N                                            |                     ~5200                     |
|        Reacher         |    **-2.6±0.2**    |                                           N                                            |                       N                       |
|    InvertedPendulum    |   **1000.0±0.0**   |                                           N                                            |                       N                       |
| InvertedDoublePendulum |   **9359.5±0.4**   |                                           N                                            |                       N                       |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

#### Hints for SAC

1. SAC's start-timesteps is set to 10000 by default while it is 25000 is DDPG/TD3. However, there is NO enough evidence
   to support our choice of such hyperparameters (we simply choose them because SpinningUp do so) and you can try
   playing with those hyperparameters to see if you can improve performance. Do tell us if you can!
2. DO NOT share the same network with two critic networks.
3. The sigma (of the Gaussian policy) should be conditioned on input.
4. The deterministic evaluation helps a lot :)

## Onpolicy Algorithms

### Notes

1. In A2C and PPO, unless otherwise stated, most hyperparameters are consistent with those used for benchmark
   in [ikostrikov/pytorch-a2c-ppo-acktr-gail](https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail).
2. Gernally speaking, by comparison to both classic literature and open source implementations (e.g., OPENAI
   Baselines)<sup>[[1]](#footnote1)</sup><sup>[[2]](#footnote2)</sup>, Tianshou's implementations of REINFORCE, A2C, PPO
   are better than the best reported results for these algorithms, so you can definitely use Tianshou's benchmark for
   research purposes.

### REINFORCE

|      Environment       |  Tianshou (10M)   |
|:----------------------:|:-----------------:|
|          Ant           | **1108.1±323.1**  |
|      HalfCheetah       | **1138.8±104.7**  |
|         Hopper         |  **416.0±104.7**  |
|        Walker2d        |  **440.9±148.2**  |
|        Swimmer         |   **35.6±2.6**    |
|        Humanoid        |  **464.3±58.4**   |
|        Reacher         |   **-5.5±0.2**    |
|    InvertedPendulum    |  **1000.0±0.0**   |
| InvertedDoublePendulum | **7726.2±1287.3** |

|      Environment       |   Tianshou (3M)   | [Spinning Up (VPG PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench_vpg.html)<sup>[[7]](#footnote7)</sup> |
|:----------------------:|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------:|
|          Ant           | **474.9+-133.5**  |                                                             ~5                                                             |
|      HalfCheetah       |  **884.0+-41.0**  |                                                            ~600                                                            |
|         Hopper         |   395.8+-64.5\*   |                                                          **~800**                                                          |
|        Walker2d        |    412.0+-52.4    |                                                          **~460**                                                          |
|        Swimmer         |     35.3+-1.4     |                                                          **~51**                                                           |
|        Humanoid        |  **438.2+-47.8**  |                                                             N                                                              |
|        Reacher         |  **-10.5+-0.7**   |                                                             N                                                              |
|    InvertedPendulum    |  **999.2+-2.4**   |                                                             N                                                              |
| InvertedDoublePendulum | **1059.7+-307.7** |                                                             N                                                              |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

### Hints for REINFORCE

1. Following [Andrychowicz, Marcin, et al](https://arxiv.org/abs/2006.05990), we downscale last layer of policy network
   by a factor of 0.01 after orthogonal initialization.
2. We choose "tanh" function to squash sampled action from range (-inf, inf) to (-1, 1) rather than usually used
   clipping method (As in StableBaselines3). We did full scale ablation studies and results show that tanh squashing
   performs a tiny little bit better than clipping overall, and is much better than no action bounding. However, "clip"
   method is still a very good method, considering its simplicity.
3. We use global observation normalization and global rew-to-go (value) normalization by default. Both are crucial to
   good performance of REINFORCE algorithm. Since we minus mean when doing rew-to-go normalization, you can treat global
   mean of rew-to-go as a naive version of "baseline".
4. Since we do not have a value estimator, we use global rew-to-go mean to bootstrap truncated steps because of
   timelimit and unfinished collecting, while most other implementations use 0. We feel this would help because mean is
   more likely a better estimate than 0 (no ablation study has been done).
5. We have done full scale ablation study on learning rate and lr decay strategy. We experiment with lr of 3e-4, 5e-4,
   1e-3, each have 2 options: no lr decay or linear decay to 0. Experiments show that 3e-4 learning rate will cause
   slowly learning and make agent step in local optima easily for certain environments like InvertedDoublePendulum, Ant,
   HalfCheetah, and 1e-3 lr helps a lot. However, after training agents with lr 1e-3 for 5M steps or so, agents in
   certain environments like InvertedPendulum will become unstable. Conclusion is that we should start with a large
   learning rate and linearly decay it, but for a small initial learning rate or if you only train agents for limited
   timesteps, DO NOT decay it.
6. We didn't tune `step-per-collect` option and `training-num` option. Default values are finetuned with PPO algorithm
   so we assume they are also good for REINFORCE. You can play with them if you want, but remember that `buffer-size`
   should always be larger than `step-per-collect`, and if `step-per-collect` is too small and `training-num` too large,
   episodes will be truncated and bootstrapped very often, which will harm performance. If `training-num` is too small (
   e.g., less than 8), speed will go down.
7. Sigma of action is not fixed (normally seen in other implementation) or conditioned on observation, but is an
   independent parameter which can be updated by gradient descent. We choose this setting because it works well in PPO,
   and is recommended by [Andrychowicz, Marcin, et al](https://arxiv.org/abs/2006.05990). See Fig. 23.

### A2C

|      Environment       |   Tianshou (3M)    | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench_vpg.html) |
|:----------------------:|:------------------:|:------------------------------------------------------------------------------------------:|
|          Ant           | **5236.8+-236.7**  |                                             ~5                                             |
|      HalfCheetah       | **2377.3+-1363.7** |                                            ~600                                            |
|         Hopper         | **1608.6+-529.5**  |                                            ~800                                            |
|        Walker2d        | **1805.4+-1055.9** |                                            ~460                                            |
|        Swimmer         |     40.2+-1.8      |                                          **~51**                                           |
|        Humanoid        | **5316.6+-554.8**  |                                             N                                              |
|        Reacher         |   **-5.2+-0.5**    |                                             N                                              |
|    InvertedPendulum    |  **1000.0+-0.0**   |                                             N                                              |
| InvertedDoublePendulum |  **9351.3+-12.8**  |                                             N                                              |

|      Environment       |   Tianshou (1M)    | [PPO paper](https://arxiv.org/abs/1707.06347) A2C | [PPO paper](https://arxiv.org/abs/1707.06347) A2C + Trust Region |
|:----------------------:|:------------------:|:-------------------------------------------------:|:----------------------------------------------------------------:|
|          Ant           | **3485.4+-433.1**  |                         N                         |                                N                                 |
|      HalfCheetah       | **1829.9+-1068.3** |                       ~1000                       |                               ~930                               |
|         Hopper         | **1253.2+-458.0**  |                       ~900                        |                              ~1220                               |
|        Walker2d        | **1091.6+-709.2**  |                       ~850                        |                               ~700                               |
|        Swimmer         |   **36.6+-2.1**    |                        ~31                        |                             **~36**                              |
|        Humanoid        | **1726.0+-1070.1** |                         N                         |                                N                                 |
|        Reacher         |   **-6.7+-2.3**    |                       ~-24                        |                               ~-27                               |
|    InvertedPendulum    |  **1000.0+-0.0**   |                     **~1000**                     |                            **~1000**                             |
| InvertedDoublePendulum | **9257.7+-277.4**  |                       ~7100                       |                              ~8100                               |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

#### Hints for A2C

1. We choose `clip` action method in A2C instead of `tanh` option as used in REINFORCE simply to be consistent with
   original implementation. `tanh` may be better or equally well but we didn't have a try.
2. (Initial) learning rate, lr_decay, `step-per-collect` and `training-num` affect the performance of A2C to a great
   extend. These 4 hyperparameters also affect each other and should be tuned together. We have done full scale ablation
   studies on these 4 hyperparameters (more than 800 agents have been trained). Below are our findings.
3. `step-per-collect` / `training-num` are equal to `bootstrap-lenghth`, which is the max length of an "episode" used in
   GAE estimator and 80/16=5 in default settings. When `bootstrap-lenghth` is small, (maybe) because GAE can look
   forward at most 5 steps and use bootstrap strategy very often, the critic is less well-trained leading the actor to a
   not very high score. However, if we increase `step-per-collect` to increase `bootstrap-lenghth` (e.g. 256/16=16),
   actor/critic will be updated less often, resulting in low sample efficiency and slow training process. To conclude,
   If you don't restrict env timesteps, you can try using larger `bootstrap-lenghth` and train with more steps to get a
   better converged score. Train slower, achieve higher.
4. The learning rate 7e-4 with decay strategy is appropriate for `step-per-collect=80` and `training-num=16`. But if you
   use a larger `step-per-collect`(e.g. 256 - 2048), 7e-4 is a little bit small for `lr` because each update will have
   more data, less noise and thus smaller deviation in this case. So it is more appropriate to use a higher learning
   rate (e.g. 1e-3) to boost performance in this setting. If plotting results arise fast in early stages and become
   unstable later, consider lr decay first before decreasing lr.
5. `max-grad-norm` didn't really help in our experiments. We simply keep it for consistency with other open-source
   implementations (e.g. SB3).
6. Although original paper of A3C uses RMSprop optimizer, we found that Adam with the same learning rate worked equally
   well. We use RMSprop anyway. Again, for consistency.
7. We noticed that the implementation of A2C in SB3 sets `gae-lambda` to 1 by default for no reason, and our experiments
   showed better results overall when `gae-lambda` was set to 0.95.
8. We found out that `step-per-collect=256` and `training-num=8` are also good settings. You can have a try.

### PPO

|      Environment       |   Tianshou (1M)    | [ikostrikov/pytorch-a2c-ppo-acktr-gail](https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail) | [PPO paper](https://arxiv.org/pdf/1707.06347.pdf) | [OpenAI Baselines](https://github.com/openai/baselines/blob/master/benchmarks_mujoco1M.htm) | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench_ppo.html) |
|:----------------------:|:------------------:|:-------------------------------------------------------------------------------------------------:|:-------------------------------------------------:|:-------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------:|
|          Ant           | **3258.4+-1079.3** |                                                 N                                                 |                         N                         |                                              N                                              |                                            ~650                                            |
|      HalfCheetah       | **5783.9+-1244.0** |                                               ~3120                                               |                       ~1800                       |                                            ~1700                                            |                                           ~1670                                            |
|         Hopper         | **2609.3+-700.8**  |                                               ~2300                                               |                       ~2330                       |                                            ~2400                                            |                                           ~1850                                            |
|        Walker2d        |   3588.5+-756.6    |                                             **~4000**                                             |                       ~3460                       |                                            ~3510                                            |                                           ~1230                                            |
|        Swimmer         |     66.7+-99.1     |                                                 N                                                 |                       ~108                        |                                            ~111                                             |                                          **~120**                                          |
|        Humanoid        |  **787.1+-193.5**  |                                                 N                                                 |                         N                         |                                              N                                              |                                             N                                              |
|        Reacher         |   **-4.1+-0.3**    |                                                ~-5                                                |                        ~-7                        |                                             ~-6                                             |                                             N                                              |
|    InvertedPendulum    |  **1000.0+-0.0**   |                                                 N                                                 |                     **~1000**                     |                                            ~940                                             |                                             N                                              |
| InvertedDoublePendulum | **9231.3+-270.4**  |                                                 N                                                 |                       ~8000                       |                                            ~7350                                            |                                             N                                              |

|      Environment       |   Tianshou (3M)    | [Spinning Up (PyTorch)](https://spinningup.openai.com/en/latest/spinningup/bench_ppo.html) |
|:----------------------:|:------------------:|:------------------------------------------------------------------------------------------:|
|          Ant           | **4079.3+-880.2**  |                                           ~3000                                            |
|      HalfCheetah       | **7337.4+-1508.2** |                                           ~3130                                            |
|         Hopper         | **3127.7+-413.0**  |                                           ~2460                                            |
|        Walker2d        | **4895.6+-704.3**  |                                           ~2600                                            |
|        Swimmer         |     81.4+-96.0     |                                          **~120**                                          |
|        Humanoid        | **1359.7+-572.7**  |                                             N                                              |
|        Reacher         |   **-3.7+-0.3**    |                                             N                                              |
|    InvertedPendulum    |  **1000.0+-0.0**   |                                             N                                              |
| InvertedDoublePendulum | **9231.3+-270.4**  |                                             N                                              |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

#### Hints for PPO

1. Following [Andrychowicz, Marcin, et al](https://arxiv.org/abs/2006.05990) Sec 3.5, we use "recompute advantage"
   strategy, which contributes a lot to our SOTA benchmark. However, I personally don't quite agree with their
   explanation about why "recompute advantage" helps. They stated that it's because old strategy "makes it impossible to
   compute advantages as the temporal structure is broken", but PPO's update equation is designed to learn from
   slightly-outdated advantages. I think the only reason "recompute advantage" works is that it update the critic
   several times rather than just one time per update, which leads to a better value function estimation.
2. We have done full scale ablation studies of PPO algorithm's hyperparameters. Here are our findings: In Mujoco
   settings, `value-clip` and `norm-adv` may help a litte bit in some games (e.g. `norm-adv` helps stabilize training in
   InvertedPendulum-v2), but they make no difference to overall performance. So in our benchmark we do not use such
   tricks. We validate that setting `ent-coef` to 0.0 rather than 0.01 will increase overall performance in mujoco
   environments. `max-grad-norm` still offers no help for PPO algorithm, but we still keep it for consistency.
3. [Andrychowicz, Marcin, et al](https://arxiv.org/abs/2006.05990)'s work indicates that using `gae-lambda` 0.9 and
   changing policy network's width based on which game you play (e.g. use [16, 16] `hidden-sizes` for `actor` network in
   HalfCheetah and [256, 256] for Ant) may help boost performance. Our ablation studies say otherwise: both options may
   lead to equal or lower performance overall in our experiments. We are not confident about this claim because we
   didn't change learning rate and other maybe-correlated factors in our experiments. So if you want, you can still have
   a try.
4. `batch-size` 128 and 64 (default) work equally well. Changing `training-num` alone slightly (maybe in range [8, 128])
   won't affect performance. For bound action method, both `clip` and `tanh` work quite well.
5. In OPENAI implementations of PPO, they multiply value loss with a factor of 0.5 for no good reason (see
   this [issue](https://github.com/openai/baselines/issues/445#issuecomment-777988738)). We do not do so and therefore
   make our `vf-coef` 0.25 (half of standard 0.5). However, since value loss is only used to optimize `critic` network,
   setting different `vf-coef` should in theory make no difference if using Adam optimizer.

### TRPO

|      Environment       |   Tianshou (1M)   | [ACKTR paper](https://arxiv.org/pdf/1708.05144.pdf) | [PPO paper](https://arxiv.org/pdf/1707.06347.pdf) | [OpenAI Baselines](https://github.com/openai/baselines/blob/master/benchmarks_mujoco1M.htm) | [Spinning Up (Tensorflow)](https://spinningup.openai.com/en/latest/spinningup/bench.html) |
|:----------------------:|:-----------------:|:---------------------------------------------------:|:-------------------------------------------------:|:-------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:|
|          Ant           | **2866.7±707.9**  |                         ~0                          |                         N                         |                                              N                                              |                                           ~150                                            |
|      HalfCheetah       | **4471.2±804.9**  |                        ~400                         |                        ~0                         |                                            ~1350                                            |                                           ~850                                            |
|         Hopper         |   2046.0±1037.9   |                        ~1400                        |                       ~2100                       |                                          **~2200**                                          |                                           ~1200                                           |
|        Walker2d        | **3826.7±782.7**  |                        ~550                         |                       ~1100                       |                                            ~2350                                            |                                           ~600                                            |
|        Swimmer         |     40.9±19.6     |                         ~40                         |                     **~121**                      |                                             ~95                                             |                                            ~85                                            |
|        Humanoid        |  **810.1±126.1**  |                          N                          |                         N                         |                                              N                                              |                                             N                                             |
|        Reacher         |   **-5.1±0.8**    |                         -8                          |                       ~-115                       |                                           **~-5**                                           |                                             N                                             |
|    InvertedPendulum    |  **1000.0±0.0**   |                      **~1000**                      |                     **~1000**                     |                                            ~910                                             |                                             N                                             |
| InvertedDoublePendulum | **8435.2±1073.3** |                        ~800                         |                       ~200                        |                                            ~7000                                            |                                             N                                             |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

#### Hints for TRPO

1. We have tried `step-per-collect` in (80, 1024, 2048, 4096), and `training-num` in (4, 16, 32, 64), and found out 1024
   for `step-per-collect` (same as OpenAI Baselines) and smaller `training-num` (below 16) are good choices. Set
   `training-num` to 4 is actually better but we still use 16 considering the boost of training speed.
2. Advantage normalization is a standard trick in TRPO, but we found it of minor help, just like in PPO.
3. Larger `optim-critic-iters` (than 5, as used in OpenAI Baselines) helps in most environments. Smaller lr and lr_decay
   strategy also help a tiny little bit for performance.
4. `gae-lambda` 0.98 and 0.95 work equally well.
5. We use GAE returns (GAE advantage + value) as the target of critic network when updating, while people usually tend
   to use reward to go (lambda = 0.) as target. We found that they work equally well although using GAE returns is a
   little bit inaccurate (biased) by math.
6. Empirically, Swimmer-v3 usually requires larger bootstrap lengths and learning rate. Humanoid-v3 and
   InvertedPendulum-v2, however, are on the opposite.
7. In contrast, with the statement made in TRPO paper, we found that backtracking in line search is rarely used at least
   in Mujoco settings, which is actually unimportant. This makes TRPO algorithm actually the same as TNPG algorithm (
   described in this [paper](http://proceedings.mlr.press/v48/duan16.html)). This also explains why TNPG and TRPO's
   plotting results look so similar in that paper.
8. "recompute advantage" is helpful in PPO but doesn't help in TRPO.

### NPG

|      Environment       |  Tianshou (1M)   |
|:----------------------:|:----------------:|
|          Ant           | **2358.0±517.5** |
|      HalfCheetah       | **3485.2±716.6** |
|         Hopper         | **1915.2±550.5** |
|        Walker2d        | **2503.2±963.3** |
|        Swimmer         |   **31.5±8.0**   |
|        Humanoid        |  **765.1±91.3**  |
|        Reacher         |   **-4.5±0.5**   |
|    InvertedPendulum    |  **1000.0±0.0**  |
| InvertedDoublePendulum | **9243.2±276.0** |

\* details<sup>[[4]](#footnote4)</sup><sup>[[5]](#footnote5)</sup>

#### Hints for NPG

1. All shared hyperparameters are exactly the same as TRPO, regarding how similar these two algorithms are.
2. We found different games in Mujoco may require quite different `actor-step-size`: Reacher/Swimmer are insensitive to
   step-size in range (0.1~1.0), while InvertedDoublePendulum / InvertedPendulum / Humanoid are quite sensitive to step
   size, and even 0.1 is too large. Other games may require `actor-step-size` in range (0.1~0.4), but aren't that
   sensitive in general.

## Others

### HER

| Environment | DDPG without HER | DDPG with HER  |
|:-----------:|:----------------:|:--------------:|
| FetchReach  |    -49.9±0.2.    | **-17.6±21.7** |

#### Hints for HER

1. The HER technique is proposed for solving task-based environments, so it cannot be compared with non-task-based
   mujoco benchmarks. The environment used in this evaluation is `FetchReach-v3` which requires an
   extra [installation](https://github.com/Farama-Foundation/Gymnasium-Robotics).
2. Simple hyperparameters optimizations are done for both settings, DDPG with and without HER. However, since _DDPG
   without HER_ failed in every experiment, the best hyperparameters for _DDPG with HER_ are used in the evaluation of
   both settings.
3. The scores are the mean reward ± 1 standard deviation of 16 seeds. The minimum reward for `FetchReach-v3` is -50
   which we can imply that _DDPG without HER_ performs as good as a random policy. _DDPG with HER_ although has a better
   mean reward, the standard deviation is quite high. This is because in this setting, the agent will either fail
   completely (-50 reward) or successfully learn the task (close to 0 reward). This means that the agent successfully
   learned in about 70% of the 16 seeds.

## Note

<a name="footnote1">[1]</a> Supported environments include HalfCheetah-v3, Hopper-v3, Swimmer-v3, Walker2d-v3, Ant-v3,
Humanoid-v3, Reacher-v2, InvertedPendulum-v2 and InvertedDoublePendulum-v2. Pusher, Thrower, Striker and HumanoidStandup
are not supported because they are not commonly seen in literatures.

<a name="footnote2">[2]</a> Pretrained agents, detailed graphs (single agent, single game) and log details can all be
found at [Google Drive](https://drive.google.com/drive/folders/1IycImzTmWcyEeD38viea5JHoboC4zmNP?usp=share_link).

<a name="footnote3">[3]</a> We used the latest version of all mujoco environments in gym (0.17.3 with mujoco==2.0.2.13),
but it's not often the case with other benchmarks. Please check for details yourself in the original paper. (Different
version's outcomes are usually similar, though)

<a name="footnote4">[4]</a> ~ means the number is approximated from the graph because accurate numbers is not provided
in the paper. N means graphs not provided.

<a name="footnote5">[5]</a> Reward metric: The meaning of the table value is the max average return over 10 trails (
different seeds) ± a single standard deviation over trails. Each trial is averaged on another 10 test seeds. Only the
first 1M steps data will be considered, if not otherwise stated. The shaded region on the graph also represents a single
standard deviation. It is the same as [TD3 evaluation method](https://github.com/sfujim/TD3/issues/34).

<a name="footnote6">[6]</a> In TD3 paper, shaded region represents only half of standard deviation.

<a name="footnote7">[7]</a> Comparing Tianshou's REINFORCE algorithm with SpinningUp's VPG is quite unfair because
SpinningUp's VPG uses a generative advantage estimator (GAE) which requires a dnn value predictor (critic network),
which makes so called "VPG" more like A2C (advantage actor critic) algorithm. Even so, you can see that we are roughly
at-parity with each other even if tianshou's REINFORCE do not use a critic or GAE.

---

### Overview (`examples/offline/README.md`)

# Offline

In offline reinforcement learning setting, the agent learns a policy from a fixed dataset which is collected once with
any policy. And the agent does not interact with environment anymore.

## Continuous control

Once the dataset is collected, it will not be changed during training. We
use [d4rl](https://github.com/rail-berkeley/d4rl) datasets to train offline agent for continuous control. You can refer
to [d4rl](https://github.com/rail-berkeley/d4rl) to see how to use d4rl datasets.

We provide implementation of BCQ and CQL algorithm for continuous control.

### Train

Tianshou provides an `offline_trainer` for offline reinforcement learning. You can parse d4rl datasets into a
`ReplayBuffer` , and set it as the parameter `buffer` of `offline_trainer`.  `d4rl_bcq.py` is an example of offline RL
using the d4rl dataset.

## Results

### IL (Imitation Learning, aka, Behavior Cloning)

| Environment    | Dataset               | IL       | Parameters                                                                          |
|----------------|-----------------------|----------|-------------------------------------------------------------------------------------|
| HalfCheetah-v2 | halfcheetah-expert-v2 | 11355.31 | `python3 d4rl_il.py --task HalfCheetah-v2 --expert-data-task halfcheetah-expert-v2` |
| HalfCheetah-v2 | halfcheetah-medium-v2 | 5098.16  | `python3 d4rl_il.py --task HalfCheetah-v2 --expert-data-task halfcheetah-medium-v2` |

### BCQ

| Environment    | Dataset               | BCQ      | Parameters                                                                           |
|----------------|-----------------------|----------|--------------------------------------------------------------------------------------|
| HalfCheetah-v2 | halfcheetah-expert-v2 | 11509.95 | `python3 d4rl_bcq.py --task HalfCheetah-v2 --expert-data-task halfcheetah-expert-v2` |
| HalfCheetah-v2 | halfcheetah-medium-v2 | 5147.43  | `python3 d4rl_bcq.py --task HalfCheetah-v2 --expert-data-task halfcheetah-medium-v2` |

### CQL

| Environment    | Dataset               | CQL     | Parameters                                                                           |
|----------------|-----------------------|---------|--------------------------------------------------------------------------------------|
| HalfCheetah-v2 | halfcheetah-expert-v2 | 2864.37 | `python3 d4rl_cql.py --task HalfCheetah-v2 --expert-data-task halfcheetah-expert-v2` |
| HalfCheetah-v2 | halfcheetah-medium-v2 | 6505.41 | `python3 d4rl_cql.py --task HalfCheetah-v2 --expert-data-task halfcheetah-medium-v2` |

### TD3+BC

| Environment    | Dataset               | CQL      | Parameters                                                                              |
|----------------|-----------------------|----------|-----------------------------------------------------------------------------------------|
| HalfCheetah-v2 | halfcheetah-expert-v2 | 11788.25 | `python3 d4rl_td3_bc.py --task HalfCheetah-v2 --expert-data-task halfcheetah-expert-v2` |
| HalfCheetah-v2 | halfcheetah-medium-v2 | 5741.13  | `python3 d4rl_td3_bc.py --task HalfCheetah-v2 --expert-data-task halfcheetah-medium-v2` |

#### Observation normalization

Following the original paper, we use observation normalization by default. You can turn it off by setting
`--norm-obs 0`. The difference are small but consistent.

| Dataset              | w/ norm-obs | w/o norm-obs |
|:---------------------|:------------|:-------------|
| halfcheeta-medium-v2 | 5741.13     | 5724.41      |
| halfcheeta-expert-v2 | 11788.25    | 11665.77     |
| walker2d-medium-v2   | 4051.76     | 3985.59      |
| walker2d-expert-v2   | 5068.15     | 5027.75      |

## Discrete control

For discrete control, we currently use ad hoc Atari data generated from a trained QRDQN agent.

### Gather Data

To running CQL algorithm on Atari, you need to do the following things:

- Train an expert, by using the command listed in the QRDQN section of Atari examples:
  `python3 atari_qrdqn.py --task {your_task}`
- Generate buffer with noise:
  `python3 atari_qrdqn.py --task {your_task} --watch --resume-path log/{your_task}/qrdqn/policy.pth --eps-test 0.2 --buffer-size 1000000 --save-buffer-name expert.hdf5` (
  note that 1M Atari buffer cannot be saved as `.pkl` format because it is too large and will cause error);
- Train offline model: `python3 atari_{bcq,cql,crr}.py --task {your_task} --load-buffer-name expert.hdf5`.

### IL

We test our IL implementation on two example tasks (different from author's version, we use v4 instead of v0; one epoch
means 10k gradient step):

| Task                   | Online QRDQN | Behavioral | IL                                | parameters                                                                                                                     |
|------------------------|--------------|------------|-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | 6.8        | 20.0 (epoch 5)                    | `python3 atari_il.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 5`          |
| BreakoutNoFrameskip-v4 | 394.3        | 46.9       | 121.9 (epoch 12, could be higher) | `python3 atari_il.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 12` |

### BCQ

We test our BCQ implementation on two example tasks (different from author's version, we use v4 instead of v0; one epoch
means 10k gradient step):

| Task                   | Online QRDQN | Behavioral | BCQ                              | parameters                                                                                                                      |
|------------------------|--------------|------------|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | 6.8        | 20.1 (epoch 5)                   | `python3 atari_bcq.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 5`          |
| BreakoutNoFrameskip-v4 | 394.3        | 46.9       | 64.6 (epoch 12, could be higher) | `python3 atari_bcq.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 12` |

### CQL

We test our CQL implementation on two example tasks (different from author's version, we use v4 instead of v0; one epoch
means 10k gradient step):

| Task                   | Online QRDQN | Behavioral | CQL              | parameters                                                                                                                                        |
|------------------------|--------------|------------|------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | 6.8        | 20.4 (epoch 5)   | `python3 atari_cql.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 5`                            |
| BreakoutNoFrameskip-v4 | 394.3        | 46.9       | 129.4 (epoch 12) | `python3 atari_cql.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 12 --min-q-weight 50` |

We reduce the size of the offline data to 10% and 1% of the above and get:

Buffer size 100000:

| Task                   | Online QRDQN | Behavioral | CQL             | parameters                                                                                                                                                 |
|------------------------|--------------|------------|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | 5.8        | 21 (epoch 5)    | `python3 atari_cql.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.size_1e5.hdf5 --epoch 5`                            |
| BreakoutNoFrameskip-v4 | 394.3        | 41.4       | 40.8 (epoch 12) | `python3 atari_cql.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.size_1e5.hdf5 --epoch 12 --min-q-weight 20` |

Buffer size 10000:

| Task                   | Online QRDQN | Behavioral | CQL             | parameters                                                                                                                                                 |
|------------------------|--------------|------------|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | nan        | 1.8 (epoch 5)   | `python3 atari_cql.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.size_1e4.hdf5 --epoch 5 --min-q-weight 1`           |
| BreakoutNoFrameskip-v4 | 394.3        | 31.7       | 22.5 (epoch 12) | `python3 atari_cql.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.size_1e4.hdf5 --epoch 12 --min-q-weight 10` |

### CRR

We test our CRR implementation on two example tasks (different from author's version, we use v4 instead of v0; one epoch
means 10k gradient step):

| Task                   | Online QRDQN | Behavioral | CRR             | CRR w/ CQL      | parameters                                                                                                                                        |
|------------------------|--------------|------------|-----------------|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| PongNoFrameskip-v4     | 20.5         | 6.8        | -21 (epoch 5)   | 17.7 (epoch 5)  | `python3 atari_crr.py --task PongNoFrameskip-v4 --load-buffer-name log/PongNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 5`                            |
| BreakoutNoFrameskip-v4 | 394.3        | 46.9       | 23.3 (epoch 12) | 76.9 (epoch 12) | `python3 atari_crr.py --task BreakoutNoFrameskip-v4 --load-buffer-name log/BreakoutNoFrameskip-v4/qrdqn/expert.hdf5 --epoch 12 --min-q-weight 50` |

Note that CRR itself does not work well in Atari tasks but adding CQL loss/regularizer helps.

### RL Unplugged Data

We provide a script to convert the Atari datasets
of [RL Unplugged](https://github.com/deepmind/deepmind-research/tree/master/rl_unplugged) to Tianshou ReplayBuffer.

For example, the following command will download the first shard of the first run of Breakout game to
`~/.rl_unplugged/datasets/Breakout/run_1-00001-of-00100` then convert it to a `tianshou.data.ReplayBuffer` and save it
to `~/.rl_unplugged/buffers/Breakout/run_1-00001-of-00100.hdf5` (use `--dataset-dir` and `--buffer-dir` to change the
default directories):

```bash
python3 convert_rl_unplugged_atari.py --task Breakout --run-id 1 --shard-id 1
```

Then you can use it to train an agent by:

```bash
python3 atari_bcq.py --task BreakoutNoFrameskip-v4 --load-buffer-name ~/.rl_unplugged/datasets/Breakout/run_1-00001-of-00100.hdf5 --buffer-from-rl-unplugged --epoch 12
```

Note:

- Each shard contains about 500k transitions.
- This conversion script depends on Tensorflow.
- It takes about 1 hour to process one shard on my machine. YMMV.

---

### Overview (`examples/vizdoom/README.md`)

# ViZDoom

[ViZDoom](https://github.com/mwydmuch/ViZDoom) is a popular RL env for a famous first-person shooting game Doom. Here we
provide some results and intuitions for this scenario.

## EnvPool

We highly recommend using envpool to run the following experiments. To install, in a linux machine, type:

```bash
pip install envpool
```

After that, `make_vizdoom_env` will automatically switch to envpool's ViZDoom env. EnvPool's implementation is much
faster (about 2\~3x faster for pure execution speed, 1.5x for overall RL training pipeline) than python vectorized env
implementation.

For more information, please refer to EnvPool's [GitHub](https://github.com/sail-sg/envpool/)
and [Docs](https://envpool.readthedocs.io/en/latest/api/vizdoom.html).

## Train

To train an agent:

```bash
python3 vizdoom_c51.py --task {D1_basic|D2_navigation|D3_battle|D4_battle2}
```

D1 (health gathering) should finish training (no death) in less than 500k env step (5 epochs);

D3 can reach 1600+ reward (75+ killcount in 5 minutes);

D4 can reach 700+ reward. Here is the result:

(episode length, the maximum length is 2625 because we use frameskip=4, that is 10500/4=2625)



(episode reward)



To evaluate an agent's performance:

```bash
python3 vizdoom_c51.py --num_test_envs 100 --resume-path policy.pth --watch --task {D1_basic|D3_battle|D4_battle2}
```

To save `.lmp` files for recording:

```bash
python3 vizdoom_c51.py --save-lmp --num_test_envs 100 --resume-path policy.pth --watch --task {D1_basic|D3_battle|D4_battle2}
```

it will store `lmp` file in `lmps/` directory. To watch these `lmp` files (for example, d3 lmp):

```bash
python3 replay.py maps/D3_battle.cfg episode_8_25.lmp
```

We provide two lmp files (d3 best and d4 best) under `results/c51`, you can use the following command to enjoy:

```bash
python3 replay.py maps/D3_battle.cfg results/c51/d3.lmp
python3 replay.py maps/D4_battle2.cfg results/c51/d4.lmp
```

## Maps

See [maps/README.md](maps/README.md)

## Reward

1. living reward is bad
2. combo-action is really important
3. negative reward for health and ammo2 is really helpful for d3/d4
4. only with positive reward for health is really helpful for d1
5. remove MOVE_BACKWARD may converge faster but the final performance may be lower

## Algorithms

The setting is exactly the same as Atari. You can definitely try more algorithms listed in Atari example.

### C51 (single run)

| task          | best reward | reward curve                           | parameters                                      |
|---------------|-------------|----------------------------------------|-------------------------------------------------|
| D2_navigation | 747.52      |  | `python3 vizdoom_c51.py --task "D2_navigation"` |
| D3_battle     | 1855.29     |      | `python3 vizdoom_c51.py --task "D3_battle"`     |

### PPO (single run)

| task          | best reward | reward curve                           | parameters                                      |
|---------------|-------------|----------------------------------------|-------------------------------------------------|
| D2_navigation | 770.75      |  | `python3 vizdoom_ppo.py --task "D2_navigation"` |
| D3_battle     | 320.59      |      | `python3 vizdoom_ppo.py --task "D3_battle"`     |

### PPO with ICM (single run)

| task          | best reward | reward curve                               | parameters                                                        |
|---------------|-------------|--------------------------------------------|-------------------------------------------------------------------|
| D2_navigation | 844.99      |  | `python3 vizdoom_ppo.py --task "D2_navigation" --icm-lr-scale 10` |
| D3_battle     | 547.08      |      | `python3 vizdoom_ppo.py --task "D3_battle" --icm-lr-scale 10`     |

---

### Overview (`examples/vizdoom/maps/README.md`)

D1-D4 maps are from https://github.com/intel-isl/DirectFuturePrediction/

More maps and cfgs: https://github.com/mwydmuch/ViZDoom/tree/master/scenarios

---

### 02 Deep Dives 0 Intro (`docs/02_deep_dives/0_intro.md`)

# Deep Dives

Our deep dives are a collection of executable tutorials on some of the internal representations used by Tianshou.
Provided as notebooks, you can run them directly in Colab or download them to run them locally.

---

###  Config.Yml (`docs/_config.yml`)

# Book settings
# Learn more at https://jupyterbook.org/customize/config.html

#######################################################################################
# A default configuration that will be loaded for all jupyter books
# Users are expected to override these values in their own `_config.yml` file.
# This is also the "master list" of all allowed keys and values.

#######################################################################################
# Book settings
title                       : Tianshou Documentation  # The title of the book. Will be placed in the left navbar.
author                      : Tianshou contributors  # The author of the book
copyright                   : "2020, Tianshou contributors."  # Copyright year to be placed in the footer
logo                        : _static/images/tianshou-logo.png  # A path to the book logo
# Patterns to skip when building the book. Can be glob-style (e.g. "*skip.ipynb")
exclude_patterns            : ['**.ipynb_checkpoints', '.DS_Store', 'Thumbs.db', '_build', 'jupyter_execute', '.jupyter_cache', '.pytest_cache', 'docs/autogen_rst.py', 'docs/create_toc.py']
# Auto-exclude files not in the toc
only_build_toc_files        : false

#######################################################################################
# Execution settings
execute:
  execute_notebooks         : cache  # Whether to execute notebooks at build time. Must be one of ("auto", "force", "cache", "off")
  cache                     : ""    # A path to the jupyter cache that will be used to store execution artifacts. Defaults to `_build/.jupyter_cache/`
  exclude_patterns          : []    # A list of patterns to *skip* in execution (e.g. a notebook that takes a really long time)
  timeout                   : -1    # The maximum time (in seconds) each notebook cell is allowed to run.
  run_in_temp               : false # If `True`, then a temporary directory will be created and used as the command working directory (cwd),
                                    # otherwise the notebook's parent directory will be the cwd.
  allow_errors              : false # If `False`, when a code cell raises an error the execution is stopped, otherwise all cells are always run.
  stderr_output             : show  # One of 'show', 'remove', 'remove-warn', 'warn', 'error', 'severe'

#######################################################################################
# Parse and render settings
parse:
  myst_enable_extensions: # default extensions to enable in the myst parser. See https://myst-parser.readthedocs.io/en/latest/using/syntax-optional.html
    - amsmath
    - colon_fence
    # - deflist
    - dollarmath
    - html_admonition
    # - html_image
    - linkify
    # - replacements
    # - smartquotes
    - substitution
    - tasklist
  myst_url_schemes: [ mailto, http, https ] # URI schemes that will be recognised as external URLs in Markdown links
  myst_dmath_double_inline: true  # Allow display math ($$) within an inline context

#######################################################################################
# HTML-specific settings
html:
  favicon                   : "_static/images/tianshou-favicon.png"  # A path to a favicon image
  use_edit_page_button      : false  # Whether to add an "edit this page" button to pages. If `true`, repository information in repository: must be filled in
  use_repository_button     : false  # Whether to add a link to your repository button
  use_issues_button         : false  # Whether to add an "open an issue" button
  use_multitoc_numbering    : true   # Continuous numbering across parts/chapters
  extra_footer              : ""
  google_analytics_id       : ""  # A GA id that can be used to track book views.
  home_page_in_navbar       : true  # Whether to include your home page in the left Navigation Bar
  baseurl                   : "https://tianshou.readthedocs.io/en/master/"
  analytics:

  comments:
    hypothesis              : false
    utterances              : false
  announcement              : "" # A banner announcement at the top of the site.

#######################################################################################
# LaTeX-specific settings
latex:
  latex_engine              : pdflatex  # one of 'pdflatex', 'xelatex' (recommended for unicode), 'luatex', 'platex', 'uplatex'
  use_jupyterbook_latex     : true # use sphinx-jupyterbook-latex for pdf builds as default
  targetname                : book.tex
# Add a bibtex file so that we can create citations
bibtex_bibfiles:
  - refs.bib

#######################################################################################
# Launch button settings
launch_buttons:
  notebook_interface        : classic  # The interface interactive links will activate ["classic", "jupyterlab"]
  binderhub_url             : ""  # The URL of the BinderHub (e.g., https://mybinder.org)
  jupyterhub_url            : ""  # The URL of the JupyterHub (e.g., https://datahub.berkeley.edu)
  thebe                     : false  # Add a thebe button to pages (requires the repository to run on Binder)
  colab_url                 : "https://colab.research.google.com"

repository:
  url                       : https://github.com/thu-ml/tianshou  # The URL to your book's repository
  path_to_book              : docs  # A path to your book's folder, relative to the repository root.
  branch                    : master  # Which branch of the repository should be used when creating links

#######################################################################################
# Advanced and power-user settings
sphinx:
  extra_extensions          :
    - sphinx.ext.autodoc
    - sphinx.ext.viewcode
    - sphinx_toolbox.more_autodoc.sourcelink
    - sphinxcontrib.spelling
    - sphinxcontrib.mermaid
  local_extensions          :   # A list of local extensions to load by sphinx specified by "name: path" items
  recursive_update          : false # A boolean indicating whether to overwrite the Sphinx config (true) or recursively update (false)
  config                    :   # key-value pairs to directly over-ride the Sphinx configuration
    autodoc_typehints_format: "short"
    autodoc_member_order: "bysource"
    autodoc_mock_imports:
      # mock imports for optional dependencies (e.g. dependencies of atari/atari_wrapper)
      - cv2
    autoclass_content: "both"
    autodoc_default_options:
      show-inheritance: True
    html_js_files:
#     We have to list them explicitly because they need to be loaded in a specific order
      - js/vega@5.js
      - js/vega-lite@5.js
      - js/vega-embed@5.js
    autodoc_show_sourcelink: True
    add_module_names: False
    github_username: thu-ml
    github_repository: tianshou
    python_use_unqualified_type_names: True
    nb_mime_priority_overrides: [
      [ 'html', 'application/vnd.jupyter.widget-view+json', 10 ],
      [ 'html', 'application/javascript', 20 ],
      [ 'html', 'text/html', 30 ],
      [ 'html', 'text/latex', 40 ],
      [ 'html', 'image/svg+xml', 50 ],
      [ 'html', 'image/png', 60 ],
      [ 'html', 'image/jpeg', 70 ],
      [ 'html', 'text/markdown', 80 ],
      [ 'html', 'text/plain', 90 ],
      [ 'spelling', 'application/vnd.jupyter.widget-view+json', 10 ],
      [ 'spelling', 'application/javascript', 20 ],
      [ 'spelling', 'text/html', 30 ],
      [ 'spelling', 'text/latex', 40 ],
      [ 'spelling', 'image/svg+xml', 50 ],
      [ 'spelling', 'image/png', 60 ],
      [ 'spelling', 'image/jpeg', 70 ],
      [ 'spelling', 'text/markdown', 80 ],
      [ 'spelling', 'text/plain', 90 ],
    ]
    mathjax_path: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
    myst_fence_as_directive: ["mermaid"]
    mathjax3_config:
      loader: { load: [ '[tex]/configmacros' ] }
      tex:
        packages: { '[+]': [ 'configmacros' ] }
        macros:
          vect: ["{\\mathbf{\\boldsymbol{#1}} }", 1]
          E: "{\\mathbb{E}}"
          P: "{\\mathbb{P}}"
          R: "{\\mathbb{R}}"
          abs: ["{\\left| #1 \\right|}", 1]
          simpl: ["{\\Delta^{#1} }", 1]
          amax: "{\\text{argmax}}"

---

### Bibtex.Json (`docs/bibtex.json`)

{
    "cited": {
        "tutorials/dqn": [
            "DQN",
            "DDPG",
            "PPO"
        ]
    }
}

---

### Index (`docs/index.rst`)

Welcome to Tianshou!
====================

**Tianshou** (`天授 <https://baike.baidu.com/item/%E5%A4%A9%E6%8E%88>`_) is a reinforcement learning platform based on pure PyTorch. Unlike existing reinforcement learning libraries, which are mainly based on TensorFlow, have many nested classes, unfriendly API, or slow-speed, Tianshou provides a fast-speed framework and pythonic API for building the deep reinforcement learning agent. The supported interface algorithms include:

* :class:`~tianshou.algorithm.modelfree.dqn.DQN` `Deep Q-Network <https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf>`_
* :class:`~tianshou.algorithm.modelfree.dqn.DQN` `Double DQN <https://arxiv.org/pdf/1509.06461.pdf>`_
* :class:`~tianshou.algorithm.modelfree.dqn.DQN` `Dueling DQN <https://arxiv.org/pdf/1511.06581.pdf>`_
* :class:`~tianshou.algorithm.modelfree.bdqn.BDQN` `Branching DQN <https://arxiv.org/pdf/1711.08946.pdf>`_
* :class:`~tianshou.algorithm.modelfree.c51.C51` `Categorical DQN <https://arxiv.org/pdf/1707.06887.pdf>`_
* :class:`~tianshou.algorithm.modelfree.rainbow.RainbowDQN` `Rainbow DQN <https://arxiv.org/pdf/1710.02298.pdf>`_
* :class:`~tianshou.algorithm.modelfree.qrdqn.QRDQN` `Quantile Regression DQN <https://arxiv.org/pdf/1710.10044.pdf>`_
* :class:`~tianshou.algorithm.modelfree.iqn.IQN` `Implicit Quantile Network <https://arxiv.org/pdf/1806.06923.pdf>`_
* :class:`~tianshou.algorithm.modelfree.fqf.FQF` `Fully-parameterized Quantile Function <https://arxiv.org/pdf/1911.02140.pdf>`_
* :class:`~tianshou.algorithm.modelfree.reinforce.Reinforce` `Reinforce/Vanilla Policy Gradients <https://papers.nips.cc/paper/1713-policy-gradient-methods-for-reinforcement-learning-with-function-approximation.pdf>`_
* :class:`~tianshou.algorithm.modelfree.npg.NPG` `Natural Policy Gradient <https://proceedings.neurips.cc/paper/2001/file/4b86abe48d358ecf194c56c69108433e-Paper.pdf>`_
* :class:`~tianshou.algorithm.modelfree.a2c.A2C` `Advantage Actor-Critic <https://openai.com/blog/baselines-acktr-a2c/>`_
* :class:`~tianshou.algorithm.modelfree.trpo.TRPO` `Trust Region Policy Optimization <https://arxiv.org/pdf/1502.05477.pdf>`_
* :class:`~tianshou.algorithm.modelfree.ppo.PPO` `Proximal Policy Optimization <https://arxiv.org/pdf/1707.06347.pdf>`_
* :class:`~tianshou.algorithm.modelfree.ddpg.DDPG` `Deep Deterministic Policy Gradient <https://arxiv.org/pdf/1509.02971.pdf>`_
* :class:`~tianshou.algorithm.modelfree.td3.TD3` `Twin Delayed DDPG <https://arxiv.org/pdf/1802.09477.pdf>`_
* :class:`~tianshou.algorithm.modelfree.sac.SAC` `Soft Actor-Critic <https://arxiv.org/pdf/1812.05905.pdf>`_
* :class:`~tianshou.algorithm.modelfree.redq.REDQ` `Randomized Ensembled Double Q-Learning <https://arxiv.org/pdf/2101.05982.pdf>`_
* :class:`~tianshou.algorithm.modelfree.discrete_sac.DiscreteSAC` `Discrete Soft Actor-Critic <https://arxiv.org/pdf/1910.07207.pdf>`_
* :class:`~tianshou.algorithm.imitation.imitation_base.ImitationPolicy` Imitation Learning
* :class:`~tianshou.algorithm.imitation.bcq.BCQ` `Batch-Constrained deep Q-Learning <https://arxiv.org/pdf/1812.02900.pdf>`_
* :class:`~tianshou.algorithm.imitation.cql.CQL` `Conservative Q-Learning <https://arxiv.org/pdf/2006.04779.pdf>`_
* :class:`~tianshou.algorithm.imitation.td3_bc.TD3BC` `Twin Delayed DDPG with Behavior Cloning <https://arxiv.org/pdf/2106.06860.pdf>`_
* :class:`~tianshou.algorithm.imitation.discrete_cql.DiscreteCQL` `Discrete Conservative Q-Learning <https://arxiv.org/pdf/2006.04779.pdf>`_
* :class:`~tianshou.algorithm.imitation.discrete_bcq.DiscreteBCQ` `Discrete Batch-Constrained deep Q-Learning <https://arxiv.org/pdf/1910.01708.pdf>`_
* :class:`~tianshou.algorithm.imitation.discrete_crr.DiscreteCRR` `Critic Regularized Regression <https://arxiv.org/pdf/2006.15134.pdf>`_
* :class:`~tianshou.algorithm.imitation.gail.GAIL` `Generative Adversarial Imitation Learning <https://arxiv.org/pdf/1606.03476.pdf>`_
* :class:`~tianshou.algorithm.modelbased.psrl.PSRLPolicy` `Posterior Sampling Reinforcement Learning <https://www.ece.uvic.ca/~bctill/papers/learning/Strens_2000.pdf>`_
* :class:`~tianshou.algorithm.modelbased.icm.ICMOffPolicyWrapper`, :class:`~tianshou.algorithm.modelbased.icm.ICMOnPolicyWrapper` `Intrinsic Curiosity Module <https://arxiv.org/pdf/1705.05363.pdf>`_
* :class:`~tianshou.data.buffer.prio.PrioritizedReplayBuffer` `Prioritized Experience Replay <https://arxiv.org/pdf/1511.05952.pdf>`_
* :meth:`~tianshou.algorithm.algorithm_base.Algorithm.compute_episodic_return` `Generalized Advantage Estimator <https://arxiv.org/pdf/1506.02438.pdf>`_
* :class:`~tianshou.data.buffer.her.HERReplayBuffer` `Hindsight Experience Replay <https://arxiv.org/pdf/1707.01495.pdf>`_


Installation
------------

Tianshou is available through `PyPI <https://pypi.org/project/tianshou/>`_.
New releases require Python >= 3.11.

Install Tianshou with the following command:

.. code-block:: bash

    $ pip install tianshou

Alternatively, install the current version on GitHub:

.. code-block:: bash

    $ pip install git+https://github.com/thu-ml/tianshou.git@master --upgrade

After installation, open your python console and type
::

    import tianshou
    print(tianshou.__version__)

If no error occurs, you have successfully installed Tianshou.


Indices and tables
------------------

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

---

### 01 User Guide 00 Training Process (`docs/01_user_guide/00_training_process.md`)

# The Reinforcement Learning Process

The following diagram illustrates the key mechanisms underlying the learning process in model-free reinforcement learning algorithms.
It shows how the agent interacts with the environment, collects experiences, and periodically updates its policy based on those experiences.

<div id="carousel" style="width: 85%; text-align:center; margin-bottom: 16px; border: 1px solid #ddd;">
  <img id="carousel-image" src="../_static/images/agent-env-step1.png" style="width: 100%; border-radius:8px;" alt="RL Loop">
  <div style="margin-bottom: 10px;">
    <button onclick="prevImage()" style="padding: 0 10px; margin-right: 10px;">&#8678; Prev</button>
    <button onclick="nextImage()" style="padding: 0 10px;">Next &#8680;</button>
  </div>
  <div id="caption" style="margin: 10px; text-align: left;"></div>
</div>

<script>
  const images = [
    {src: '../_static/images/agent-env-step1.png', caption: '<b>Step 1</b>: The agent receives the observable state from the environment.'},
    {src: '../_static/images/agent-env-step2.png', caption: '<b>Step 2</b>: The agent uses its policy to select an action, passing it to the environment.'},
    {src: '../_static/images/agent-env-step3.png', caption: '<b>Step 3</b>: The execution of the action results in a new state and produces a reward. The environment is specifically designed to provide feedback to the agent, returning (high) positive rewards for desirable states and low/negative rewards for undesirable states; rewards may be sparse, i.e. rewards for intermediate states may be zero. The agent records the action taken, the state transition and the reward received in its database of experiences (replay buffer). The agent repeats the process several times in order to fill the replay buffer with new transitions.'},
    {src: '../_static/images/agent-env-step4.png', caption: '<b>Step 4</b>: Periodically, after having collected enough experiences, the agent uses the experience data to update its policy, i.e. the way it selects actions. The learning algorithm defines the corresponding update mechanism.'},
  ];
  let index = 0;

  function updateImage() {
    document.getElementById('carousel-image').src = images[index].src;
    document.getElementById('caption').innerHTML = images[index].caption;
  }

  function nextImage() {
    index = (index + 1) % images.length;
    updateImage();
  }

  function prevImage() {
    index = (index - 1 + images.length) % images.length;
    updateImage();
  }

  updateImage();
</script>

Accordingly, the key entities involved in the learning process are:
  * The **environment**: This is the system the agent interacts with. 
    It provides the agent with observable states and rewards based on the actions taken by the agent.
  * The agent's **policy**: This is the strategy used by the agent to decide which action to take in a given state. 
    The policy can be deterministic or stochastic and is typically represented by a neural network in deep reinforcement learning.
  * The **replay buffer**: This is a data structure used to store the agent's experiences, which consist of state transitions, 
    actions taken, and rewards received. 
    The agent learns from past experience by sampling mini-batches from the buffer during the policy update phase.
  * The **learning algorithm**: This defines how the agent updates its policy based on the experiences stored in the replay buffer. 
    Different algorithms have different update mechanisms, which can significantly affect the learning performance. 
    In some cases, the algorithm may also involve additional components (specifically neural networks), such as target networks or value 
    functions.

These entities have direct correspondences in Tianshou's codebase:
  * The environment is represented by an instance of a class that inherits from `gymnasium.Env`, which is a standard interface for 
    reinforcement learning environments. 
    In practice, environments are typically vectorized to enable parallel interactions, increasing efficiency.
  * The policy is encapsulated in the {class}`~tianshou.algorithm.algorithm_base.Policy` class, which provides methods for action selection.
  * The replay buffer is implemented in the {class}`~tianshou.data.buffer.buffer_base.ReplayBuffer` class.
    A {class}`~tianshou.data.collector.Collector` instance is used to manage the addition of new experiences to the replay buffer as the agent interacts with the 
    environment. 
    During the learning phase, the replay buffer may be sampled, providing an instance of {class}`~tianshou.data.batch.Batch` for the policy update.
  * The abstraction for learning algorithms is given by the {class}`~tianshou.algorithm.algorithm_base.Algorithm` class, which defines how to update the policy using data from the 
    replay buffer.

(structuring-the-process)=
## Structuring the Process

The learning process itself is reified in Tianshou's {class}`~tianshou.trainer.trainer.Trainer` class, which orchestrates the interaction between the agent and the 
environment, manages the replay buffer, and coordinates the policy updates according to the specified learning algorithm.  

In general, the process can be described as executing a number of epochs as follows:

* **epoch**:
  * repeat until a sufficient number of steps is reached (for online learning, typically environment step count)
    * **training step**:
      * for online learning algorithms …
        * **collection step**: collect state transitions in the environment by running the agent
        * (optionally) conduct a test step if collected data indicates promising behaviour
      * **update step**: apply gradient updates using the algorithm’s update logic.  
        The update is based on … 
        * data from the preceding collection step only (on-policy learning)
        * data from the collection step and previous data (off-policy learning)
        * data from a user-provided replay buffer (offline learning)
  * **test step**
    * collect test episodes from dedicated test environments and evaluate agent performance
    * (optionally) stop training early if performance is sufficiently high

```{admonition} Glossary
:class: note
The above introduces some of the key terms used throughout Tianshou. 
```

Note that the above description encompasses several modes of model-free reinforcement learning, including:
 * online learning (where the agent continuously interacts with the environment in order to collect new experiences)
   * on-policy learning (where the policy is updated based on data collected using the current policy only)
   * off-policy learning (where the policy is updated based on data collected using the current and previous policies)
 * offline learning (where the replay buffer is pre-filled and not updated during training)

In Tianshou, the {class}`~tianshou.trainer.trainer.Trainer` and {class}`~tianshou.algorithm.algorithm_base.Algorithm` classes are specialised to handle these different modes accordingly.

---

### 01 User Guide 01 Apis (`docs/01_user_guide/01_apis.md`)

# Dual APIs

Tianshou provides two distinct APIs to serve different use cases and user preferences:

1. **high-level API**: a declarative, configuration-based interface designed for ease of use
2. **procedural API**: a flexible, imperative interface providing maximum control

Both APIs access the same underlying algorithm implementations, allowing you to choose the level 
of abstraction that best fits your needs without sacrificing functionality.

## Overview

### High-Level API

The high-level API is built around the **builder pattern** and **declarative semantics**. 
Instead of writing procedural code that sequentially constructs and connects components, 
you declare _what_ you want through configuration objects and let Tianshou handle _how_ to 
build and execute the experiment.

**Key characteristics:**
- centered around {class}`~tianshou.highlevel.experiment.ExperimentBuilder` classes (e.g., {class}`~tianshou.highlevel.experiment.DQNExperimentBuilder`, {class}`~tianshou.highlevel.experiment.PPOExperimentBuilder`, etc.)
- uses configuration dataclasses and factories for all relevant parameters
- automatically handles component creation and "wiring"
- provides sensible defaults that adapt to the nature of your environment
- includes built-in persistence, logging, and experiment management
- full type hints (but object structure is not flat; a proper IDE is required for seamless user experience)  

### Procedural API

The procedural API provides explicit control over every component in the RL pipeline. 
You manually create environments, networks, policies, algorithms, collectors, and 
trainers, then wire them together.

**Key characteristics:**
- direct instantiation of all components
- explicit control over the training loop
- lower-level access to internal mechanisms
- minimal abstraction (closer to the implementation)
- ideal for algorithm development and research

## When to Use Which API

Use the high-level API when ...

- **you're applying existing algorithms** to new problems
- **you want to get started quickly** with minimal boilerplate
- **you need experiment management** with persistence, logging, and reproducibility
- **you prefer declarative code** that focuses on configuration
- **you're building applications** rather than developing new algorithms

Use the procedural API when:

- **you're developing new algorithms** or modifying existing ones
- **you need fine-grained control** over the training process
- **you want to understand** the internal workings of Tianshou
- **you're implementing custom components** not supported by the high-level API
- **you prefer imperative programming** where each step is explicit
- **you need maximum flexibility** for experimental research

## Comparison by Example

Let's compare both APIs by implementing the same DQN learning task on the CartPole environment.

### High-Level API Example

```
/* Detailed source-code truncated for AI context efficiency. */
```

**What's happening here:**
1. We create an {class}`~tianshou.highlevel.experiment.ExperimentBuilder` with three main configuration objects
2. We chain builder methods to specify algorithm parameters, model architecture, and callbacks
3. We call `.build()` to construct the experiment
4. We call `.run()` to execute the entire training pipeline

The high-level API handles ...
- creating and configuring environments
- building the neural network
- instantiating the policy and algorithm
- setting up collectors and replay buffer
- managing the training loop
- watching the trained agent

### Procedural API Example

```
/* Detailed source-code truncated for AI context efficiency. */
```

**What's happening here:**
1. We explicitly define all hyperparameters as variables
2. We manually create the logger
3. We construct training and test environments
4. We build the neural network by extracting space information from the environment
5. We create the policy and algorithm objects
6. We set up collectors with a replay buffer
7. We define callback functions
8. We call `algorithm.run_training()` with explicit parameters
9. We manually set up and run the evaluation collector

The procedural API requires ...
- explicit creation of every component
- manual extraction of environment properties
- direct specification of all connections

## Key Concepts in the High-Level API

### ExperimentBuilder

The {class}`~tianshou.highlevel.experiment.ExperimentBuilder` is the core abstraction. 
Each algorithm has its own builder (e.g., {class}`~tianshou.highlevel.experiment.DQNExperimentBuilder`, {class}`~tianshou.highlevel.experiment.PPOExperimentBuilder`, {class}`~tianshou.highlevel.experiment.SACExperimentBuilder`).

**Some methods you will find in experiment builders:**
- `.with_<algorithm>_params()` - Set algorithm-specific parameters
- `.with_model_factory()`, `.with_model_factory_default()` - Configure network architecture
- `.with_critic_factory()` - Configure critic network (for actor-critic methods)
- `.with_epoch_train_callback()` - Add function to be called at the beginning of the training step in each epoch
- `.with_epoch_test_callback()` - Add function to be called at the beginning of the test step in each epoch
- `.with_epoch_stop_callback()` - Define stopping conditions
- `.with_algorithm_wrapper_factory()` - Add algorithm wrappers (e.g., ICM)

### Configuration Objects

Three main configuration objects are required when constructing an experiment builder:

1. **Environment Configuration** ({class}`~tianshou.highlevel.env.EnvFactory` subclasses)
   - Defines how to create and configure environments
   - Existing factories:
     - {class}`~tianshou.highlevel.env.EnvFactoryRegistered` - For the creation of environments registered in Gymnasium
     - {class}`~tianshou.highlevel.env.atari.atari_wrapper.AtariEnvFactory` - For Atari environments with preprocessing
   - Custom factories for your own environments can be created by subclassing {class}`~tianshou.highlevel.env.EnvFactory`

2. **Experiment Configuration** ({class}`~tianshou.highlevel.experiment.ExperimentConfig`): 
   General settings for the experiment, particularly related to 
   - logging
   - randomization
   - persistence
   - watching the trained agent's performance after training

3. **Training Configuration** ({class}`~tianshou.highlevel.config.OffPolicyTrainingConfig`, {class}`~tianshou.highlevel.config.OnPolicyTrainingConfig`): 
   Defines all parameters related to the training process

### Parameter Classes

Algorithm parameters are defined in dataclasses specific to each algorithm (e.g., {class}`~tianshou.highlevel.params.algorithm_params.DQNParams`, {class}`~tianshou.highlevel.params.algorithm_params.PPOParams`).
The parameters are extensively documented.

```{note}
Make sure to use a modern IDE to take advantage of auto-completion and inline documentation!
```

### Factories

The high-level API uses factories extensively:
- **Model Factories**: Create neural networks (e.g., {class}`~tianshou.highlevel.module.intermediate.IntermediateModuleFactoryAtariDQN`)
- **Environment Factories**: Create and configure environments
- **Optimizer Factories**: Create optimizers with specific configurations

### Extensibility

The high-level API is designed to be extensible. 
You can create custom factories (e.g. for your own models or your own environments) by subclassing the appropriate base classes
and then use them in the experiment builder.

If we have created a torch module in `CustomNetwork`, which we want to use within our policy, 
we simply need to define a factory for it in order to apply it in the high-level API:

```python
from tianshou.highlevel.env import Environments
from tianshou.highlevel.module.core import TDevice
from tianshou.highlevel.module.intermediate import IntermediateModuleFactory, IntermediateModule

class CustomNetFactory(IntermediateModuleFactory):
    def __init__(self, hidden_sizes: tuple[int, ...] = (128, 128)):
        self.hidden_sizes = hidden_sizes
    
    def create_intermediate_module(self, envs: Environments, device: TDevice) -> IntermediateModule:
        obs_shape = envs.get_observation_shape()
        action_shape = envs.get_action_shape()
        
        # Your custom network creation logic
        net = CustomNetwork(
            obs_shape=obs_shape,
            action_shape=action_shape,
            hidden_sizes=self.hidden_sizes,
        ).to(device)
        
        return IntermediateModule(net, net.output_dim)

experiment = (
    DQNExperimentBuilder(...)
    .with_model_factory(CustomNetFactory(hidden_sizes=(256, 256)))
    .build()
)
```

## Key Concepts in the Procedural API

### Core Components

You manually create and connect ...

1. **environments**: e.g. using `gym.make()` and vectorization ({class}`~tianshou.env.DummyVectorEnv`, {class}`~tianshou.env.SubprocVectorEnv`)
2. **networks**: using {class}`~tianshou.utils.net.common.Net` or other PyTorch modules
3. **policies**: using algorithm-specific policy classes (e.g., {class}`~tianshou.algorithm.modelfree.dqn.DiscreteQLearningPolicy`)
4. **algorithms**: using algorithm classes (e.g., {class}`~tianshou.algorithm.modelfree.dqn.DQN`, {class}`~tianshou.algorithm.modelfree.ppo.PPO`, {class}`~tianshou.algorithm.modelfree.sac.SAC`)
5. **collectors**: using {class}`~tianshou.data.Collector` to gather experience
6. **buffers**: using {class}`~tianshou.data.buffer.VectorReplayBuffer` or {class}`~tianshou.data.buffer.ReplayBuffer`
7. **trainers**: using the respective trainer class and corresponding parameter class (e.g., {class}`~tianshou.trainer.OffPolicyTrainer` and {class}`~tianshou.trainer.OffPolicyTrainerParams`)

### Training Loop

The training is executed via `algorithm.run_training()`, which takes a trainer parameter object. 
You can alternatively implement custom training loops (or even your own trainer class) for maximum flexibility.


## Additional Resources

- **high-Level API examples**: See `examples/` directory (scripts ending in `_hl.py`)
- **procedural API examples**: See `examples/` directory (scripts without suffix)

---

### 01 User Guide 02 Core Abstractions (`docs/01_user_guide/02_core_abstractions.md`)

# Core Abstractions

Tianshou's architecture is built around a number of key abstractions that work together to provide a modular and flexible reinforcement learning framework. 
This document describes the conceptual foundation and functionality of each abstraction, helping you understand how they interact to enable RL agent training.

Knowing these abstractions is primarily relevant when using the procedural API – and particularly when implementing one's own learning algoriithms.

## Algorithm

The **{class}`~tianshou.algorithm.algorithm_base.Algorithm`** is the central abstraction representing the core of a reinforcement learning method (such as DQN, PPO, or SAC). 
It implements the key steps within the {ref}`learning process <structuring-the-process>`, containing a {ref}`policy` and defining how to update it from experience data.

Since an Algorithm contains neural networks and manages their training, the class inherits from `torch.nn.Module`. 

### Core Responsibilities

An Algorithm implements the details of an {ref}`update step <structuring-the-process>`:

1. **preprocessing**: Before the actual update begins, the algorithm prepares the training data. 
   This includes computing derived quantities that depend on temporal sequences, such as n-step returns, GAE advantages, or terminal state handling. 
   The {meth}`~tianshou.algorithm.algorithm_base.Algorithm._preprocess_batch` method handles this phase, often leveraging static methods like 
   {meth}`~tianshou.algorithm.algorithm_base.Algorithm.compute_nstep_return` and 
   {meth}`~tianshou.algorithm.algorithm_base.Algorithm.compute_episodic_return` to 
   efficiently compute returns using the buffer's temporal structure.

2. **network update**: The algorithm performs the actual neural network updates based on its specific learning method. 
   Each algorithm implements its own {meth}`~tianshou.algorithm.algorithm_base.Algorithm._update_with_batch` logic that defines how to update 
   the policy networks using the preprocessed batch data.

3. **postprocessing**: After the update, the algorithm may perform cleanup operations, such as updating prioritized replay buffer weights or other 
   algorithm-specific bookkeeping.

### Learning Orchestration

The Algorithm orchestrates the {ref}`update step <structuring-the-process>` through its 
{meth}`~tianshou.algorithm.algorithm_base.Algorithm.update` method, which ensures these three phases execute in proper sequence. 
It also manages optimizer state and learning rate schedulers, making them available for state persistence through
{meth}`~tianshou.algorithm.algorithm_base.Algorithm.state_dict` and
{meth}`~tianshou.algorithm.algorithm_base.Algorithm.load_state_dict` methods.

Each algorithm type (on-policy, off-policy, offline) creates its appropriate trainer through the
{meth}`~tianshou.algorithm.algorithm_base.Algorithm.create_trainer` method, 
establishing the connection between the learning logic and the training loop.

(policy)=
## Policy

The **{class}`~tianshou.algorithm.algorithm_base.Policy`** represents the agent's decision-making component, i.e. the mapping from observations to actions. 
While the Algorithm defines how to learn, the Policy defines what is learned and how to act.

Like Algorithm, the class inherits from `torch.nn.Module`.

### States of Operation

A Policy operates in two main modes:

- **training mode**: During training, the policy may employ exploration strategies, sample from action distributions, or add noise to encourage discovery. 
  Training mode is further divided into:
  - *collecting state*: When gathering experience from environment interaction
  - *updating state*: When performing network updates during learning
  
- **testing/inference mode**: During evaluation, the policy typically acts deterministically or uses the mode of predicted distributions to showcase 
  learned behavior without exploration.

The flag `is_within_training_step` controls the collection strategy, distinguishing between training and inference behavior.

### Key Methods

The Policy provides several essential methods:

- **{meth}`~tianshou.algorithm.algorithm_base.Policy.forward`**: 
  The core computation method that processes batched observations to produce action distributions or Q-values. 
  It takes a batch of environment data and optional hidden state (for recurrent policies), 
  returning a batch containing at minimum the "act" key, 
  and potentially "state" (hidden state) and "policy" (intermediate results to be stored in the buffer).

- **{meth}`~tianshou.algorithm.algorithm_base.Policy.compute_action`**: 
  A convenient method for inference that takes a single observation and returns a concrete action suitable for the environment. 
  This method internally calls `forward` with proper batching and unbatching.

- **{meth}`~tianshou.algorithm.algorithm_base.Policy.map_action`**: Transforms the raw neural network output to the environment's action space format, handling any necessary scaling or discretization.

The separation between `forward` (which works with batches) and 
{meth}`~tianshou.algorithm.algorithm_base.Policy.compute_action` (which works with single observations) provides efficiency 
during training and convenience during inference.

## Collector

The class **{class}`~tianshou.data.Collector`** bridges the gap between the policy and the environment(s), 
managing the process of gathering experience data. 
It enables efficient interaction with both single environments and vectorized environments (multiple parallel environments).

### Data Collection

The Collector's primary method, {meth}`~tianshou.data.Collector.collect`, orchestrates the environment interaction loop. It can collect either:
- a specified number of steps (`n_step`): useful for maintaining consistent training batch sizes
- a specified number of episodes (`n_episode`): useful for evaluation or when episode-level statistics are important

During collection, the Collector ...
1. obtains observations from the environment(s),
2. calls the policy to compute actions,
3. steps the environment(s) with these actions,
4. stores the resulting transitions (observation, action, reward, next observation, termination flags, and info) in the replay buffer,
5. manages episode boundaries and reset logic,
6. collects statistics such as episode returns, lengths, and collection speed.

### Hooks and Extensibility

The Collector supports customization through hooks that can be triggered at different points in the collection process:
- **step hooks**: called after each environment step
- **episode done hooks**: called when episodes complete

These hooks enable custom logging, curriculum learning, or other dynamic behaviors during data collection.

### Vectorized Environments

The Collector seamlessly handles vectorized environments, where multiple environment instances run in parallel. 
This significantly speeds up data collection while maintaining correct episode boundaries and statistics for each environment instance.

## Trainer

The **{class}`~tianshou.trainer.Trainer`** orchestrates the complete training loop, coordinating data collection, policy updates, and evaluation. 
It provides the high-level control flow that brings all components together.

### Trainer Types

Tianshou provides three main trainer types, each suited to different algorithm families:

- **{class}`~tianshou.trainer.OnPolicyTrainer`**: for algorithms that must learn from freshly collected data (e.g., PPO, A2C). 
  After each collection phase, the buffer is used for updates and thereafter is cleared.

- **{class}`~tianshou.trainer.OffPolicyTrainer`**: for algorithms that can learn from any past experience (e.g., DQN, SAC, DDPG).
  Data accumulates in the replay buffer over time, and updates sample from this growing pool of experience.

- **{class}`~tianshou.trainer.OfflineTrainer`**: for algorithms that learn exclusively from a fixed dataset without any environment interaction (e.g., BCQ, CQL).

### Training Loop Structure

The training process is organized into epochs, where each epoch consists of:

1. **data collection**: The trainer uses the train collector to gather experience according to its algorithm type's needs
2. **policy update**: The algorithm performs one or more update steps using the collected data
3. **evaluation**: Periodically, the trainer uses the test collector to evaluate the current policy's performance
4. **logging**: Statistics from collection, updates, and evaluation are logged
5. **checkpointing**: The best policy (according to a scoring function) is saved

The trainer handles the detailed choreography of these steps, including determining when to collect more data, 
how many update steps to perform, when to evaluate, and when to stop training (based on maximum epochs, timesteps, or early stopping criteria).

### Configuration

Trainers are configured through parameter dataclasses 
({class}`~tianshou.trainer.OnPolicyTrainerParams`, {class}`~tianshou.trainer.OffPolicyTrainerParams`, {class}`~tianshou.trainer.OfflineTrainerParams`) 
that specify in particular:
- training duration (number of epochs, steps per epoch)
- collectors for training and testing
- update frequency and batch size
- evaluation frequency
- logging and checkpointing settings
- early stopping criteria

## Batch

The class **{class}`~tianshou.data.Batch`** is Tianshou's flexible data structure for passing information between components. 
It serves as the lingua franca of the framework, carrying everything from raw environment observations to computed returns and policy outputs.

### Design Philosophy

Batch is designed to be ...
- **flexible**: can contain any key-value pairs, with nested structures supported,
- **numpy/torch-compatible**: automatically converts lists to arrays and seamlessly works with both NumPy arrays and PyTorch tensors,
- **sliceable**: supports indexing and slicing operations that work across all contained data,
- **composable**: can be concatenated, stacked, and split to support batching operations.

### Type Safety with BatchProtocol

While `Batch` provides a flexible, dictionary-like structure for holding arbitrary data, this flexibility can make it challenging to statically type-check which attributes are present in a batch at any given point in the code. To address this, Tianshou uses **{class}`~tianshou.data.batch.BatchProtocol`** and derived protocols to specify the expected attributes while keeping the actual runtime type as `Batch`.

BatchProtocol is a Python `Protocol` (from `typing.Protocol`) that defines the interface of a Batch object, specifying which operations and attributes should be available. More importantly, Tianshou provides a rich set of derived protocols in {mod}`tianshou.data.types` that describe batches with specific sets of attributes commonly used throughout the framework:

- **{class}`~tianshou.data.types.ObsBatchProtocol`**: Contains `obs` and `info` - the minimal batch for policy forward passes
- **{class}`~tianshou.data.types.RolloutBatchProtocol`**: Adds `obs_next`, `act`, `rew`, `terminated`, and `truncated` - typical data from replay buffer sampling
- **{class}`~tianshou.data.types.BatchWithReturnsProtocol`**: Extends RolloutBatchProtocol with `returns` computed from rewards
- **{class}`~tianshou.data.types.BatchWithAdvantagesProtocol`**: Includes `adv` (advantages) and `v_s` (value estimates) for policy gradient methods
- **{class}`~tianshou.data.types.ActStateBatchProtocol`**: Contains `act` and `state` for policy outputs, especially with RNN support
- **{class}`~tianshou.data.types.ModelOutputBatchProtocol`**: Adds `logits` to action and state information
- **{class}`~tianshou.data.types.DistBatchProtocol`**: Contains action distributions (`dist`) for stochastic policies
- **{class}`~tianshou.data.types.PrioBatchProtocol`**: Includes `weight` for prioritized experience replay

These protocols serve as type hints in function signatures throughout Tianshou, making it explicit what attributes are expected and available. For example, a policy's `forward` method might accept an `ObsBatchProtocol` and return an `ActStateBatchProtocol`, clearly documenting the data contract. Despite these type annotations, the actual objects remain flexible `Batch` instances at runtime, preserving Tianshou's dynamic nature while improving code clarity and IDE support.

### Common Use Cases

Batches flow through the system carrying different types of information:

1. **environment data**: observations, rewards, done flags, and info from environment steps
2. **policy outputs**: actions, hidden states, and intermediate computations
3. **training data**: returns, advantages, and other computed quantities needed for learning
4. **sampling results**: batches sampled from the replay buffer for training

### Operations

Key operations on batches include:
- **attribute access**: dot notation (`batch.obs`) or dictionary-style access (`batch['obs']`)
- **slicing**: extract subsets with standard indexing (`batch[0:10]`, `batch[[1,3,5]]`)
- **stacking**: combine multiple batches along a new dimension
- **type conversion**: convert between NumPy and PyTorch with `to_numpy()` and `to_torch()`
- **null handling**: detect and remove null values with `hasnull()`, `isnull()`, and `dropnull()`

The first dimension of all data in a Batch represents the batch size, enabling vectorized operations.

## Buffer

A **buffer** (i.e. class {class}`~tianshou.data.buffer.ReplayBuffer` and its variants) manages the storage and retrieval of experience data. 
It acts as the memory of the learning system, preserving the temporal structure of episodes while providing efficient access patterns.

### Storage Structure

Buffers store data in a circular queue fashion with a fixed maximum size. When the buffer fills, new data overwrites the oldest stored experiences. 
All data is stored within a single underlying Batch object, with the buffer managing:
- **pointer tracking**: current insertion position
- **episode boundaries**: which transitions belong to which episodes
- **temporal relationships**: the sequential order of transitions

### Reserved Keys

Buffers use a standard set of keys for storing transitions:
- `obs`: Observation at time t
- `act`: Action taken at time t
- `rew`: Reward received at time t
- `terminated`: True if the episode ended naturally at time t
- `truncated`: True if the episode was cut off at time t (e.g., time limit)
- `done`: Automatically inferred as `terminated or truncated`
- `obs_next`: Observation at time t+1
- `info`: Additional information from the environment
- `policy`: Intermediate policy computations to be stored

### Core Operations

**adding data**: The {meth}`~tianshou.data.buffer.buffer_base.ReplayBuffer.add` method stores new transitions, 
automatically handling episode boundaries and computing episode statistics (return, length) 
when episodes complete.

**sampling**: The {meth}`~tianshou.data.buffer.buffer_base.ReplayBuffer.sample` method retrieves batches of experiences for training, 
returning both the sampled batch and the corresponding indices. 
The sample size can be specified, or set to 0 to retrieve all available data.

**temporal navigation**: The {meth}`~tianshou.data.buffer.buffer_base.ReplayBuffer.prev` and {meth}`~tianshou.data.buffer.ReplayBuffer.next` 
methods enable traversal along the temporal sequence, respecting episode boundaries. 
This is essential for computing n-step returns and other time-dependent quantities.

**persistence**: Buffers support saving and loading via pickle or HDF5 format, enabling dataset collection and offline learning.

### Buffer Variants

Tianshou provides specialized buffer types:

- **{class}`~tianshou.data.buffer.buffer_base.ReplayBuffer`**: the standard buffer for single environments
- **{class}`~tianshou.data.buffer.vecbuf.VectorReplayBuffer`**: manages separate sub-buffers for multiple parallel environments while maintaining chronological order
- **{class}`~tianshou.data.buffer.prio.PrioritizedReplayBuffer`**: samples transitions based on their TD-error or other priority metrics, using an efficient segment tree implementation

### Advanced Features

Buffers support sophisticated use cases:
- **frame stacking**: automatically stacks consecutive observations (useful for RNN inputs or Atari)
- **memory optimization**: option to skip storing next observations (useful for Atari where they can be inferred)
- **multi-modal observations**: handle observations with multiple components (e.g., image + vector)

## Logger

The **{class}`~tianshou.utils.logger.logger_base.BaseLogger`** abstraction provides a unified interface for recording and tracking training progress, metrics, and statistics. 
It decouples the training loop from the specifics of where and how data is logged.

### Purpose

Loggers serve several essential functions:
- **progress tracking**: record timesteps, episodes, and epochs as training progresses
- **metric collection**: store performance indicators like rewards, losses, and success rates
- **experiment organization**: manage different data scopes (training, testing, updating)
- **reproducibility**: save training curves and hyperparameters for later analysis

### Logging Scopes

The framework organizes logged data into distinct scopes:
- **train data**: metrics from the training collector (episode returns, steps, collection speed)
- **test data**: evaluation metrics from the test collector
- **update data**: learning statistics from the algorithm (losses, gradients, learning rates)
- **info data**: additional custom metrics or metadata

Each scope has a corresponding log method (`log_train_data`, `log_test_data`, `log_update_data`, `log_info_data`) that the trainer calls at appropriate times.

### Implementations

Tianshou provides several logger implementations:
- **{class}`~tianshou.utils.logger.tensorboard.TensorboardLogger`**: writes to TensorBoard format for visualization with TensorBoard
- **{class}`~tianshou.utils.logger.wandb.WandbLogger`**: integrates with Weights & Biases for cloud-based experiment tracking

All implementations inherit from {class}`~tianshou.utils.logger.logger_base.BaseLogger` and share a common interface, 
making it easy to switch between logging backends or use multiple loggers simultaneously.

### Data Preparation

Before writing, loggers prepare data through the `prepare_dict_for_logging` method, which can filter, transform, or aggregate metrics. 
The `write` method then persists the prepared data to the logging backend with an associated step count.

## How They Work Together

These seven abstractions collaborate to enable reinforcement learning:

1. The **Trainer** initializes and orchestrates the training process.
2. The **Collector** uses the **Policy** to gather experience from environments.
3. Collected transitions are stored in the **Buffer** extracted as **Batches**.
4. The **Algorithm** samples from the **Buffer**, preprocesses the data, and updates the **Policy**.
5. The **Logger** records metrics throughout the process.
6. The cycle repeats until training completes.

This modular design allows each component to focus on its specific responsibility while maintaining clean interfaces. 
You can customize individual components (e.g., implementing a new Algorithm or Buffer) without affecting the others, 
making Tianshou both powerful and flexible.

---

### 01 User Guide Index (`docs/01_user_guide/index.rst`)

User Guide
==========

The user guide provides an introduction to core concepts, establishes the glossary of terms,
introduces Tianshou's dual API architecture and provides an overview of important abstractions.

---

### 04 Benchmarks Benchmarks (`docs/04_benchmarks/benchmarks.rst`)

Benchmarks
==========

Tianshou's algorithm implementations lead to state-of-the-art results on standard benchmarks.

An efficient parallel implementation for
evaluating algorithms on mujoco or atari is in `benchmark/run_benchmark.py`. It can easily be adapted for custom
benchmarks as well. The reported results are thus completely reproducible.

The evaluation code uses Tianshou's integration with the `rliable <https://github.com/google-research/rliable>`_ framework,
which supports best practices for trustworthy RL evaluation.
Each experiment is conducted under 5 random seeds, we report the interquartile mean (IQM) and 95% confidence intervals over these seeds.

.. raw:: html

    <center>
        <select id="env-mujoco" onchange="showMujocoResults(this)"></select>
        <br>
        <div id="vis-mujoco"></div>
        <br>
    </center>

---

### 05 Developer Guide Developer Guide (`docs/05_developer_guide/developer_guide.md`)

# Developer Guide

The section addresses developers of Tianshou, providing information for 
both casual contributors and maintainers alike.


## Python Virtual Environment

Tianshou is built and managed by [poetry](https://python-poetry.org/). 

The development environment uses Python 3.11.

To install all relevant requirements (as well as Tianshou itself in editable mode)
you can simply call

    poetry install --with dev

```{important}
Depending on your setup, you may need to create and activate an empty virtual environment
using the right Python version beforehand. For instance, to do this with conda, use:

    conda create -n tianshou python=3.11
    conda activate tianshou
```


## Code Style and Auto-Formatting

When editing code in Tianshou, strive for **local consistency**, i.e.
adhere to the style already present in the codebase.

Tianshou uses an auto-formatting for consistency.
To apply it, call

    poe format

To check whether your formatting is compliant without applying the
auto-formatter, call

    poe lint


## Type Checking

We use [mypy](https://github.com/python/mypy/) to perform static type analysis. 
To check typing, run

    poe type-check


## Tests

### Running the Test Suite Locally

Tianshou uses pytest. Tests are located in `./test`.

To run the full set of tests locally, run

    poe test

### Determinism Tests

We implemented **determinism tests** for Tianshou's algorithms, which allow us to determine
whether algorithms still compute exactly the same results even after large refactorings.
These tests are applied by

  1. creating a behavior snapshot in the old code branch before the changes and then
  2. running the respective determinism test in the new branch to ensure that the behavior is the same.

Unfortunately, full determinism is difficult to achieve across different platforms and even different
machines using the same platform an Python environment.
Therefore, these tests are not carried out in the CI pipeline.
Instead, it is up to the developer to run them locally and check the results whenever a change
is made to the codebase that could affect algorithm behavior.

Technically, the two steps are handled by setting static flags in class `AlgorithmDeterminismTest` and then
running either the full test suite or a specific determinism test (`test_*_determinism`, e.g. `test_ddpg_determinism`)
in the two branches to be compared.

  1. On the old branch: (Temporarily) set `ENABLED=True` and `FORCE_SNAPSHOT_UPDATE=True` and run the test(s).
  2. On the new branch: (Temporarily) set `ENABLED=True` and `FORCE_SNAPSHOT_UPDATE=False` and run the test(s).
  3. Inspect the test results; find a summary in `determinism_tests.log`

### Tests in CI (GitHub Actions)

CI tests will extensively test Tianshou's functionality in multiple environments.

In particular, we test
  * on Ubuntu (full functionality tested)
    * **py_pinned**: using the pinned development environment (Python 3.11, known versions of all dependencies)
    * **py_latest**: using a more recent Python version with the newest set of compatible dependencies (automatically resolved)
  * on Windows and macOS (core functionality tested)


#### Principle of Maximum Compatibility

The idea behind testing with dynamically resolved dependencies is that we want to maximize the applicability 
of Tianshou: For important dependencies that could conflict with environments used by our users, **we do not restrict the version of a dependency unless there is a known incompatibility.**

If incompatibilities should arise (e.g. by the "py_latest" test failing), we either 
 * resolve them by making the code compatible with both old and new versions OR
 * add an upper bound to our dependency declarations (excluding the incompatible versions) and release a new 
   version of Tianshou to make these exclusions explicit.


## High-Level API

The high-level API provides a declarative, user-friendly interface for setting up reinforcement learning experiments. From a library developer's perspective, it is important that this API be clearly structured and maintainable. This section explains the architectural principles and how to extend the API to support new algorithms.

### Core Abstractions

The high-level API is built around a clear separation of concerns:

**Parameter Classes** are dataclasses (inheriting from `Params`) that represent algorithm-specific configuration. 
They capture hyperparameters in a high-level, user-friendly form. 
Because the high-level interface must abstract away from low-level details, parameters may need transformation before being passed to policy classes. 
This is handled via `ParamTransformer` instances, which successively transform the parameter dictionary representation. 
To maintain clarity and reduce coupling, parameter transformers are co-located with the parameters they affect. 
The system uses inheritance and mixins extensively to reduce duplication while maintaining flexibility.

**Factories** embody the principle of declarative configuration. 
Because object creation may depend on other objects that don't yet exist at configuration time (e.g., neural networks depend on environment properties), 
the API transitions from objects to factories. 
Key factory types include:
- `EnvFactory` for creating training, test, and watch environments
- `AgentFactory` as the central factory that creates policies, trainers, and collectors
- Various specialized factories for optimizers, actors, critics, noise, distributions, learning rate schedulers, and policy wrappers

**Algorithm Factories** (subclasses of `AlgorithmFactory`) are the core components responsible for orchestrating the creation of all algorithm-specific objects. 
They handle the creation of neural network architectures, apply parameter transformations, instantiate policies, and create trainers with appropriate collectors. 
To support a new algorithm, this is the primary extension point.

**Experiment Builders** (subclasses of `ExperimentBuilder`) provide the user-facing interface following the builder pattern. 
They contain sensible defaults while allowing customization through fluent `with_*` methods. 
Builder mixins provide composable functionality for common patterns (e.g., actor/critic configuration), avoiding code duplication across algorithm-specific implementations.

### Supporting a New Algorithm

Extending the high-level API to support a new algorithm involves creating three main components:

**Parameter Class**: Define a dataclass in `tianshou/highlevel/params/algorithm_params.py` that inherits from appropriate base classes and mixins. 
The choice of base class depends on the algorithm's architecture (actor-critic, single network, etc.) and learning paradigm (on-policy, off-policy). 
Override `_get_param_transformers()` to specify how high-level parameters should be transformed for the low-level policy API.
Common transformers handle optimizer creation, noise instantiation, and environment-dependent parameter resolution.

**Algorithm Factory**: Implement a subclass of `AlgorithmFactory` in `tianshou/highlevel/algorithm.py`. 
In most cases, inherit from existing base factories like `ActorCriticOnPolicyAlgorithmFactory`, `ActorCriticOffPolicyAlgorithmFactory`, 
or `DiscreteCriticOnlyOffPolicyAlgorithmFactory`, which handle common creation patterns. 
The primary requirement is implementing `_get_algorithm_class()` to return the appropriate algorithm class. 
For algorithms with non-standard requirements, override `_create_algorithm()`, `_create_kwargs()`, etc. to customize the instantiation logic.

**Experiment Builder**: Add a builder class in `tianshou/highlevel/experiment.py` that inherits from `OnPolicyExperimentBuilder` or `OffPolicyExperimentBuilder` 
along with appropriate mixins. The mixins provide standard functionality for configuring actors and critics 
(single critic, dual critics, critic ensembles, parameter sharing patterns, etc.). 
The main responsibility is implementing `_create_algorithm_factory()` to instantiate the algorithm factory with appropriate parameters and network factories. 
Optionally provide `with_*` methods for algorithm-specific configuration.

Export the new classes in `tianshou/highlevel/__init__.py` to make them available to users.

### Design Principles

The architecture follows several key principles:

**Separation of Concerns**: Configuration is cleanly separated from implementation. 
The transformation system bridges these layers while maintaining independence.

**Declarative Configuration**: Factories enable a declarative style where experiments are defined by what should be created rather than imperative steps. 
This makes experiments easily serializable and reproducible.

**Composition and Inheritance**: Mixins and inheritance reduce code duplication. 
Common functionality is factored into reusable components while maintaining flexibility for algorithm-specific requirements.

**Progressive Disclosure**: The API provides sensible defaults for simple use cases while allowing deep customization when needed. 
Users can progress from simple configurations to advanced setups without fighting the abstractions.

**Co-location**: Related code is kept together. Parameter transformers are defined near the parameters they transform, 
maintaining clarity about dependencies and making the codebase easier to navigate.

**Type Safety**: Extensive use of generics and type hints ensures that type checkers can catch configuration errors at development time rather than runtime.


## Documentation

Documentation is in the `docs/` directory, using Markdown (`.md`), ReStructuredText (`.rst`) and notebook files. 
`index.rst` is the main page. 

API References are automatically generated by [Sphinx](http://www.sphinx-doc.org/en/stable/) according to the outlines under `docs/api/` and should be modified when any code changes.

To compile documentation into webpage, run

    poe doc-build

The generated webpages can subsequently be found in `docs/_build` and can be viewed with any browser.

### Verifications

We have several automated verification methods for documentation:

1. pydocstyle (as part of ruff): tests all docstring under `tianshou/`;

2. doc8 (as part of ruff): tests ReStructuredText format;

3. sphinx spelling and test: test if there is any error/warning when generating front-end html documentation.


## Creating a Release

To release a new version on PyPI,

 * set the version to be released in `tianshou/__init__.py` and in `pyproject.toml`, creating a commit
 * tag the commit with the version (using the format `v1.2.3`)
 * push the commit (`git push`) and the tag (`git push --tags`)
 * create a new release on GitHub based on the tag; this will trigger the release job for PyPI.

In the past, we provided releases to conda-forge as well, but this is currently not maintained.

---

### 06 Contributors Contributors (`docs/06_contributors/contributors.rst`)

Contributors
============

We always welcome contributions to help make Tianshou better!
Tianshou was originally created by the `THU-ML Group <https://ml.cs.tsinghua.edu.cn>`_ at Tsinghua University.

Today, it is backed by the `appliedAI Institute for Europe <https://www.appliedai-institute.de/en/>`_,
a non-profit organization committed to making Tianshou the go-to resource for reinforcement learning research and development,
guaranteeing its long-term maintenance and support.

The original creator Jiayi Weng (`Trinkle23897 <https://github.com/Trinkle23897>`_) continues
to be involved in Tianshou development.

The current core developers, who are behind the v1.0 and v2.0 releases of Tianshou, are:

* Dominik Jain (`opcode81 <https://github.com/opcode81>`_)
* Michael Panchenko (`MischaPanch <https://github.com/MischaPanch>`_)

An incomplete list of early contributors is:

* Alexis Duburcq (`duburcqa <https://github.com/duburcqa>`_)
* Kaichao You (`youkaichao <https://github.com/youkaichao>`_)
* Huayu Chen (`ChenDRAG <https://github.com/ChenDRAG>`_)
* Yi Su (`nuance1979 <https://github.com/nuance1979>`_)

You can find more information about contributors `here <https://github.com/thu-ml/tianshou/graphs/contributors>`_.

---

###  Static Js V5.Json (`docs/_static/js/v5.json`)

{
  "$ref": "#/definitions/TopLevelSpec",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "Aggregate": {
      "anyOf": [
        {
          "$ref": "#/definitions/NonArgAggregateOp"
        },
        {
          "$ref": "#/definitions/ArgmaxDef"
        },
        {
          "$ref": "#/definitions/ArgminDef"
        }
      ]
    },
    "AggregateOp": {
      "enum": [
        "argmax",
        "argmin",
        "average",
        "count",
        "distinct",
        "max",
        "mean",
        "median",
        "min",
        "missing",
        "product",
        "q1",
        "q3",
        "ci0",
        "ci1",
        "stderr",
        "stdev",
        "stdevp",
        "sum",
        "valid",
        "values",
        "variance",
        "variancep"
      ],
      "type": "string"
    },
    "AggregateTransform": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "description": "Array of objects that define fields to aggregate.",
          "items": {
            "$ref": "#/definitions/AggregatedFieldDef"
          },
          "type": "array"
        },
        "groupby": {
          "description": "The data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        }
      },
      "required": [
        "aggregate"
      ],
      "type": "object"
    },
    "AggregatedFieldDef": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The output field names to use for each aggregated field."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which to compute aggregate function. This is required for all aggregation operations except `\"count\"`."
        },
        "op": {
          "$ref": "#/definitions/AggregateOp",
          "description": "The aggregation operation to apply to the fields (e.g., `\"sum\"`, `\"average\"`, or `\"count\"`). See the [full list of supported aggregation operations](https://vega.github.io/vega-lite/docs/aggregate.html#ops) for more information."
        }
      },
      "required": [
        "op",
        "as"
      ],
      "type": "object"
    },
    "Align": {
      "enum": [
        "left",
        "center",
        "right"
      ],
      "type": "string"
    },
    "AllSortString": {
      "anyOf": [
        {
          "$ref": "#/definitions/SortOrder"
        },
        {
          "$ref": "#/definitions/SortByChannel"
        },
        {
          "$ref": "#/definitions/SortByChannelDesc"
        }
      ]
    },
    "AnyMark": {
      "anyOf": [
        {
          "$ref": "#/definitions/CompositeMark"
        },
        {
          "$ref": "#/definitions/CompositeMarkDef"
        },
        {
          "$ref": "#/definitions/Mark"
        },
        {
          "$ref": "#/definitions/MarkDef"
        }
      ]
    },
    "AnyMarkConfig": {
      "anyOf": [
        {
          "$ref": "#/definitions/MarkConfig"
        },
        {
          "$ref": "#/definitions/AreaConfig"
        },
        {
          "$ref": "#/definitions/BarConfig"
        },
        {
          "$ref": "#/definitions/RectConfig"
        },
        {
          "$ref": "#/definitions/LineConfig"
        },
        {
          "$ref": "#/definitions/TickConfig"
        }
      ]
    },
    "AreaConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "line": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/OverlayMarkDef"
            }
          ],
          "description": "A flag for overlaying line on top of area marks, or an object defining the properties of the overlayed lines.\n\n- If this value is an empty object (`{}`) or `true`, lines with default properties will be used.\n\n- If this value is `false`, no lines would be automatically added to area marks.\n\n__Default value:__ `false`."
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "point": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/OverlayMarkDef"
            },
            {
              "const": "transparent",
              "type": "string"
            }
          ],
          "description": "A flag for overlaying points on top of line or area marks, or an object defining the properties of the overlayed points.\n\n- If this property is `\"transparent\"`, transparent points will be used (for enhancing tooltips and selections).\n\n- If this property is an empty object (`{}`) or `true`, filled points with default properties will be used.\n\n- If this property is `false`, no points would be automatically added to line or area marks.\n\n__Default value:__ `false`."
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "ArgmaxDef": {
      "additionalProperties": false,
      "properties": {
        "argmax": {
          "$ref": "#/definitions/FieldName"
        }
      },
      "required": [
        "argmax"
      ],
      "type": "object"
    },
    "ArgminDef": {
      "additionalProperties": false,
      "properties": {
        "argmin": {
          "$ref": "#/definitions/FieldName"
        }
      },
      "required": [
        "argmin"
      ],
      "type": "object"
    },
    "AutoSizeParams": {
      "additionalProperties": false,
      "properties": {
        "contains": {
          "description": "Determines how size calculation should be performed, one of `\"content\"` or `\"padding\"`. The default setting (`\"content\"`) interprets the width and height settings as the data rectangle (plotting) dimensions, to which padding is then added. In contrast, the `\"padding\"` setting includes the padding within the view size calculations, such that the width and height settings indicate the **total** intended size of the view.\n\n__Default value__: `\"content\"`",
          "enum": [
            "content",
            "padding"
          ],
          "type": "string"
        },
        "resize": {
          "description": "A boolean flag indicating if autosize layout should be re-calculated on every view update.\n\n__Default value__: `false`",
          "type": "boolean"
        },
        "type": {
          "$ref": "#/definitions/AutosizeType",
          "description": "The sizing format type. One of `\"pad\"`, `\"fit\"`, `\"fit-x\"`, `\"fit-y\"`,  or `\"none\"`. See the [autosize type](https://vega.github.io/vega-lite/docs/size.html#autosize) documentation for descriptions of each.\n\n__Default value__: `\"pad\"`"
        }
      },
      "type": "object"
    },
    "AutosizeType": {
      "enum": [
        "pad",
        "none",
        "fit",
        "fit-x",
        "fit-y"
      ],
      "type": "string"
    },
    "Axis": {
      "additionalProperties": false,
      "properties": {
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the axis from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "bandPosition": {
          "anyOf": [
            {
              "description": "An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands.\n\n __Default value:__ `0.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of this axis for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If the `aria` property is true, for SVG output the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) will be set to this description. If the description is unspecified it will be automatically generated.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the domain dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the axis domain line.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainWidth": {
          "anyOf": [
            {
              "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis\n\n__Default value:__ `true` for [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned; otherwise, `false`.",
          "type": "boolean"
        },
        "gridCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for grid lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gridColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of gridlines.\n\n__Default value:__ `\"lightGray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "gridDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed grid lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumberArray"
            }
          ]
        },
        "gridDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the grid dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "gridOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity of grid (value between [0,1])\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "gridWidth": {
          "anyOf": [
            {
              "description": "The grid width, in pixels.\n\n__Default value:__ `1`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelAlign"
            }
          ]
        },
        "labelAngle": {
          "anyOf": [
            {
              "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
              "maximum": 360,
              "minimum": -360,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelBaseline"
            }
          ]
        },
        "labelBound": {
          "anyOf": [
            {
              "description": "Indicates if labels should be hidden if they exceed the axis range. If `false` (the default) no bounds overlap analysis is performed. If `true`, labels will be hidden if they exceed the axis range by more than 1 pixel. If this property is a number, it specifies the pixel tolerance: the maximum amount by which a label bounding box may exceed the axis range.\n\n__Default value:__ `false`.",
              "type": [
                "number",
                "boolean"
              ]
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the tick label, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "labelExpr": {
          "description": "[Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.\n\n__Note:__ The label text and value can be assessed via the `label` and `value` properties of the axis's backing `datum` object.",
          "type": "string"
        },
        "labelFlush": {
          "description": "Indicates if the first and last axis labels should be aligned flush with the scale range. Flush alignment for a horizontal axis will left-align the first label and right-align the last label. For vertical axes, bottom and top text baselines are applied instead. If this property is a number, it also indicates the number of pixels by which to offset the first and last labels; for example, a value of 2 will flush-align the first and last labels and also push them 2 pixels outward from the center of the axis. The additional adjustment can sometimes help the labels better visually group with corresponding axis ticks.\n\n__Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.",
          "type": [
            "boolean",
            "number"
          ]
        },
        "labelFlushOffset": {
          "anyOf": [
            {
              "description": "Indicates the number of pixels by which to offset flush-adjusted labels. For example, a value of `2` will push flush-adjusted labels 2 pixels outward from the center of the axis. Offsets can help the labels better visually group with corresponding axis ticks.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFont": {
          "anyOf": [
            {
              "description": "The font of the tick label.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisString"
            }
          ]
        },
        "labelFontSize": {
          "anyOf": [
            {
              "description": "The font size of the label, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style of the title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelFontStyle"
            }
          ]
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight of axis tick labels."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelFontWeight"
            }
          ]
        },
        "labelLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line label text or label text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOffset": {
          "anyOf": [
            {
              "description": "Position offset in pixels to apply to labels, in addition to tickOffset.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelOpacity": {
          "anyOf": [
            {
              "description": "The opacity of the labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelOverlap": {
          "anyOf": [
            {
              "$ref": "#/definitions/LabelOverlap"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\"parity\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\"greedy\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `true` for non-nominal fields with non-log scales; `\"greedy\"` for log scales; otherwise `false`."
        },
        "labelPadding": {
          "anyOf": [
            {
              "description": "The padding in pixels between labels and ticks.\n\n__Default value:__ `2`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelSeparation": {
          "anyOf": [
            {
              "description": "The minimum separation that must be between label bounding boxes for them to be considered non-overlapping (default `0`). This property is ignored if *labelOverlap* resolution is not enabled.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "maxExtent": {
          "anyOf": [
            {
              "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "minExtent": {
          "anyOf": [
            {
              "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The offset, in pixels, by which to displace the axis from the edge of the enclosing group or data rectangle.\n\n__Default value:__ derived from the [axis config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset` (`0` by default)"
        },
        "orient": {
          "anyOf": [
            {
              "$ref": "#/definitions/AxisOrient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y-axis oriented towards the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
        },
        "position": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The anchor position of the axis in pixels. For x-axes with top or bottom orientation, this sets the axis group x coordinate. For y-axes with left or right orientation, this sets the axis group y coordinate.\n\n__Default value__: `0`"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A string or array of strings indicating the name of custom styles to apply to the axis. A style is a named collection of axis property defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles.\n\n__Default value:__ (none) __Note:__ Any specified style will augment the default style. For example, an x-axis mark with `\"style\": \"foo\"` will use `config.axisX` and `config.style.foo` (the specified style `\"foo\"` has higher precedence)."
        },
        "tickBand": {
          "anyOf": [
            {
              "description": "For band scales, indicates if ticks and grid lines should be placed at the `\"center\"` of a band (default) or at the band `\"extent\"`s to indicate intervals",
              "enum": [
                "center",
                "extent"
              ],
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "tickCount": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/TimeInterval"
            },
            {
              "$ref": "#/definitions/TimeIntervalStep"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of 2, 5, 10) and lie within the underlying scale's range.\n\nFor scales of type `\"time\"` or `\"utc\"`, the tick count can instead be a time interval specifier. Legal string values are `\"millisecond\"`, `\"second\"`, `\"minute\"`, `\"hour\"`, `\"day\"`, `\"week\"`, `\"month\"`, and `\"year\"`. Alternatively, an object-valued interval specifier of the form `{\"interval\": \"month\", \"step\": 3}` includes a desired number of interval steps. Here, ticks are generated for each quarter (Jan, Apr, Jul, Oct) boundary.\n\n__Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)` for y.",
          "minimum": 0
        },
        "tickDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumberArray"
            }
          ]
        },
        "tickDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the tick mark dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickExtra": {
          "description": "Boolean flag indicating if an extra axis tick should be added for the initial position of the axis. This flag is useful for styling axes for `band` scales such that ticks are placed on band boundaries rather in the middle of a band. Use in conjunction with `\"bandPosition\": 1` and an axis `\"padding\"` value of `0`.",
          "type": "boolean"
        },
        "tickMinStep": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value."
        },
        "tickOffset": {
          "anyOf": [
            {
              "description": "Position offset in pixels to apply to ticks, labels, and gridlines.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the ticks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickRound": {
          "description": "Boolean flag indicating if pixel position values should be rounded to the nearest integer.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "tickSize": {
          "anyOf": [
            {
              "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickWidth": {
          "anyOf": [
            {
              "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment of axis titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAnchor": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleAnchor",
              "description": "Text anchor position for placing axis titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAngle": {
          "anyOf": [
            {
              "description": "Angle in degrees of axis titles.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline for axis titles. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of the title, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFont": {
          "anyOf": [
            {
              "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontSize": {
          "anyOf": [
            {
              "description": "Font size of the title.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style of the title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of axis titles.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the axis title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titlePadding": {
          "anyOf": [
            {
              "description": "The padding, in pixels, between title and axis.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleX": {
          "anyOf": [
            {
              "description": "X-coordinate of the axis title relative to the axis group.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleY": {
          "anyOf": [
            {
              "description": "Y-coordinate of the axis title relative to the axis group.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "translate": {
          "anyOf": [
            {
              "description": "Coordinate space translation offset for axis layout. By default, axes are translated by a 0.5 pixel offset for both the x and y coordinates in order to align stroked lines with the pixel grid. However, for vector graphics output these pixel-specific adjustments may be undesirable, in which case translate can be changed (for example, to zero).\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "values": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "boolean"
              },
              "type": "array"
            },
            {
              "items": {
                "$ref": "#/definitions/DateTime"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Explicitly set the visible axis tick values."
        },
        "zindex": {
          "description": "A non-negative integer indicating the z-index of the axis. If zindex is 0, axes should be drawn behind all chart elements. To put them in front, set `zindex` to `1` or more.\n\n__Default value:__ `0` (behind the marks).",
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "AxisConfig": {
      "additionalProperties": false,
      "properties": {
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the axis from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "bandPosition": {
          "anyOf": [
            {
              "description": "An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands.\n\n __Default value:__ `0.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of this axis for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If the `aria` property is true, for SVG output the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) will be set to this description. If the description is unspecified it will be automatically generated.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "disable": {
          "description": "Disable axis by default.",
          "type": "boolean"
        },
        "domain": {
          "description": "A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "domainCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for the domain line's ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of axis domain line.\n\n__Default value:__ `\"gray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed domain lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the domain dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the axis domain line.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "domainWidth": {
          "anyOf": [
            {
              "description": "Stroke width of axis domain line\n\n__Default value:__ `1`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "grid": {
          "description": "A boolean flag indicating if grid lines should be included as part of the axis\n\n__Default value:__ `true` for [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned; otherwise, `false`.",
          "type": "boolean"
        },
        "gridCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for grid lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gridColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of gridlines.\n\n__Default value:__ `\"lightGray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "gridDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed grid lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumberArray"
            }
          ]
        },
        "gridDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the grid dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "gridOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity of grid (value between [0,1])\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "gridWidth": {
          "anyOf": [
            {
              "description": "The grid width, in pixels.\n\n__Default value:__ `1`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelAlign"
            }
          ]
        },
        "labelAngle": {
          "anyOf": [
            {
              "description": "The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.",
              "maximum": 360,
              "minimum": -360,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelBaseline"
            }
          ]
        },
        "labelBound": {
          "anyOf": [
            {
              "description": "Indicates if labels should be hidden if they exceed the axis range. If `false` (the default) no bounds overlap analysis is performed. If `true`, labels will be hidden if they exceed the axis range by more than 1 pixel. If this property is a number, it specifies the pixel tolerance: the maximum amount by which a label bounding box may exceed the axis range.\n\n__Default value:__ `false`.",
              "type": [
                "number",
                "boolean"
              ]
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the tick label, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "labelExpr": {
          "description": "[Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.\n\n__Note:__ The label text and value can be assessed via the `label` and `value` properties of the axis's backing `datum` object.",
          "type": "string"
        },
        "labelFlush": {
          "description": "Indicates if the first and last axis labels should be aligned flush with the scale range. Flush alignment for a horizontal axis will left-align the first label and right-align the last label. For vertical axes, bottom and top text baselines are applied instead. If this property is a number, it also indicates the number of pixels by which to offset the first and last labels; for example, a value of 2 will flush-align the first and last labels and also push them 2 pixels outward from the center of the axis. The additional adjustment can sometimes help the labels better visually group with corresponding axis ticks.\n\n__Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.",
          "type": [
            "boolean",
            "number"
          ]
        },
        "labelFlushOffset": {
          "anyOf": [
            {
              "description": "Indicates the number of pixels by which to offset flush-adjusted labels. For example, a value of `2` will push flush-adjusted labels 2 pixels outward from the center of the axis. Offsets can help the labels better visually group with corresponding axis ticks.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFont": {
          "anyOf": [
            {
              "description": "The font of the tick label.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisString"
            }
          ]
        },
        "labelFontSize": {
          "anyOf": [
            {
              "description": "The font size of the label, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style of the title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelFontStyle"
            }
          ]
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight of axis tick labels."
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisLabelFontWeight"
            }
          ]
        },
        "labelLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of axis tick labels.\n\n__Default value:__ `180`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line label text or label text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOffset": {
          "anyOf": [
            {
              "description": "Position offset in pixels to apply to labels, in addition to tickOffset.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelOpacity": {
          "anyOf": [
            {
              "description": "The opacity of the labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelOverlap": {
          "anyOf": [
            {
              "$ref": "#/definitions/LabelOverlap"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\"parity\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\"greedy\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `true` for non-nominal fields with non-log scales; `\"greedy\"` for log scales; otherwise `false`."
        },
        "labelPadding": {
          "anyOf": [
            {
              "description": "The padding in pixels between labels and ticks.\n\n__Default value:__ `2`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "labelSeparation": {
          "anyOf": [
            {
              "description": "The minimum separation that must be between label bounding boxes for them to be considered non-overlapping (default `0`). This property is ignored if *labelOverlap* resolution is not enabled.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "maxExtent": {
          "anyOf": [
            {
              "description": "The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "minExtent": {
          "anyOf": [
            {
              "description": "The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The offset, in pixels, by which to displace the axis from the edge of the enclosing group or data rectangle.\n\n__Default value:__ derived from the [axis config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset` (`0` by default)"
        },
        "orient": {
          "anyOf": [
            {
              "$ref": "#/definitions/AxisOrient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The orientation of the axis. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`. The orientation can be used to further specialize the axis type (e.g., a y-axis oriented towards the right edge of the chart).\n\n__Default value:__ `\"bottom\"` for x-axes and `\"left\"` for y-axes."
        },
        "position": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The anchor position of the axis in pixels. For x-axes with top or bottom orientation, this sets the axis group x coordinate. For y-axes with left or right orientation, this sets the axis group y coordinate.\n\n__Default value__: `0`"
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A string or array of strings indicating the name of custom styles to apply to the axis. A style is a named collection of axis property defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles.\n\n__Default value:__ (none) __Note:__ Any specified style will augment the default style. For example, an x-axis mark with `\"style\": \"foo\"` will use `config.axisX` and `config.style.foo` (the specified style `\"foo\"` has higher precedence)."
        },
        "tickBand": {
          "anyOf": [
            {
              "description": "For band scales, indicates if ticks and grid lines should be placed at the `\"center\"` of a band (default) or at the band `\"extent\"`s to indicate intervals",
              "enum": [
                "center",
                "extent"
              ],
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for the tick lines' ending style. One of `\"butt\"`, `\"round\"` or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the axis's tick.\n\n__Default value:__ `\"gray\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisColor"
            }
          ]
        },
        "tickCount": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/TimeInterval"
            },
            {
              "$ref": "#/definitions/TimeIntervalStep"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \"nice\" (multiples of 2, 5, 10) and lie within the underlying scale's range.\n\nFor scales of type `\"time\"` or `\"utc\"`, the tick count can instead be a time interval specifier. Legal string values are `\"millisecond\"`, `\"second\"`, `\"minute\"`, `\"hour\"`, `\"day\"`, `\"week\"`, `\"month\"`, and `\"year\"`. Alternatively, an object-valued interval specifier of the form `{\"interval\": \"month\", \"step\": 3}` includes a desired number of interval steps. Here, ticks are generated for each quarter (Jan, Apr, Jul, Oct) boundary.\n\n__Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)` for y.",
          "minimum": 0
        },
        "tickDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed tick mark lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumberArray"
            }
          ]
        },
        "tickDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the tick mark dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickExtra": {
          "description": "Boolean flag indicating if an extra axis tick should be added for the initial position of the axis. This flag is useful for styling axes for `band` scales such that ticks are placed on band boundaries rather in the middle of a band. Use in conjunction with `\"bandPosition\": 1` and an axis `\"padding\"` value of `0`.",
          "type": "boolean"
        },
        "tickMinStep": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value."
        },
        "tickOffset": {
          "anyOf": [
            {
              "description": "Position offset in pixels to apply to ticks, labels, and gridlines.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the ticks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickRound": {
          "description": "Boolean flag indicating if pixel position values should be rounded to the nearest integer.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "tickSize": {
          "anyOf": [
            {
              "description": "The size in pixels of axis ticks.\n\n__Default value:__ `5`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "tickWidth": {
          "anyOf": [
            {
              "description": "The width, in pixels, of ticks.\n\n__Default value:__ `1`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ConditionalAxisNumber"
            }
          ]
        },
        "ticks": {
          "description": "Boolean value that determines whether the axis should include ticks.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment of axis titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAnchor": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleAnchor",
              "description": "Text anchor position for placing axis titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAngle": {
          "anyOf": [
            {
              "description": "Angle in degrees of axis titles.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline for axis titles. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Color of the title, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFont": {
          "anyOf": [
            {
              "description": "Font of the title. (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontSize": {
          "anyOf": [
            {
              "description": "Font size of the title.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style of the title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight of the title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of axis titles.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the axis title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titlePadding": {
          "anyOf": [
            {
              "description": "The padding, in pixels, between title and axis.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleX": {
          "anyOf": [
            {
              "description": "X-coordinate of the axis title relative to the axis group.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleY": {
          "anyOf": [
            {
              "description": "Y-coordinate of the axis title relative to the axis group.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "translate": {
          "anyOf": [
            {
              "description": "Coordinate space translation offset for axis layout. By default, axes are translated by a 0.5 pixel offset for both the x and y coordinates in order to align stroked lines with the pixel grid. However, for vector graphics output these pixel-specific adjustments may be undesirable, in which case translate can be changed (for example, to zero).\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "values": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "boolean"
              },
              "type": "array"
            },
            {
              "items": {
                "$ref": "#/definitions/DateTime"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Explicitly set the visible axis tick values."
        },
        "zindex": {
          "description": "A non-negative integer indicating the z-index of the axis. If zindex is 0, axes should be drawn behind all chart elements. To put them in front, set `zindex` to `1` or more.\n\n__Default value:__ `0` (behind the marks).",
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "AxisOrient": {
      "enum": [
        "top",
        "bottom",
        "left",
        "right"
      ],
      "type": "string"
    },
    "AxisResolveMap": {
      "additionalProperties": false,
      "properties": {
        "x": {
          "$ref": "#/definitions/ResolveMode"
        },
        "y": {
          "$ref": "#/definitions/ResolveMode"
        }
      },
      "type": "object"
    },
    "BBox": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "maxItems": 4,
          "minItems": 4,
          "type": "array"
        },
        {
          "items": {
            "type": "number"
          },
          "maxItems": 6,
          "minItems": 6,
          "type": "array"
        }
      ],
      "description": "Bounding box https://tools.ietf.org/html/rfc7946#section-5"
    },
    "BarConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "binSpacing": {
          "description": "Offset between bars for binned field. The ideal value for this is either 0 (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "continuousBandSize": {
          "description": "The default size of the bars on continuous scales.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusEnd": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For vertical bars, top-left and top-right corner radius.\n\n- For horizontal bars, top-right and bottom-right corner radius."
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "discreteBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RelativeBandSize"
            }
          ],
          "description": "The default size of the bars with discrete dimensions. If unspecified, the default size is  `step-2`, which provides 2 pixel offset between bars.",
          "minimum": 0
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "minBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum band size for bar and rectangle marks. __Default value:__ `0.25`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "BaseTitleNoValueRefs": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment for title text. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "anchor": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleAnchor",
              "description": "The anchor position for placing the title and subtitle text. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "angle": {
          "anyOf": [
            {
              "description": "Angle in degrees of title and subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the title from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "$ref": "#/definitions/TextBaseline",
          "description": "Vertical text baseline for title and subtitle text. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
        },
        "color": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Text color for title text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "Delta offset for title and subtitle text x-coordinate.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "Delta offset for title and subtitle text y-coordinate.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "font": {
          "anyOf": [
            {
              "description": "Font name for title text.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "Font size in pixels for title text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style for title text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight for title text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "frame": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/TitleFrame"
                },
                {
                  "type": "string"
                }
              ],
              "description": "The reference frame for the anchor position, one of `\"bounds\"` (to anchor relative to the full bounding box) or `\"group\"` (to anchor relative to the group width or height)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum allowed length in pixels of title and subtitle text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "description": "The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "orient": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleOrient",
              "description": "Default title orientation (`\"top\"`, `\"bottom\"`, `\"left\"`, or `\"right\"`)"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Text color for subtitle text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFont": {
          "anyOf": [
            {
              "description": "Font name for subtitle text.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontSize": {
          "anyOf": [
            {
              "description": "Font size in pixels for subtitle text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style for subtitle text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight for subtitle text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitlePadding": {
          "anyOf": [
            {
              "description": "The padding in pixels between title and subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "zindex": {
          "anyOf": [
            {
              "description": "The integer z-index indicating the layering of the title group relative to other axis, mark, and legend groups.\n\n__Default value:__ `0`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        }
      },
      "type": "object"
    },
    "Baseline": {
      "enum": [
        "top",
        "middle",
        "bottom"
      ],
      "type": "string"
    },
    "BinExtent": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        {
          "$ref": "#/definitions/ParameterExtent"
        }
      ]
    },
    "BinParams": {
      "additionalProperties": false,
      "description": "Binning properties or boolean flag for determining whether to bin data or not.",
      "properties": {
        "anchor": {
          "description": "A value in the binned domain at which to anchor the bins, shifting the bin boundaries if necessary to ensure that a boundary aligns with the anchor value.\n\n__Default value:__ the minimum bin extent value",
          "type": "number"
        },
        "base": {
          "description": "The number base to use for automatic bin determination (default is base 10).\n\n__Default value:__ `10`",
          "type": "number"
        },
        "binned": {
          "description": "When set to `true`, Vega-Lite treats the input data as already binned.",
          "type": "boolean"
        },
        "divide": {
          "description": "Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints.\n\n__Default value:__ `[5, 2]`",
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 1,
          "type": "array"
        },
        "extent": {
          "$ref": "#/definitions/BinExtent",
          "description": "A two-element (`[min, max]`) array indicating the range of desired bin values."
        },
        "maxbins": {
          "description": "Maximum number of bins.\n\n__Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels",
          "minimum": 2,
          "type": "number"
        },
        "minstep": {
          "description": "A minimum allowable step size (particularly useful for integer values).",
          "type": "number"
        },
        "nice": {
          "description": "If true, attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten.\n\n__Default value:__ `true`",
          "type": "boolean"
        },
        "step": {
          "description": "An exact step size to use between bins.\n\n__Note:__ If provided, options such as maxbins will be ignored.",
          "type": "number"
        },
        "steps": {
          "description": "An array of allowable step sizes to choose from.",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "type": "array"
        }
      },
      "type": "object"
    },
    "BinTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldName"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldName"
              },
              "type": "array"
            }
          ],
          "description": "The output fields at which to write the start and end bin values. This can be either a string or an array of strings with two elements denoting the name for the fields for bin start and bin end respectively. If a single string (e.g., `\"val\"`) is provided, the end field will be `\"val_end\"`."
        },
        "bin": {
          "anyOf": [
            {
              "const": true,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            }
          ],
          "description": "An object indicating bin properties, or simply `true` for using default bin parameters."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field to bin."
        }
      },
      "required": [
        "bin",
        "field",
        "as"
      ],
      "type": "object"
    },
    "BindCheckbox": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "element": {
          "$ref": "#/definitions/Element",
          "description": "An optional CSS selector string indicating the parent element to which the input element should be added. By default, all input elements are added within the parent container of the Vega view."
        },
        "input": {
          "const": "checkbox",
          "type": "string"
        },
        "name": {
          "description": "By default, the signal name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound signal.",
          "type": "string"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    },
    "BindDirect": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "element": {
          "anyOf": [
            {
              "$ref": "#/definitions/Element"
            },
            {
              "additionalProperties": false,
              "type": "object"
            }
          ],
          "description": "An input element that exposes a _value_ property and supports the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface, or a CSS selector string to such an element. When the element updates and dispatches an event, the _value_ property will be used as the new, bound signal value. When the signal updates independent of the element, the _value_ property will be set to the signal value and a new event will be dispatched on the element."
        },
        "event": {
          "description": "The event (default `\"input\"`) to listen for to track changes on the external element.",
          "type": "string"
        }
      },
      "required": [
        "element"
      ],
      "type": "object"
    },
    "BindInput": {
      "additionalProperties": false,
      "properties": {
        "autocomplete": {
          "description": "A hint for form autofill. See the [HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for additional information.",
          "type": "string"
        },
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "element": {
          "$ref": "#/definitions/Element",
          "description": "An optional CSS selector string indicating the parent element to which the input element should be added. By default, all input elements are added within the parent container of the Vega view."
        },
        "input": {
          "description": "The type of input element to use. The valid values are `\"checkbox\"`, `\"radio\"`, `\"range\"`, `\"select\"`, and any other legal [HTML form input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).",
          "type": "string"
        },
        "name": {
          "description": "By default, the signal name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound signal.",
          "type": "string"
        },
        "placeholder": {
          "description": "Text that appears in the form control when it has no value set.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "BindRadioSelect": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "element": {
          "$ref": "#/definitions/Element",
          "description": "An optional CSS selector string indicating the parent element to which the input element should be added. By default, all input elements are added within the parent container of the Vega view."
        },
        "input": {
          "enum": [
            "radio",
            "select"
          ],
          "type": "string"
        },
        "labels": {
          "description": "An array of label strings to represent the `options` values. If unspecified, the `options` value will be coerced to a string and used as the label.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "name": {
          "description": "By default, the signal name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound signal.",
          "type": "string"
        },
        "options": {
          "description": "An array of options to select from.",
          "items": {},
          "type": "array"
        }
      },
      "required": [
        "input",
        "options"
      ],
      "type": "object"
    },
    "BindRange": {
      "additionalProperties": false,
      "properties": {
        "debounce": {
          "description": "If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.",
          "type": "number"
        },
        "element": {
          "$ref": "#/definitions/Element",
          "description": "An optional CSS selector string indicating the parent element to which the input element should be added. By default, all input elements are added within the parent container of the Vega view."
        },
        "input": {
          "const": "range",
          "type": "string"
        },
        "max": {
          "description": "Sets the maximum slider value. Defaults to the larger of the signal value and `100`.",
          "type": "number"
        },
        "min": {
          "description": "Sets the minimum slider value. Defaults to the smaller of the signal value and `0`.",
          "type": "number"
        },
        "name": {
          "description": "By default, the signal name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound signal.",
          "type": "string"
        },
        "step": {
          "description": "Sets the minimum slider increment. If undefined, the step size will be automatically determined based on the `min` and `max` values.",
          "type": "number"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    },
    "Binding": {
      "anyOf": [
        {
          "$ref": "#/definitions/BindCheckbox"
        },
        {
          "$ref": "#/definitions/BindRadioSelect"
        },
        {
          "$ref": "#/definitions/BindRange"
        },
        {
          "$ref": "#/definitions/BindInput"
        },
        {
          "$ref": "#/definitions/BindDirect"
        }
      ]
    },
    "BinnedTimeUnit": {
      "anyOf": [
        {
          "enum": [
            "binnedyear",
            "binnedyearquarter",
            "binnedyearquartermonth",
            "binnedyearmonth",
            "binnedyearmonthdate",
            "binnedyearmonthdatehours",
            "binnedyearmonthdatehoursminutes",
            "binnedyearmonthdatehoursminutesseconds",
            "binnedyearweek",
            "binnedyearweekday",
            "binnedyearweekdayhours",
            "binnedyearweekdayhoursminutes",
            "binnedyearweekdayhoursminutesseconds",
            "binnedyeardayofyear"
          ],
          "type": "string"
        },
        {
          "enum": [
            "binnedutcyear",
            "binnedutcyearquarter",
            "binnedutcyearquartermonth",
            "binnedutcyearmonth",
            "binnedutcyearmonthdate",
            "binnedutcyearmonthdatehours",
            "binnedutcyearmonthdatehoursminutes",
            "binnedutcyearmonthdatehoursminutesseconds",
            "binnedutcyearweek",
            "binnedutcyearweekday",
            "binnedutcyearweekdayhours",
            "binnedutcyearweekdayhoursminutes",
            "binnedutcyearweekdayhoursminutesseconds",
            "binnedutcyeardayofyear"
          ],
          "type": "string"
        }
      ]
    },
    "Blend": {
      "enum": [
        null,
        "multiply",
        "screen",
        "overlay",
        "darken",
        "lighten",
        "color-dodge",
        "color-burn",
        "hard-light",
        "soft-light",
        "difference",
        "exclusion",
        "hue",
        "saturation",
        "color",
        "luminosity"
      ],
      "type": [
        "null",
        "string"
      ]
    },
    "BoxPlot": {
      "const": "boxplot",
      "type": "string"
    },
    "BoxPlotConfig": {
      "additionalProperties": false,
      "properties": {
        "box": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "extent": {
          "anyOf": [
            {
              "const": "min-max",
              "type": "string"
            },
            {
              "type": "number"
            }
          ],
          "description": "The extent of the whiskers. Available options include:\n- `\"min-max\"`: min and max are the lower and upper whiskers respectively.\n- A number representing multiple of the interquartile range. This number will be multiplied by the IQR to determine whisker boundary, which spans from the smallest data to the largest data within the range _[Q1 - k * IQR, Q3 + k * IQR]_ where _Q1_ and _Q3_ are the first and third quartiles while _IQR_ is the interquartile range (_Q3-Q1_).\n\n__Default value:__ `1.5`."
        },
        "median": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "outliers": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "rule": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "size": {
          "description": "Size of the box and median tick of a box plot",
          "type": "number"
        },
        "ticks": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        }
      },
      "type": "object"
    },
    "BoxPlotDef": {
      "additionalProperties": false,
      "properties": {
        "box": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "clip": {
          "description": "Whether a composite mark be clipped to the enclosing group’s width and height.",
          "type": "boolean"
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "extent": {
          "anyOf": [
            {
              "const": "min-max",
              "type": "string"
            },
            {
              "type": "number"
            }
          ],
          "description": "The extent of the whiskers. Available options include:\n- `\"min-max\"`: min and max are the lower and upper whiskers respectively.\n- A number representing multiple of the interquartile range. This number will be multiplied by the IQR to determine whisker boundary, which spans from the smallest data to the largest data within the range _[Q1 - k * IQR, Q3 + k * IQR]_ where _Q1_ and _Q3_ are the first and third quartiles while _IQR_ is the interquartile range (_Q3-Q1_).\n\n__Default value:__ `1.5`."
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "median": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "opacity": {
          "description": "The opacity (value between [0,1]) of the mark.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "Orientation of the box plot. This is normally automatically determined based on types of fields on x and y channels. However, an explicit `orient` be specified when the orientation is ambiguous.\n\n__Default value:__ `\"vertical\"`."
        },
        "outliers": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "rule": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "size": {
          "description": "Size of the box and median tick of a box plot",
          "type": "number"
        },
        "ticks": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "type": {
          "$ref": "#/definitions/BoxPlot",
          "description": "The mark type. This could a primitive mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"geoshape\"`, `\"rule\"`, and `\"text\"`) or a composite mark type (`\"boxplot\"`, `\"errorband\"`, `\"errorbar\"`)."
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "BrushConfig": {
      "additionalProperties": false,
      "properties": {
        "cursor": {
          "$ref": "#/definitions/Cursor",
          "description": "The mouse cursor used over the interval mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
        },
        "fill": {
          "$ref": "#/definitions/Color",
          "description": "The fill color of the interval mark.\n\n__Default value:__ `\"#333333\"`"
        },
        "fillOpacity": {
          "description": "The fill opacity of the interval mark (a value between `0` and `1`).\n\n__Default value:__ `0.125`",
          "type": "number"
        },
        "stroke": {
          "$ref": "#/definitions/Color",
          "description": "The stroke color of the interval mark.\n\n__Default value:__ `\"#ffffff\"`"
        },
        "strokeDash": {
          "description": "An array of alternating stroke and space lengths, for creating dashed or dotted lines.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "strokeDashOffset": {
          "description": "The offset (in pixels) with which to begin drawing the stroke dash array.",
          "type": "number"
        },
        "strokeOpacity": {
          "description": "The stroke opacity of the interval mark (a value between `0` and `1`).",
          "type": "number"
        },
        "strokeWidth": {
          "description": "The stroke width of the interval mark.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "CalculateTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The field for storing the computed formula value."
        },
        "calculate": {
          "description": "A [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string. Use the variable `datum` to refer to the current data object.",
          "type": "string"
        }
      },
      "required": [
        "calculate",
        "as"
      ],
      "type": "object"
    },
    "Categorical": {
      "enum": [
        "accent",
        "category10",
        "category20",
        "category20b",
        "category20c",
        "dark2",
        "paired",
        "pastel1",
        "pastel2",
        "set1",
        "set2",
        "set3",
        "tableau10",
        "tableau20"
      ],
      "type": "string"
    },
    "Color": {
      "anyOf": [
        {
          "$ref": "#/definitions/ColorName"
        },
        {
          "$ref": "#/definitions/HexColor"
        },
        {
          "type": "string"
        }
      ]
    },
    "ColorDef": {
      "$ref": "#/definitions/MarkPropDef<(Gradient|string|null)>"
    },
    "ColorName": {
      "enum": [
        "black",
        "silver",
        "gray",
        "white",
        "maroon",
        "red",
        "purple",
        "fuchsia",
        "green",
        "lime",
        "olive",
        "yellow",
        "navy",
        "blue",
        "teal",
        "aqua",
        "orange",
        "aliceblue",
        "antiquewhite",
        "aquamarine",
        "azure",
        "beige",
        "bisque",
        "blanchedalmond",
        "blueviolet",
        "brown",
        "burlywood",
        "cadetblue",
        "chartreuse",
        "chocolate",
        "coral",
        "cornflowerblue",
        "cornsilk",
        "crimson",
        "cyan",
        "darkblue",
        "darkcyan",
        "darkgoldenrod",
        "darkgray",
        "darkgreen",
        "darkgrey",
        "darkkhaki",
        "darkmagenta",
        "darkolivegreen",
        "darkorange",
        "darkorchid",
        "darkred",
        "darksalmon",
        "darkseagreen",
        "darkslateblue",
        "darkslategray",
        "darkslategrey",
        "darkturquoise",
        "darkviolet",
        "deeppink",
        "deepskyblue",
        "dimgray",
        "dimgrey",
        "dodgerblue",
        "firebrick",
        "floralwhite",
        "forestgreen",
        "gainsboro",
        "ghostwhite",
        "gold",
        "goldenrod",
        "greenyellow",
        "grey",
        "honeydew",
        "hotpink",
        "indianred",
        "indigo",
        "ivory",
        "khaki",
        "lavender",
        "lavenderblush",
        "lawngreen",
        "lemonchiffon",
        "lightblue",
        "lightcoral",
        "lightcyan",
        "lightgoldenrodyellow",
        "lightgray",
        "lightgreen",
        "lightgrey",
        "lightpink",
        "lightsalmon",
        "lightseagreen",
        "lightskyblue",
        "lightslategray",
        "lightslategrey",
        "lightsteelblue",
        "lightyellow",
        "limegreen",
        "linen",
        "magenta",
        "mediumaquamarine",
        "mediumblue",
        "mediumorchid",
        "mediumpurple",
        "mediumseagreen",
        "mediumslateblue",
        "mediumspringgreen",
        "mediumturquoise",
        "mediumvioletred",
        "midnightblue",
        "mintcream",
        "mistyrose",
        "moccasin",
        "navajowhite",
        "oldlace",
        "olivedrab",
        "orangered",
        "orchid",
        "palegoldenrod",
        "palegreen",
        "paleturquoise",
        "palevioletred",
        "papayawhip",
        "peachpuff",
        "peru",
        "pink",
        "plum",
        "powderblue",
        "rosybrown",
        "royalblue",
        "saddlebrown",
        "salmon",
        "sandybrown",
        "seagreen",
        "seashell",
        "sienna",
        "skyblue",
        "slateblue",
        "slategray",
        "slategrey",
        "snow",
        "springgreen",
        "steelblue",
        "tan",
        "thistle",
        "tomato",
        "turquoise",
        "violet",
        "wheat",
        "whitesmoke",
        "yellowgreen",
        "rebeccapurple"
      ],
      "type": "string"
    },
    "ColorScheme": {
      "anyOf": [
        {
          "$ref": "#/definitions/Categorical"
        },
        {
          "$ref": "#/definitions/SequentialSingleHue"
        },
        {
          "$ref": "#/definitions/SequentialMultiHue"
        },
        {
          "$ref": "#/definitions/Diverging"
        },
        {
          "$ref": "#/definitions/Cyclical"
        }
      ]
    },
    "Encoding": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Rotation angle of point and text marks."
        },
        "color": {
          "$ref": "#/definitions/ColorDef",
          "description": "Color of the marks – either fill or stroke color based on  the `filled` property of mark definition. By default, `color` represents fill color for `\"area\"`, `\"bar\"`, `\"tick\"`, `\"text\"`, `\"trail\"`, `\"circle\"`, and `\"square\"` / stroke color for `\"line\"` and `\"point\"`.\n\n__Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. The `fill` or `stroke` encodings have higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified. 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme)."
        },
        "description": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "A text description of this mark for ARIA accessibility (SVG output only). For SVG output the `\"aria-label\"` attribute will be set to this description."
        },
        "detail": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldDefWithoutScale"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldDefWithoutScale"
              },
              "type": "array"
            }
          ],
          "description": "Additional levels of detail for grouping data in aggregate views and in line, trail, and area marks without mapping data to a specific visual channel."
        },
        "fill": {
          "$ref": "#/definitions/ColorDef",
          "description": "Fill color of the marks. __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ The `fill` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "fillOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Fill opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity` property."
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "A URL to load upon mouse click."
        },
        "key": {
          "$ref": "#/definitions/FieldDefWithoutScale",
          "description": "A data field to use as a unique key for data binding. When a visualization’s data is updated, the key value will be used to match data elements to existing mark instances. Use a key channel to enable object constancy for transitions over dynamic data."
        },
        "latitude": {
          "$ref": "#/definitions/LatLongDef",
          "description": "Latitude position of geographically projected marks."
        },
        "latitude2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Latitude-2 position for geographically projected ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`."
        },
        "longitude": {
          "$ref": "#/definitions/LatLongDef",
          "description": "Longitude position of geographically projected marks."
        },
        "longitude2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Longitude-2 position for geographically projected ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`."
        },
        "opacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity` property."
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/OrderFieldDef"
            },
            {
              "items": {
                "$ref": "#/definitions/OrderFieldDef"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/OrderValueDef"
            },
            {
              "$ref": "#/definitions/OrderOnlyDef"
            }
          ],
          "description": "Order of the marks.\n- For stacked marks, this `order` channel encodes [stack order](https://vega.github.io/vega-lite/docs/stack.html#order).\n- For line and trail marks, this `order` channel encodes order of data points in the lines. This can be useful for creating [a connected scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html). Setting `order` to `{\"value\": null}` makes the line marks use the original order in the data sources.\n- Otherwise, this `order` channel encodes layer order of the marks.\n\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping."
        },
        "radius": {
          "$ref": "#/definitions/PolarDef",
          "description": "The outer radius in pixels of arc marks."
        },
        "radius2": {
          "$ref": "#/definitions/Position2Def",
          "description": "The inner radius in pixels of arc marks."
        },
        "shape": {
          "$ref": "#/definitions/ShapeDef",
          "description": "Shape of the mark.\n\n1. For `point` marks the supported values include:   - plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.   - the line symbol `\"stroke\"`   - centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`   - a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n2. For `geoshape` marks it should be a field definition of the geojson data\n\n__Default value:__ If undefined, the default shape depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape` property. (`\"circle\"` if unset.)"
        },
        "size": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Size of the mark.\n- For `\"point\"`, `\"square\"` and `\"circle\"`, – the symbol size, or pixel area of the mark.\n- For `\"bar\"` and `\"tick\"` – the bar and tick's size.\n- For `\"text\"` – the text's font size.\n- Size is unsupported for `\"line\"`, `\"area\"`, and `\"rect\"`. (Use `\"trail\"` instead of line with varying size)"
        },
        "stroke": {
          "$ref": "#/definitions/ColorDef",
          "description": "Stroke color of the marks. __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "strokeDash": {
          "$ref": "#/definitions/NumericArrayMarkPropDef",
          "description": "Stroke dash of the marks.\n\n__Default value:__ `[1,0]` (No dash)."
        },
        "strokeOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity` property."
        },
        "strokeWidth": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke width of the marks.\n\n__Default value:__ If undefined, the default stroke width depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth` property."
        },
        "text": {
          "$ref": "#/definitions/TextDef",
          "description": "Text of the `text` mark."
        },
        "theta": {
          "$ref": "#/definitions/PolarDef",
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians."
        },
        "theta2": {
          "$ref": "#/definitions/Position2Def",
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "tooltip": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            },
            {
              "items": {
                "$ref": "#/definitions/StringFieldDef"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the `tooltip` property in the mark definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip in Vega-Lite."
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "The URL of an image mark."
        },
        "x": {
          "$ref": "#/definitions/PositionDef",
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "$ref": "#/definitions/Position2Def",
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "xError": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Error value of x coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "xError2": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Secondary error value of x coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "xOffset": {
          "$ref": "#/definitions/OffsetDef",
          "description": "Offset of x-position of the marks"
        },
        "y": {
          "$ref": "#/definitions/PositionDef",
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "yError": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Error value of y coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "yError2": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Secondary error value of y coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "yOffset": {
          "$ref": "#/definitions/OffsetDef",
          "description": "Offset of y-position of the marks"
        }
      },
      "type": "object"
    },
    "CompositeMark": {
      "anyOf": [
        {
          "$ref": "#/definitions/BoxPlot"
        },
        {
          "$ref": "#/definitions/ErrorBar"
        },
        {
          "$ref": "#/definitions/ErrorBand"
        }
      ]
    },
    "CompositeMarkDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/BoxPlotDef"
        },
        {
          "$ref": "#/definitions/ErrorBarDef"
        },
        {
          "$ref": "#/definitions/ErrorBandDef"
        }
      ]
    },
    "CompositionConfig": {
      "additionalProperties": false,
      "properties": {
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "spacing": {
          "description": "The default spacing in pixels between composed sub-views.\n\n__Default value__: `20`",
          "type": "number"
        }
      },
      "type": "object"
    },
    "ConditionalMarkPropFieldOrDatumDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<MarkPropFieldOrDatumDef>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<MarkPropFieldOrDatumDef>"
        }
      ]
    },
    "ConditionalMarkPropFieldOrDatumDef<TypeForShape>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<MarkPropFieldOrDatumDef<TypeForShape>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<MarkPropFieldOrDatumDef<TypeForShape>>"
        }
      ]
    },
    "ConditionalStringFieldDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<StringFieldDef>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<StringFieldDef>"
        }
      ]
    },
    "ConditionalValueDef<(Gradient|string|null|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(Gradient|string|null|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(Gradient|string|null|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<(Text|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(Text|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(Text|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<(number[]|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(number[]|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(number[]|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<(number|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(number|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(number|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<(string|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(string|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(string|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<(string|null|ExprRef)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<(string|null|ExprRef)>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<(string|null|ExprRef)>>"
        }
      ]
    },
    "ConditionalValueDef<number>": {
      "anyOf": [
        {
          "$ref": "#/definitions/ConditionalPredicate<ValueDef<number>>"
        },
        {
          "$ref": "#/definitions/ConditionalParameter<ValueDef<number>>"
        }
      ]
    },
    "ConditionalAxisColor": {
      "$ref": "#/definitions/ConditionalAxisProperty<(Color|null)>"
    },
    "ConditionalAxisLabelAlign": {
      "$ref": "#/definitions/ConditionalAxisProperty<(Align|null)>"
    },
    "ConditionalAxisLabelBaseline": {
      "$ref": "#/definitions/ConditionalAxisProperty<(TextBaseline|null)>"
    },
    "ConditionalAxisLabelFontStyle": {
      "$ref": "#/definitions/ConditionalAxisProperty<(FontStyle|null)>"
    },
    "ConditionalAxisLabelFontWeight": {
      "$ref": "#/definitions/ConditionalAxisProperty<(FontWeight|null)>"
    },
    "ConditionalAxisNumber": {
      "$ref": "#/definitions/ConditionalAxisProperty<(number|null)>"
    },
    "ConditionalAxisNumberArray": {
      "$ref": "#/definitions/ConditionalAxisProperty<(number[]|null)>"
    },
    "ConditionalAxisProperty<(Align|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Align|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Align|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Align"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Align|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Align|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(Color|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Color|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Color|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Color"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Color|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(Color|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(FontStyle|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontStyle|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontStyle|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/FontStyle"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontStyle|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontStyle|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(FontWeight|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontWeight|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontWeight|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/FontWeight"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontWeight|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(FontWeight|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(TextBaseline|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(TextBaseline|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(TextBaseline|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TextBaseline"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(TextBaseline|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(TextBaseline|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(number[]|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number[]|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number[]|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number[]|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number[]|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(number|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": [
                "number",
                "null"
              ]
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(number|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisProperty<(string|null)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(string|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(string|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "condition",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "condition": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(string|null)>|ExprRef)>"
                },
                {
                  "items": {
                    "$ref": "#/definitions/ConditionalPredicate<(ValueDef<(string|null)>|ExprRef)>"
                  },
                  "type": "array"
                }
              ]
            },
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            }
          },
          "required": [
            "condition",
            "expr"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalAxisString": {
      "$ref": "#/definitions/ConditionalAxisProperty<(string|null)>"
    },
    "ConditionalParameter<MarkPropFieldOrDatumDef>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "empty": {
              "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
              "type": "boolean"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "Filter using a parameter name."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "empty": {
              "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
              "type": "boolean"
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "Filter using a parameter name."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalParameter<MarkPropFieldOrDatumDef<TypeForShape>>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "empty": {
              "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
              "type": "boolean"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "Filter using a parameter name."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/TypeForShape",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "empty": {
              "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
              "type": "boolean"
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "Filter using a parameter name."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalParameter<StringFieldDef>": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "required": [
        "param"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(Gradient|string|null|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(Text|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(number[]|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(number|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(string|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<(string|null|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalParameter<ValueDef<number>>": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        },
        "value": {
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
          "type": "number"
        }
      },
      "required": [
        "param",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<(ValueDef<(Align|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Align"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(Color|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Color"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(FontStyle|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/FontStyle"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(FontWeight|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/FontWeight"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(TextBaseline|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TextBaseline"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(number[]|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(number|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": [
                "number",
                "null"
              ]
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<(ValueDef<(string|null)>|ExprRef)>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "test",
            "value"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "expr": {
              "description": "Vega expression (which can refer to Vega-Lite parameters).",
              "type": "string"
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            }
          },
          "required": [
            "expr",
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<MarkPropFieldOrDatumDef>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "test"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<MarkPropFieldOrDatumDef<TypeForShape>>": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/TypeForShape",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "test"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "test": {
              "$ref": "#/definitions/PredicateComposition",
              "description": "Predicate for triggering the condition"
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "required": [
            "test"
          ],
          "type": "object"
        }
      ]
    },
    "ConditionalPredicate<StringFieldDef>": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "required": [
        "test"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(Gradient|string|null|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(Text|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(number[]|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(number|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(string|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<(string|null|ExprRef)>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "ConditionalPredicate<ValueDef<number>>": {
      "additionalProperties": false,
      "properties": {
        "test": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "Predicate for triggering the condition"
        },
        "value": {
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
          "type": "number"
        }
      },
      "required": [
        "test",
        "value"
      ],
      "type": "object"
    },
    "Config": {
      "additionalProperties": false,
      "properties": {
        "arc": {
          "$ref": "#/definitions/RectConfig",
          "description": "Arc-specific Config"
        },
        "area": {
          "$ref": "#/definitions/AreaConfig",
          "description": "Area-Specific Config"
        },
        "aria": {
          "description": "A boolean flag indicating if ARIA default attributes should be included for marks and guides (SVG output only). If false, the `\"aria-hidden\"` attribute will be set for all guides, removing them from the ARIA accessibility tree and Vega-Lite will not generate default descriptions for marks.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "axis": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Axis configuration, which determines default properties for all `x` and `y` [axes](https://vega.github.io/vega-lite/docs/axis.html). For a full list of axis configuration options, please see the [corresponding section of the axis documentation](https://vega.github.io/vega-lite/docs/axis.html#config)."
        },
        "axisBand": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for axes with \"band\" scales."
        },
        "axisBottom": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-axis along the bottom edge of the chart."
        },
        "axisDiscrete": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for axes with \"point\" or \"band\" scales."
        },
        "axisLeft": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-axis along the left edge of the chart."
        },
        "axisPoint": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for axes with \"point\" scales."
        },
        "axisQuantitative": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for quantitative axes."
        },
        "axisRight": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-axis along the right edge of the chart."
        },
        "axisTemporal": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for temporal axes."
        },
        "axisTop": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-axis along the top edge of the chart."
        },
        "axisX": {
          "$ref": "#/definitions/AxisConfig",
          "description": "X-axis specific config."
        },
        "axisXBand": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-axes with \"band\" scales."
        },
        "axisXDiscrete": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-axes with \"point\" or \"band\" scales."
        },
        "axisXPoint": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-axes with \"point\" scales."
        },
        "axisXQuantitative": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-quantitative axes."
        },
        "axisXTemporal": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for x-temporal axes."
        },
        "axisY": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Y-axis specific config."
        },
        "axisYBand": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-axes with \"band\" scales."
        },
        "axisYDiscrete": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-axes with \"point\" or \"band\" scales."
        },
        "axisYPoint": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-axes with \"point\" scales."
        },
        "axisYQuantitative": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-quantitative axes."
        },
        "axisYTemporal": {
          "$ref": "#/definitions/AxisConfig",
          "description": "Config for y-temporal axes."
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bar": {
          "$ref": "#/definitions/BarConfig",
          "description": "Bar-Specific Config"
        },
        "boxplot": {
          "$ref": "#/definitions/BoxPlotConfig",
          "description": "Box Config"
        },
        "circle": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Circle-Specific Config"
        },
        "concat": {
          "$ref": "#/definitions/CompositionConfig",
          "description": "Default configuration for all concatenation and repeat view composition operators (`concat`, `hconcat`, `vconcat`, and `repeat`)"
        },
        "countTitle": {
          "description": "Default axis and legend title for count fields.\n\n__Default value:__ `'Count of Records`.",
          "type": "string"
        },
        "customFormatTypes": {
          "description": "Allow the `formatType` property for text marks and guides to accept a custom formatter function [registered as a Vega expression](https://vega.github.io/vega-lite/usage/compile.html#format-type).",
          "type": "boolean"
        },
        "errorband": {
          "$ref": "#/definitions/ErrorBandConfig",
          "description": "ErrorBand Config"
        },
        "errorbar": {
          "$ref": "#/definitions/ErrorBarConfig",
          "description": "ErrorBar Config"
        },
        "facet": {
          "$ref": "#/definitions/CompositionConfig",
          "description": "Default configuration for the `facet` view composition operator"
        },
        "fieldTitle": {
          "description": "Defines how Vega-Lite generates title for fields. There are three possible styles:\n- `\"verbal\"` (Default) - displays function in a verbal style (e.g., \"Sum of field\", \"Year-month of date\", \"field (binned)\").\n- `\"function\"` - displays function using parentheses and capitalized texts (e.g., \"SUM(field)\", \"YEARMONTH(date)\", \"BIN(field)\").\n- `\"plain\"` - displays only the field name without functions (e.g., \"field\", \"date\", \"field\").",
          "enum": [
            "verbal",
            "functional",
            "plain"
          ],
          "type": "string"
        },
        "font": {
          "description": "Default font for all text marks, titles, and labels.",
          "type": "string"
        },
        "geoshape": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Geoshape-Specific Config"
        },
        "header": {
          "$ref": "#/definitions/HeaderConfig",
          "description": "Header configuration, which determines default properties for all [headers](https://vega.github.io/vega-lite/docs/header.html).\n\nFor a full list of header configuration options, please see the [corresponding section of in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config)."
        },
        "headerColumn": {
          "$ref": "#/definitions/HeaderConfig",
          "description": "Header configuration, which determines default properties for column [headers](https://vega.github.io/vega-lite/docs/header.html).\n\nFor a full list of header configuration options, please see the [corresponding section of in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config)."
        },
        "headerFacet": {
          "$ref": "#/definitions/HeaderConfig",
          "description": "Header configuration, which determines default properties for non-row/column facet [headers](https://vega.github.io/vega-lite/docs/header.html).\n\nFor a full list of header configuration options, please see the [corresponding section of in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config)."
        },
        "headerRow": {
          "$ref": "#/definitions/HeaderConfig",
          "description": "Header configuration, which determines default properties for row [headers](https://vega.github.io/vega-lite/docs/header.html).\n\nFor a full list of header configuration options, please see the [corresponding section of in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config)."
        },
        "image": {
          "$ref": "#/definitions/RectConfig",
          "description": "Image-specific Config"
        },
        "legend": {
          "$ref": "#/definitions/LegendConfig",
          "description": "Legend configuration, which determines default properties for all [legends](https://vega.github.io/vega-lite/docs/legend.html). For a full list of legend configuration options, please see the [corresponding section of in the legend documentation](https://vega.github.io/vega-lite/docs/legend.html#config)."
        },
        "line": {
          "$ref": "#/definitions/LineConfig",
          "description": "Line-Specific Config"
        },
        "lineBreak": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property provides a global default for text marks, which is overridden by mark or style config settings, and by the lineBreak mark encoding channel. If signal-valued, either string or regular expression (regexp) values are valid."
        },
        "locale": {
          "$ref": "#/definitions/Locale",
          "description": "Locale definitions for string parsing and formatting of number and date values. The locale object should contain `number` and/or `time` properties with [locale definitions](https://vega.github.io/vega/docs/api/locale/). Locale definitions provided in the config block may be overridden by the View constructor locale option."
        },
        "mark": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Mark Config"
        },
        "normalizedNumberFormat": {
          "description": "If normalizedNumberFormatType is not specified, D3 number format for axis labels, text marks, and tooltips of normalized stacked fields (fields with `stack: \"normalize\"`). For example `\"s\"` for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\n\nIf `config.normalizedNumberFormatType` is specified and `config.customFormatTypes` is `true`, this value will be passed as `format` alongside `datum.value` to the `config.numberFormatType` function. __Default value:__ `%`",
          "type": "string"
        },
        "normalizedNumberFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.normalizedNumberFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-format, which is exposed as [`format` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#format). __Note:__ You must also set `customFormatTypes` to `true` to use this feature.",
          "type": "string"
        },
        "numberFormat": {
          "description": "If numberFormatType is not specified, D3 number format for guide labels, text marks, and tooltips of non-normalized fields (fields *without* `stack: \"normalize\"`). For example `\"s\"` for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\n\nIf `config.numberFormatType` is specified and `config.customFormatTypes` is `true`, this value will be passed as `format` alongside `datum.value` to the `config.numberFormatType` function.",
          "type": "string"
        },
        "numberFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.numberFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-format, which is exposed as [`format` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#format). __Note:__ You must also set `customFormatTypes` to `true` to use this feature.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "point": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Point-Specific Config"
        },
        "projection": {
          "$ref": "#/definitions/ProjectionConfig",
          "description": "Projection configuration, which determines default properties for all [projections](https://vega.github.io/vega-lite/docs/projection.html). For a full list of projection configuration options, please see the [corresponding section of the projection documentation](https://vega.github.io/vega-lite/docs/projection.html#config)."
        },
        "range": {
          "$ref": "#/definitions/RangeConfig",
          "description": "An object hash that defines default range arrays or schemes for using with scales. For a full list of scale range configuration options, please see the [corresponding section of the scale documentation](https://vega.github.io/vega-lite/docs/scale.html#config)."
        },
        "rect": {
          "$ref": "#/definitions/RectConfig",
          "description": "Rect-Specific Config"
        },
        "rule": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Rule-Specific Config"
        },
        "scale": {
          "$ref": "#/definitions/ScaleConfig",
          "description": "Scale configuration determines default properties for all [scales](https://vega.github.io/vega-lite/docs/scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](https://vega.github.io/vega-lite/docs/scale.html#config)."
        },
        "selection": {
          "$ref": "#/definitions/SelectionConfig",
          "description": "An object hash for defining default properties for each type of selections."
        },
        "square": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Square-Specific Config"
        },
        "style": {
          "$ref": "#/definitions/StyleConfigIndex",
          "description": "An object hash that defines key-value mappings to determine default properties for marks with a given [style](https://vega.github.io/vega-lite/docs/mark.html#mark-def). The keys represent styles names; the values have to be valid [mark configuration objects](https://vega.github.io/vega-lite/docs/mark.html#config)."
        },
        "text": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Text-Specific Config"
        },
        "tick": {
          "$ref": "#/definitions/TickConfig",
          "description": "Tick-Specific Config"
        },
        "timeFormat": {
          "description": "Default time format for raw time values (without time units) in text marks, legend labels and header labels.\n\n__Default value:__ `\"%b %d, %Y\"` __Note:__ Axes automatically determine the format for each label automatically so this config does not affect axes.",
          "type": "string"
        },
        "timeFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.timeFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-time-format, which is exposed as [`timeFormat` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#timeFormat). __Note:__ You must also set `customFormatTypes` to `true` and there must *not* be a `timeUnit` defined to use this feature.",
          "type": "string"
        },
        "title": {
          "$ref": "#/definitions/TitleConfig",
          "description": "Title configuration, which determines default properties for all [titles](https://vega.github.io/vega-lite/docs/title.html). For a full list of title configuration options, please see the [corresponding section of the title documentation](https://vega.github.io/vega-lite/docs/title.html#config)."
        },
        "tooltipFormat": {
          "$ref": "#/definitions/FormatConfig",
          "description": "Define [custom format configuration](https://vega.github.io/vega-lite/docs/config.html#format) for tooltips. If unspecified, default format config will be applied."
        },
        "trail": {
          "$ref": "#/definitions/LineConfig",
          "description": "Trail-Specific Config"
        },
        "view": {
          "$ref": "#/definitions/ViewConfig",
          "description": "Default properties for [single view plots](https://vega.github.io/vega-lite/docs/spec.html#single)."
        }
      },
      "type": "object"
    },
    "CsvDataFormat": {
      "additionalProperties": false,
      "properties": {
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using JavaScript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. If no extension is detected, `\"json\"` will be used by default.",
          "enum": [
            "csv",
            "tsv"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "Cursor": {
      "enum": [
        "auto",
        "default",
        "none",
        "context-menu",
        "help",
        "pointer",
        "progress",
        "wait",
        "cell",
        "crosshair",
        "text",
        "vertical-text",
        "alias",
        "copy",
        "move",
        "no-drop",
        "not-allowed",
        "e-resize",
        "n-resize",
        "ne-resize",
        "nw-resize",
        "s-resize",
        "se-resize",
        "sw-resize",
        "w-resize",
        "ew-resize",
        "ns-resize",
        "nesw-resize",
        "nwse-resize",
        "col-resize",
        "row-resize",
        "all-scroll",
        "zoom-in",
        "zoom-out",
        "grab",
        "grabbing"
      ],
      "type": "string"
    },
    "Cyclical": {
      "enum": [
        "rainbow",
        "sinebow"
      ],
      "type": "string"
    },
    "Data": {
      "anyOf": [
        {
          "$ref": "#/definitions/DataSource"
        },
        {
          "$ref": "#/definitions/Generator"
        }
      ]
    },
    "DataFormat": {
      "anyOf": [
        {
          "$ref": "#/definitions/CsvDataFormat"
        },
        {
          "$ref": "#/definitions/DsvDataFormat"
        },
        {
          "$ref": "#/definitions/JsonDataFormat"
        },
        {
          "$ref": "#/definitions/TopoDataFormat"
        }
      ]
    },
    "DataSource": {
      "anyOf": [
        {
          "$ref": "#/definitions/UrlData"
        },
        {
          "$ref": "#/definitions/InlineData"
        },
        {
          "$ref": "#/definitions/NamedData"
        }
      ]
    },
    "Datasets": {
      "$ref": "#/definitions/Dict<InlineDataset>"
    },
    "DateTime": {
      "additionalProperties": false,
      "description": "Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided, month has higher precedence. `day` cannot be combined with other date. We accept string for month and day names.",
      "properties": {
        "date": {
          "description": "Integer value representing the date (day of the month) from 1-31.",
          "maximum": 31,
          "minimum": 1,
          "type": "number"
        },
        "day": {
          "anyOf": [
            {
              "$ref": "#/definitions/Day"
            },
            {
              "type": "string"
            }
          ],
          "description": "Value representing the day of a week. This can be one of: (1) integer value -- `1` represents Monday; (2) case-insensitive day name (e.g., `\"Monday\"`); (3) case-insensitive, 3-character short day name (e.g., `\"Mon\"`).\n\n**Warning:** A DateTime definition object with `day`** should not be combined with `year`, `quarter`, `month`, or `date`."
        },
        "hours": {
          "description": "Integer value representing the hour of a day from 0-23.",
          "maximum": 24,
          "minimum": 0,
          "type": "number"
        },
        "milliseconds": {
          "description": "Integer value representing the millisecond segment of time.",
          "maximum": 1000,
          "minimum": 0,
          "type": "number"
        },
        "minutes": {
          "description": "Integer value representing the minute segment of time from 0-59.",
          "maximum": 60,
          "minimum": 0,
          "type": "number"
        },
        "month": {
          "anyOf": [
            {
              "$ref": "#/definitions/Month"
            },
            {
              "type": "string"
            }
          ],
          "description": "One of: (1) integer value representing the month from `1`-`12`. `1` represents January; (2) case-insensitive month name (e.g., `\"January\"`); (3) case-insensitive, 3-character short month name (e.g., `\"Jan\"`)."
        },
        "quarter": {
          "description": "Integer value representing the quarter of the year (from 1-4).",
          "maximum": 4,
          "minimum": 1,
          "type": "number"
        },
        "seconds": {
          "description": "Integer value representing the second segment (0-59) of a time value",
          "maximum": 60,
          "minimum": 0,
          "type": "number"
        },
        "utc": {
          "description": "A boolean flag indicating if date time is in utc time. If false, the date time is in local time",
          "type": "boolean"
        },
        "year": {
          "description": "Integer value representing the year.",
          "type": "number"
        }
      },
      "type": "object"
    },
    "DatumDef": {
      "additionalProperties": false,
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "Day": {
      "maximum": 7,
      "minimum": 1,
      "type": "number"
    },
    "DensityTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output fields for the sample value and corresponding density estimate.\n\n__Default value:__ `[\"value\", \"density\"]`",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "bandwidth": {
          "description": "The bandwidth (standard deviation) of the Gaussian kernel. If unspecified or set to zero, the bandwidth value is automatically estimated from the input data using Scott’s rule.",
          "type": "number"
        },
        "counts": {
          "description": "A boolean flag indicating if the output values should be probability estimates (false) or smoothed counts (true).\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "cumulative": {
          "description": "A boolean flag indicating whether to produce density estimates (false) or cumulative density estimates (true).\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "density": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which to perform density estimation."
        },
        "extent": {
          "description": "A [min, max] domain from which to sample the distribution. If unspecified, the extent will be determined by the observed minimum and maximum values of the density value field.",
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "groupby": {
          "description": "The data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "maxsteps": {
          "description": "The maximum number of samples to take along the extent domain for plotting the density.\n\n__Default value:__ `200`",
          "type": "number"
        },
        "minsteps": {
          "description": "The minimum number of samples to take along the extent domain for plotting the density.\n\n__Default value:__ `25`",
          "type": "number"
        },
        "steps": {
          "description": "The exact number of samples to take along the extent domain for plotting the density. If specified, overrides both minsteps and maxsteps to set an exact number of uniform samples. Potentially useful in conjunction with a fixed extent to ensure consistent sample points for stacked densities.",
          "type": "number"
        }
      },
      "required": [
        "density"
      ],
      "type": "object"
    },
    "DerivedStream": {
      "additionalProperties": false,
      "properties": {
        "between": {
          "items": {
            "$ref": "#/definitions/Stream"
          },
          "type": "array"
        },
        "consume": {
          "type": "boolean"
        },
        "debounce": {
          "type": "number"
        },
        "filter": {
          "anyOf": [
            {
              "$ref": "#/definitions/Expr"
            },
            {
              "items": {
                "$ref": "#/definitions/Expr"
              },
              "type": "array"
            }
          ]
        },
        "markname": {
          "type": "string"
        },
        "marktype": {
          "$ref": "#/definitions/MarkType"
        },
        "stream": {
          "$ref": "#/definitions/Stream"
        },
        "throttle": {
          "type": "number"
        }
      },
      "required": [
        "stream"
      ],
      "type": "object"
    },
    "Dict<InlineDataset>": {
      "additionalProperties": {
        "$ref": "#/definitions/InlineDataset"
      },
      "type": "object"
    },
    "Dict<SelectionInit>": {
      "additionalProperties": {
        "$ref": "#/definitions/SelectionInit"
      },
      "type": "object"
    },
    "Dict<SelectionInitInterval>": {
      "additionalProperties": {
        "$ref": "#/definitions/SelectionInitInterval"
      },
      "type": "object"
    },
    "Dict": {
      "additionalProperties": {},
      "type": "object"
    },
    "Diverging": {
      "enum": [
        "blueorange",
        "blueorange-3",
        "blueorange-4",
        "blueorange-5",
        "blueorange-6",
        "blueorange-7",
        "blueorange-8",
        "blueorange-9",
        "blueorange-10",
        "blueorange-11",
        "brownbluegreen",
        "brownbluegreen-3",
        "brownbluegreen-4",
        "brownbluegreen-5",
        "brownbluegreen-6",
        "brownbluegreen-7",
        "brownbluegreen-8",
        "brownbluegreen-9",
        "brownbluegreen-10",
        "brownbluegreen-11",
        "purplegreen",
        "purplegreen-3",
        "purplegreen-4",
        "purplegreen-5",
        "purplegreen-6",
        "purplegreen-7",
        "purplegreen-8",
        "purplegreen-9",
        "purplegreen-10",
        "purplegreen-11",
        "pinkyellowgreen",
        "pinkyellowgreen-3",
        "pinkyellowgreen-4",
        "pinkyellowgreen-5",
        "pinkyellowgreen-6",
        "pinkyellowgreen-7",
        "pinkyellowgreen-8",
        "pinkyellowgreen-9",
        "pinkyellowgreen-10",
        "pinkyellowgreen-11",
        "purpleorange",
        "purpleorange-3",
        "purpleorange-4",
        "purpleorange-5",
        "purpleorange-6",
        "purpleorange-7",
        "purpleorange-8",
        "purpleorange-9",
        "purpleorange-10",
        "purpleorange-11",
        "redblue",
        "redblue-3",
        "redblue-4",
        "redblue-5",
        "redblue-6",
        "redblue-7",
        "redblue-8",
        "redblue-9",
        "redblue-10",
        "redblue-11",
        "redgrey",
        "redgrey-3",
        "redgrey-4",
        "redgrey-5",
        "redgrey-6",
        "redgrey-7",
        "redgrey-8",
        "redgrey-9",
        "redgrey-10",
        "redgrey-11",
        "redyellowblue",
        "redyellowblue-3",
        "redyellowblue-4",
        "redyellowblue-5",
        "redyellowblue-6",
        "redyellowblue-7",
        "redyellowblue-8",
        "redyellowblue-9",
        "redyellowblue-10",
        "redyellowblue-11",
        "redyellowgreen",
        "redyellowgreen-3",
        "redyellowgreen-4",
        "redyellowgreen-5",
        "redyellowgreen-6",
        "redyellowgreen-7",
        "redyellowgreen-8",
        "redyellowgreen-9",
        "redyellowgreen-10",
        "redyellowgreen-11",
        "spectral",
        "spectral-3",
        "spectral-4",
        "spectral-5",
        "spectral-6",
        "spectral-7",
        "spectral-8",
        "spectral-9",
        "spectral-10",
        "spectral-11"
      ],
      "type": "string"
    },
    "DomainUnionWith": {
      "additionalProperties": false,
      "properties": {
        "unionWith": {
          "description": "Customized domain values to be union with the field's values or explicitly defined domain. Should be an array of valid scale domain values.",
          "items": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "type": "boolean"
              },
              {
                "$ref": "#/definitions/DateTime"
              }
            ]
          },
          "type": "array"
        }
      },
      "required": [
        "unionWith"
      ],
      "type": "object"
    },
    "DsvDataFormat": {
      "additionalProperties": false,
      "properties": {
        "delimiter": {
          "description": "The delimiter between records. The delimiter must be a single character (i.e., a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not.",
          "maxLength": 1,
          "minLength": 1,
          "type": "string"
        },
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using JavaScript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "const": "dsv",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "required": [
        "delimiter"
      ],
      "type": "object"
    },
    "Element": {
      "type": "string"
    },
    "EncodingSortField": {
      "additionalProperties": false,
      "description": "A sort definition for sorting a discrete scale in an encoding field definition.",
      "properties": {
        "field": {
          "$ref": "#/definitions/Field",
          "description": "The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by.\n\n__Default value:__ If unspecified, defaults to the field specified in the outer data reference."
        },
        "op": {
          "$ref": "#/definitions/NonArgAggregateOp",
          "description": "An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to perform on the field prior to sorting (e.g., `\"count\"`, `\"mean\"` and `\"median\"`). An aggregation is required when there are multiple values of the sort field for each encoded data field. The input data objects will be aggregated, grouped by the encoded data field.\n\nFor a full list of operations, please see the documentation for [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops).\n\n__Default value:__ `\"sum\"` for stacked plots. Otherwise, `\"min\"`."
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "type": "null"
            }
          ],
          "description": "The sort order. One of `\"ascending\"` (default), `\"descending\"`, or `null` (no not sort)."
        }
      },
      "type": "object"
    },
    "ErrorBand": {
      "const": "errorband",
      "type": "string"
    },
    "ErrorBandConfig": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "borders": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "extent": {
          "$ref": "#/definitions/ErrorBarExtent",
          "description": "The extent of the band. Available options include:\n- `\"ci\"`: Extend the band to the confidence interval of the mean.\n- `\"stderr\"`: The size of band are set to the value of standard error, extending from the mean.\n- `\"stdev\"`: The size of band are set to the value of standard deviation, extending from the mean.\n- `\"iqr\"`: Extend the band to the q1 and q3.\n\n__Default value:__ `\"stderr\"`."
        },
        "interpolate": {
          "$ref": "#/definitions/Interpolate",
          "description": "The line interpolation method for the error band. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes at the midpoint of each pair of adjacent x-values.\n- `\"step-before\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes before the x-value.\n- `\"step-after\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes after the x-value.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
        },
        "tension": {
          "description": "The tension parameter for the interpolation type of the error band.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "ErrorBandDef": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "borders": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "clip": {
          "description": "Whether a composite mark be clipped to the enclosing group’s width and height.",
          "type": "boolean"
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "extent": {
          "$ref": "#/definitions/ErrorBarExtent",
          "description": "The extent of the band. Available options include:\n- `\"ci\"`: Extend the band to the confidence interval of the mean.\n- `\"stderr\"`: The size of band are set to the value of standard error, extending from the mean.\n- `\"stdev\"`: The size of band are set to the value of standard deviation, extending from the mean.\n- `\"iqr\"`: Extend the band to the q1 and q3.\n\n__Default value:__ `\"stderr\"`."
        },
        "interpolate": {
          "$ref": "#/definitions/Interpolate",
          "description": "The line interpolation method for the error band. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes at the midpoint of each pair of adjacent x-values.\n- `\"step-before\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes before the x-value.\n- `\"step-after\"`: a piecewise constant function (a step function) consisting of alternating horizontal and vertical lines. The y-value changes after the x-value.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
        },
        "opacity": {
          "description": "The opacity (value between [0,1]) of the mark.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "Orientation of the error band. This is normally automatically determined, but can be specified when the orientation is ambiguous and cannot be automatically determined."
        },
        "tension": {
          "description": "The tension parameter for the interpolation type of the error band.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "type": {
          "$ref": "#/definitions/ErrorBand",
          "description": "The mark type. This could a primitive mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"geoshape\"`, `\"rule\"`, and `\"text\"`) or a composite mark type (`\"boxplot\"`, `\"errorband\"`, `\"errorbar\"`)."
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ErrorBar": {
      "const": "errorbar",
      "type": "string"
    },
    "ErrorBarConfig": {
      "additionalProperties": false,
      "properties": {
        "extent": {
          "$ref": "#/definitions/ErrorBarExtent",
          "description": "The extent of the rule. Available options include:\n- `\"ci\"`: Extend the rule to the confidence interval of the mean.\n- `\"stderr\"`: The size of rule are set to the value of standard error, extending from the mean.\n- `\"stdev\"`: The size of rule are set to the value of standard deviation, extending from the mean.\n- `\"iqr\"`: Extend the rule to the q1 and q3.\n\n__Default value:__ `\"stderr\"`."
        },
        "rule": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "size": {
          "description": "Size of the ticks of an error bar",
          "type": "number"
        },
        "thickness": {
          "description": "Thickness of the ticks and the bar of an error bar",
          "type": "number"
        },
        "ticks": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        }
      },
      "type": "object"
    },
    "ErrorBarDef": {
      "additionalProperties": false,
      "properties": {
        "clip": {
          "description": "Whether a composite mark be clipped to the enclosing group’s width and height.",
          "type": "boolean"
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "extent": {
          "$ref": "#/definitions/ErrorBarExtent",
          "description": "The extent of the rule. Available options include:\n- `\"ci\"`: Extend the rule to the confidence interval of the mean.\n- `\"stderr\"`: The size of rule are set to the value of standard error, extending from the mean.\n- `\"stdev\"`: The size of rule are set to the value of standard deviation, extending from the mean.\n- `\"iqr\"`: Extend the rule to the q1 and q3.\n\n__Default value:__ `\"stderr\"`."
        },
        "opacity": {
          "description": "The opacity (value between [0,1]) of the mark.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "Orientation of the error bar. This is normally automatically determined, but can be specified when the orientation is ambiguous and cannot be automatically determined."
        },
        "rule": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "size": {
          "description": "Size of the ticks of an error bar",
          "type": "number"
        },
        "thickness": {
          "description": "Thickness of the ticks and the bar of an error bar",
          "type": "number"
        },
        "ticks": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/AnyMarkConfig"
            }
          ]
        },
        "type": {
          "$ref": "#/definitions/ErrorBar",
          "description": "The mark type. This could a primitive mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"geoshape\"`, `\"rule\"`, and `\"text\"`) or a composite mark type (`\"boxplot\"`, `\"errorband\"`, `\"errorbar\"`)."
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ErrorBarExtent": {
      "enum": [
        "ci",
        "iqr",
        "stderr",
        "stdev"
      ],
      "type": "string"
    },
    "EventStream": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "between": {
              "items": {
                "$ref": "#/definitions/Stream"
              },
              "type": "array"
            },
            "consume": {
              "type": "boolean"
            },
            "debounce": {
              "type": "number"
            },
            "filter": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Expr"
                },
                {
                  "items": {
                    "$ref": "#/definitions/Expr"
                  },
                  "type": "array"
                }
              ]
            },
            "markname": {
              "type": "string"
            },
            "marktype": {
              "$ref": "#/definitions/MarkType"
            },
            "source": {
              "enum": [
                "view",
                "scope"
              ],
              "type": "string"
            },
            "throttle": {
              "type": "number"
            },
            "type": {
              "$ref": "#/definitions/EventType"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "between": {
              "items": {
                "$ref": "#/definitions/Stream"
              },
              "type": "array"
            },
            "consume": {
              "type": "boolean"
            },
            "debounce": {
              "type": "number"
            },
            "filter": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Expr"
                },
                {
                  "items": {
                    "$ref": "#/definitions/Expr"
                  },
                  "type": "array"
                }
              ]
            },
            "markname": {
              "type": "string"
            },
            "marktype": {
              "$ref": "#/definitions/MarkType"
            },
            "source": {
              "const": "window",
              "type": "string"
            },
            "throttle": {
              "type": "number"
            },
            "type": {
              "$ref": "#/definitions/WindowEventType"
            }
          },
          "required": [
            "source",
            "type"
          ],
          "type": "object"
        }
      ]
    },
    "EventType": {
      "enum": [
        "click",
        "dblclick",
        "dragenter",
        "dragleave",
        "dragover",
        "keydown",
        "keypress",
        "keyup",
        "mousedown",
        "mousemove",
        "mouseout",
        "mouseover",
        "mouseup",
        "mousewheel",
        "pointerdown",
        "pointermove",
        "pointerout",
        "pointerover",
        "pointerup",
        "timer",
        "touchend",
        "touchmove",
        "touchstart",
        "wheel"
      ],
      "type": "string"
    },
    "Expr": {
      "type": "string"
    },
    "ExprRef": {
      "additionalProperties": false,
      "properties": {
        "expr": {
          "description": "Vega expression (which can refer to Vega-Lite parameters).",
          "type": "string"
        }
      },
      "required": [
        "expr"
      ],
      "type": "object"
    },
    "ExtentTransform": {
      "additionalProperties": false,
      "properties": {
        "extent": {
          "$ref": "#/definitions/FieldName",
          "description": "The field of which to get the extent."
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "The output parameter produced by the extent transform."
        }
      },
      "required": [
        "extent",
        "param"
      ],
      "type": "object"
    },
    "FacetEncodingFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "header": {
          "anyOf": [
            {
              "$ref": "#/definitions/Header"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of a facet's header."
        },
        "sort": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortArray"
            },
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "$ref": "#/definitions/EncodingSortField"
            },
            {
              "type": "null"
            }
          ],
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` is not supported for `row` and `column`."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FacetFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "header": {
          "anyOf": [
            {
              "$ref": "#/definitions/Header"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of a facet's header."
        },
        "sort": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortArray"
            },
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "$ref": "#/definitions/EncodingSortField"
            },
            {
              "type": "null"
            }
          ],
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` is not supported for `row` and `column`."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FacetMapping": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "$ref": "#/definitions/FacetFieldDef",
          "description": "A field definition for the horizontal facet of trellis plots."
        },
        "row": {
          "$ref": "#/definitions/FacetFieldDef",
          "description": "A field definition for the vertical facet of trellis plots."
        }
      },
      "type": "object"
    },
    "FacetedEncoding": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Rotation angle of point and text marks."
        },
        "color": {
          "$ref": "#/definitions/ColorDef",
          "description": "Color of the marks – either fill or stroke color based on  the `filled` property of mark definition. By default, `color` represents fill color for `\"area\"`, `\"bar\"`, `\"tick\"`, `\"text\"`, `\"trail\"`, `\"circle\"`, and `\"square\"` / stroke color for `\"line\"` and `\"point\"`.\n\n__Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. The `fill` or `stroke` encodings have higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified. 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme)."
        },
        "column": {
          "$ref": "#/definitions/RowColumnEncodingFieldDef",
          "description": "A field definition for the horizontal facet of trellis plots."
        },
        "description": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "A text description of this mark for ARIA accessibility (SVG output only). For SVG output the `\"aria-label\"` attribute will be set to this description."
        },
        "detail": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldDefWithoutScale"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldDefWithoutScale"
              },
              "type": "array"
            }
          ],
          "description": "Additional levels of detail for grouping data in aggregate views and in line, trail, and area marks without mapping data to a specific visual channel."
        },
        "facet": {
          "$ref": "#/definitions/FacetEncodingFieldDef",
          "description": "A field definition for the (flexible) facet of trellis plots.\n\nIf either `row` or `column` is specified, this channel will be ignored."
        },
        "fill": {
          "$ref": "#/definitions/ColorDef",
          "description": "Fill color of the marks. __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ The `fill` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "fillOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Fill opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity` property."
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "A URL to load upon mouse click."
        },
        "key": {
          "$ref": "#/definitions/FieldDefWithoutScale",
          "description": "A data field to use as a unique key for data binding. When a visualization’s data is updated, the key value will be used to match data elements to existing mark instances. Use a key channel to enable object constancy for transitions over dynamic data."
        },
        "latitude": {
          "$ref": "#/definitions/LatLongDef",
          "description": "Latitude position of geographically projected marks."
        },
        "latitude2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Latitude-2 position for geographically projected ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`."
        },
        "longitude": {
          "$ref": "#/definitions/LatLongDef",
          "description": "Longitude position of geographically projected marks."
        },
        "longitude2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Longitude-2 position for geographically projected ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`."
        },
        "opacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity` property."
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/OrderFieldDef"
            },
            {
              "items": {
                "$ref": "#/definitions/OrderFieldDef"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/OrderValueDef"
            },
            {
              "$ref": "#/definitions/OrderOnlyDef"
            }
          ],
          "description": "Order of the marks.\n- For stacked marks, this `order` channel encodes [stack order](https://vega.github.io/vega-lite/docs/stack.html#order).\n- For line and trail marks, this `order` channel encodes order of data points in the lines. This can be useful for creating [a connected scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html). Setting `order` to `{\"value\": null}` makes the line marks use the original order in the data sources.\n- Otherwise, this `order` channel encodes layer order of the marks.\n\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping."
        },
        "radius": {
          "$ref": "#/definitions/PolarDef",
          "description": "The outer radius in pixels of arc marks."
        },
        "radius2": {
          "$ref": "#/definitions/Position2Def",
          "description": "The inner radius in pixels of arc marks."
        },
        "row": {
          "$ref": "#/definitions/RowColumnEncodingFieldDef",
          "description": "A field definition for the vertical facet of trellis plots."
        },
        "shape": {
          "$ref": "#/definitions/ShapeDef",
          "description": "Shape of the mark.\n\n1. For `point` marks the supported values include:   - plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.   - the line symbol `\"stroke\"`   - centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`   - a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n2. For `geoshape` marks it should be a field definition of the geojson data\n\n__Default value:__ If undefined, the default shape depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape` property. (`\"circle\"` if unset.)"
        },
        "size": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Size of the mark.\n- For `\"point\"`, `\"square\"` and `\"circle\"`, – the symbol size, or pixel area of the mark.\n- For `\"bar\"` and `\"tick\"` – the bar and tick's size.\n- For `\"text\"` – the text's font size.\n- Size is unsupported for `\"line\"`, `\"area\"`, and `\"rect\"`. (Use `\"trail\"` instead of line with varying size)"
        },
        "stroke": {
          "$ref": "#/definitions/ColorDef",
          "description": "Stroke color of the marks. __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color` property.\n\n_Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."
        },
        "strokeDash": {
          "$ref": "#/definitions/NumericArrayMarkPropDef",
          "description": "Stroke dash of the marks.\n\n__Default value:__ `[1,0]` (No dash)."
        },
        "strokeOpacity": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke opacity of the marks.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity` property."
        },
        "strokeWidth": {
          "$ref": "#/definitions/NumericMarkPropDef",
          "description": "Stroke width of the marks.\n\n__Default value:__ If undefined, the default stroke width depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth` property."
        },
        "text": {
          "$ref": "#/definitions/TextDef",
          "description": "Text of the `text` mark."
        },
        "theta": {
          "$ref": "#/definitions/PolarDef",
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians."
        },
        "theta2": {
          "$ref": "#/definitions/Position2Def",
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "tooltip": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            },
            {
              "items": {
                "$ref": "#/definitions/StringFieldDef"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the `tooltip` property in the mark definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip in Vega-Lite."
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            }
          ],
          "description": "The URL of an image mark."
        },
        "x": {
          "$ref": "#/definitions/PositionDef",
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "$ref": "#/definitions/Position2Def",
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "xError": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Error value of x coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "xError2": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Secondary error value of x coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "xOffset": {
          "$ref": "#/definitions/OffsetDef",
          "description": "Offset of x-position of the marks"
        },
        "y": {
          "$ref": "#/definitions/PositionDef",
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "$ref": "#/definitions/Position2Def",
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "yError": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Error value of y coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "yError2": {
          "anyOf": [
            {
              "$ref": "#/definitions/SecondaryFieldDef"
            },
            {
              "$ref": "#/definitions/ValueDef<number>"
            }
          ],
          "description": "Secondary error value of y coordinates for error specified `\"errorbar\"` and `\"errorband\"`."
        },
        "yOffset": {
          "$ref": "#/definitions/OffsetDef",
          "description": "Offset of y-position of the marks"
        }
      },
      "type": "object"
    },
    "FacetedUnitSpec": {
      "additionalProperties": false,
      "description": "Unit spec that can have a composite mark and row or column channels (shorthand for a facet spec).",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/FacetedEncoding",
          "description": "A key-value mapping between encoding channels and definition of fields."
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The height of a visualization.\n\n- For a plot with a continuous y-field, height should be a number.\n- For a plot with either a discrete y-field or no y-field, height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step. (No y-field is equivalent to having one discrete step.)\n- To enable responsive sizing on height, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous y-field and `config.view.discreteHeight` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        },
        "mark": {
          "$ref": "#/definitions/AnyMark",
          "description": "A string describing the mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"rule\"`, `\"geoshape\"`, and `\"text\"`) or a [mark definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def)."
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "params": {
          "description": "An array of parameters that may either be simple variables, or more complex selections that map user input to data queries.",
          "items": {
            "$ref": "#/definitions/SelectionParameter"
          },
          "type": "array"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of geographic projection, which will be applied to `shape` path for `\"geoshape\"` marks and to `latitude` and `\"longitude\"` channels for other marks."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "An object defining the view background's fill and stroke.\n\n__Default value:__ none (transparent)"
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The width of a visualization.\n\n- For a plot with a continuous x-field, width should be a number.\n- For a plot with either a discrete x-field or no x-field, width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step. (No x-field is equivalent to having one discrete step.)\n- To enable responsive sizing on width, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous x-field and `config.view.discreteWidth` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        }
      },
      "required": [
        "mark"
      ],
      "type": "object"
    },
    "Feature": {
      "additionalProperties": false,
      "description": "A feature object which contains a geometry and associated properties. https://tools.ietf.org/html/rfc7946#section-3.2",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "geometry": {
          "$ref": "#/definitions/Geometry",
          "description": "The feature's geometry"
        },
        "id": {
          "description": "A value that uniquely identifies this feature in a https://tools.ietf.org/html/rfc7946#section-3.2.",
          "type": [
            "string",
            "number"
          ]
        },
        "properties": {
          "$ref": "#/definitions/GeoJsonProperties",
          "description": "Properties associated with this feature."
        },
        "type": {
          "const": "Feature",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "geometry",
        "properties",
        "type"
      ],
      "type": "object"
    },
    "Feature<Geometry,GeoJsonProperties>": {
      "additionalProperties": false,
      "description": "A feature object which contains a geometry and associated properties. https://tools.ietf.org/html/rfc7946#section-3.2",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "geometry": {
          "$ref": "#/definitions/Geometry",
          "description": "The feature's geometry"
        },
        "id": {
          "description": "A value that uniquely identifies this feature in a https://tools.ietf.org/html/rfc7946#section-3.2.",
          "type": [
            "string",
            "number"
          ]
        },
        "properties": {
          "$ref": "#/definitions/GeoJsonProperties",
          "description": "Properties associated with this feature."
        },
        "type": {
          "const": "Feature",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "geometry",
        "properties",
        "type"
      ],
      "type": "object"
    },
    "FeatureCollection": {
      "additionalProperties": false,
      "description": "A collection of feature objects.  https://tools.ietf.org/html/rfc7946#section-3.3",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "features": {
          "items": {
            "$ref": "#/definitions/Feature<Geometry,GeoJsonProperties>"
          },
          "type": "array"
        },
        "type": {
          "const": "FeatureCollection",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "features",
        "type"
      ],
      "type": "object"
    },
    "Field": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldName"
        },
        {
          "$ref": "#/definitions/RepeatRef"
        }
      ]
    },
    "FieldDefWithoutScale": {
      "$ref": "#/definitions/TypedFieldDef",
      "description": "Field Def without scale (and without bin: \"binned\" support)."
    },
    "FieldEqualPredicate": {
      "additionalProperties": false,
      "properties": {
        "equal": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The value that the field should be equal to."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "equal",
        "field"
      ],
      "type": "object"
    },
    "FieldGTEPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "gte": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The value that the field should be greater than or equals to."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "gte"
      ],
      "type": "object"
    },
    "FieldGTPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "gt": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The value that the field should be greater than."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "gt"
      ],
      "type": "object"
    },
    "FieldLTEPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "lte": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The value that the field should be less than or equals to."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "lte"
      ],
      "type": "object"
    },
    "FieldLTPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "lt": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The value that the field should be less than."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "lt"
      ],
      "type": "object"
    },
    "FieldName": {
      "type": "string"
    },
    "FieldOneOfPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "oneOf": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "boolean"
              },
              "type": "array"
            },
            {
              "items": {
                "$ref": "#/definitions/DateTime"
              },
              "type": "array"
            }
          ],
          "description": "A set of values that the `field`'s value should be a member of, for a data item included in the filtered data."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "oneOf"
      ],
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<DatumDef,(Gradient|string|null)>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<DatumDef,(string|null)>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<DatumDef,number>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<DatumDef,number[]>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef,(Gradient|string|null)>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "legend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Legend"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef,number>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "legend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Legend"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef,number[]>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "legend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Legend"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<MarkPropFieldDef<TypeForShape>,(string|null)>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "legend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Legend"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/TypeForShape",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<StringDatumDef,Text>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<StringFieldDef,Text>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldOrDatumDefWithCondition<StringFieldDef,string>": {
      "additionalProperties": false,
      "description": "A FieldDef with Condition<ValueDef> {   condition: {value: ...},   field: ...,   ... }",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "FieldRange": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "type": "string"
        }
      },
      "required": [
        "field"
      ],
      "type": "object"
    },
    "FieldRangePredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "range": {
          "anyOf": [
            {
              "items": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/DateTime"
                  },
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/definitions/ExprRef"
                  }
                ]
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "An array of inclusive minimum and maximum values for a field value of a data item to be included in the filtered data.",
          "maxItems": 2,
          "minItems": 2
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        }
      },
      "required": [
        "field",
        "range"
      ],
      "type": "object"
    },
    "FieldValidPredicate": {
      "additionalProperties": false,
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "Field to be tested."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit for the field to be tested."
        },
        "valid": {
          "description": "If set to true the field's value has to be valid, meaning both not `null` and not [`NaN`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN).",
          "type": "boolean"
        }
      },
      "required": [
        "field",
        "valid"
      ],
      "type": "object"
    },
    "FilterTransform": {
      "additionalProperties": false,
      "properties": {
        "filter": {
          "$ref": "#/definitions/PredicateComposition",
          "description": "The `filter` property must be a predication definition, which can take one of the following forms:\n\n1) an [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string, where `datum` can be used to refer to the current data object. For example, `{filter: \"datum.b2 > 60\"}` would make the output data includes only items that have values in the field `b2` over 60.\n\n2) one of the [field predicates](https://vega.github.io/vega-lite/docs/predicate.html#field-predicate): [`equal`](https://vega.github.io/vega-lite/docs/predicate.html#field-equal-predicate), [`lt`](https://vega.github.io/vega-lite/docs/predicate.html#lt-predicate), [`lte`](https://vega.github.io/vega-lite/docs/predicate.html#lte-predicate), [`gt`](https://vega.github.io/vega-lite/docs/predicate.html#gt-predicate), [`gte`](https://vega.github.io/vega-lite/docs/predicate.html#gte-predicate), [`range`](https://vega.github.io/vega-lite/docs/predicate.html#range-predicate), [`oneOf`](https://vega.github.io/vega-lite/docs/predicate.html#one-of-predicate), or [`valid`](https://vega.github.io/vega-lite/docs/predicate.html#valid-predicate),\n\n3) a [selection predicate](https://vega.github.io/vega-lite/docs/predicate.html#selection-predicate), which define the names of a selection that the data point should belong to (or a logical composition of selections).\n\n4) a [logical composition](https://vega.github.io/vega-lite/docs/predicate.html#composition) of (1), (2), or (3)."
        }
      },
      "required": [
        "filter"
      ],
      "type": "object"
    },
    "Fit": {
      "anyOf": [
        {
          "$ref": "#/definitions/GeoJsonFeature"
        },
        {
          "$ref": "#/definitions/GeoJsonFeatureCollection"
        },
        {
          "items": {
            "$ref": "#/definitions/GeoJsonFeature"
          },
          "type": "array"
        }
      ]
    },
    "FlattenTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field names for extracted array values.\n\n__Default value:__ The field name of the corresponding array field",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "flatten": {
          "description": "An array of one or more data fields containing arrays to flatten. If multiple fields are specified, their array values should have a parallel structure, ideally with the same length. If the lengths of parallel arrays do not match, the longest array will be used with `null` values added for missing entries.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        }
      },
      "required": [
        "flatten"
      ],
      "type": "object"
    },
    "FoldTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field names for the key and value properties produced by the fold transform. __Default value:__ `[\"key\", \"value\"]`",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "fold": {
          "description": "An array of data fields indicating the properties to fold.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        }
      },
      "required": [
        "fold"
      ],
      "type": "object"
    },
    "FontStyle": {
      "type": "string"
    },
    "FontWeight": {
      "enum": [
        "normal",
        "bold",
        "lighter",
        "bolder",
        100,
        200,
        300,
        400,
        500,
        600,
        700,
        800,
        900
      ],
      "type": [
        "string",
        "number"
      ]
    },
    "FormatConfig": {
      "additionalProperties": false,
      "properties": {
        "normalizedNumberFormat": {
          "description": "If normalizedNumberFormatType is not specified, D3 number format for axis labels, text marks, and tooltips of normalized stacked fields (fields with `stack: \"normalize\"`). For example `\"s\"` for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\n\nIf `config.normalizedNumberFormatType` is specified and `config.customFormatTypes` is `true`, this value will be passed as `format` alongside `datum.value` to the `config.numberFormatType` function. __Default value:__ `%`",
          "type": "string"
        },
        "normalizedNumberFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.normalizedNumberFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-format, which is exposed as [`format` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#format). __Note:__ You must also set `customFormatTypes` to `true` to use this feature.",
          "type": "string"
        },
        "numberFormat": {
          "description": "If numberFormatType is not specified, D3 number format for guide labels, text marks, and tooltips of non-normalized fields (fields *without* `stack: \"normalize\"`). For example `\"s\"` for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\n\nIf `config.numberFormatType` is specified and `config.customFormatTypes` is `true`, this value will be passed as `format` alongside `datum.value` to the `config.numberFormatType` function.",
          "type": "string"
        },
        "numberFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.numberFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-format, which is exposed as [`format` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#format). __Note:__ You must also set `customFormatTypes` to `true` to use this feature.",
          "type": "string"
        },
        "timeFormat": {
          "description": "Default time format for raw time values (without time units) in text marks, legend labels and header labels.\n\n__Default value:__ `\"%b %d, %Y\"` __Note:__ Axes automatically determine the format for each label automatically so this config does not affect axes.",
          "type": "string"
        },
        "timeFormatType": {
          "description": "[Custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type) for `config.timeFormat`.\n\n__Default value:__ `undefined` -- This is equilvalent to call D3-time-format, which is exposed as [`timeFormat` in Vega-Expression](https://vega.github.io/vega/docs/expressions/#timeFormat). __Note:__ You must also set `customFormatTypes` to `true` and there must *not* be a `timeUnit` defined to use this feature.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "Generator": {
      "anyOf": [
        {
          "$ref": "#/definitions/SequenceGenerator"
        },
        {
          "$ref": "#/definitions/SphereGenerator"
        },
        {
          "$ref": "#/definitions/GraticuleGenerator"
        }
      ]
    },
    "ConcatSpec<GenericSpec>": {
      "additionalProperties": false,
      "description": "Base interface for a generalized concatenation specification.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "concat": {
          "description": "A list of views to be concatenated.",
          "items": {
            "$ref": "#/definitions/Spec"
          },
          "type": "array"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "concat"
      ],
      "type": "object"
    },
    "FacetSpec": {
      "additionalProperties": false,
      "description": "Base interface for a facet specification.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "facet": {
          "anyOf": [
            {
              "$ref": "#/definitions/FacetFieldDef"
            },
            {
              "$ref": "#/definitions/FacetMapping"
            }
          ],
          "description": "Definition for how to facet the data. One of: 1) [a field definition for faceting the plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An object that maps `row` and `column` channels to their field definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "spec": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayerSpec"
            },
            {
              "$ref": "#/definitions/FacetedUnitSpec"
            }
          ],
          "description": "A specification of the view that gets faceted."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "facet",
        "spec"
      ],
      "type": "object"
    },
    "HConcatSpec<GenericSpec>": {
      "additionalProperties": false,
      "description": "Base interface for a horizontal concatenation specification.",
      "properties": {
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "hconcat": {
          "description": "A list of views to be concatenated and put into a row.",
          "items": {
            "$ref": "#/definitions/Spec"
          },
          "type": "array"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "description": "The spacing in pixels between sub-views of the concat operator.\n\n__Default value__: `10`",
          "type": "number"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "hconcat"
      ],
      "type": "object"
    },
    "Spec": {
      "anyOf": [
        {
          "$ref": "#/definitions/FacetedUnitSpec"
        },
        {
          "$ref": "#/definitions/LayerSpec"
        },
        {
          "$ref": "#/definitions/RepeatSpec"
        },
        {
          "$ref": "#/definitions/FacetSpec"
        },
        {
          "$ref": "#/definitions/ConcatSpec<GenericSpec>"
        },
        {
          "$ref": "#/definitions/VConcatSpec<GenericSpec>"
        },
        {
          "$ref": "#/definitions/HConcatSpec<GenericSpec>"
        }
      ],
      "description": "Any specification in Vega-Lite."
    },
    "GenericUnitSpec<Encoding,AnyMark>": {
      "additionalProperties": false,
      "description": "Base interface for a unit (single-view) specification.",
      "properties": {
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "A key-value mapping between encoding channels and definition of fields."
        },
        "mark": {
          "$ref": "#/definitions/AnyMark",
          "description": "A string describing the mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"rule\"`, `\"geoshape\"`, and `\"text\"`) or a [mark definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def)."
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "params": {
          "description": "An array of parameters that may either be simple variables, or more complex selections that map user input to data queries.",
          "items": {
            "$ref": "#/definitions/SelectionParameter"
          },
          "type": "array"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of geographic projection, which will be applied to `shape` path for `\"geoshape\"` marks and to `latitude` and `\"longitude\"` channels for other marks."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "mark"
      ],
      "type": "object"
    },
    "VConcatSpec<GenericSpec>": {
      "additionalProperties": false,
      "description": "Base interface for a vertical concatenation specification.",
      "properties": {
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "description": "The spacing in pixels between sub-views of the concat operator.\n\n__Default value__: `10`",
          "type": "number"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "vconcat": {
          "description": "A list of views to be concatenated and put into a column.",
          "items": {
            "$ref": "#/definitions/Spec"
          },
          "type": "array"
        }
      },
      "required": [
        "vconcat"
      ],
      "type": "object"
    },
    "GeoJsonFeature": {
      "$ref": "#/definitions/Feature"
    },
    "GeoJsonFeatureCollection": {
      "$ref": "#/definitions/FeatureCollection"
    },
    "GeoJsonProperties": {
      "anyOf": [
        {
          "type": "object"
        },
        {
          "type": "null"
        }
      ]
    },
    "Geometry": {
      "anyOf": [
        {
          "$ref": "#/definitions/Point"
        },
        {
          "$ref": "#/definitions/MultiPoint"
        },
        {
          "$ref": "#/definitions/LineString"
        },
        {
          "$ref": "#/definitions/MultiLineString"
        },
        {
          "$ref": "#/definitions/Polygon"
        },
        {
          "$ref": "#/definitions/MultiPolygon"
        },
        {
          "$ref": "#/definitions/GeometryCollection"
        }
      ],
      "description": "Union of geometry objects. https://tools.ietf.org/html/rfc7946#section-3"
    },
    "GeometryCollection": {
      "additionalProperties": false,
      "description": "Geometry Collection https://tools.ietf.org/html/rfc7946#section-3.1.8",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "geometries": {
          "items": {
            "$ref": "#/definitions/Geometry"
          },
          "type": "array"
        },
        "type": {
          "const": "GeometryCollection",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "geometries",
        "type"
      ],
      "type": "object"
    },
    "Gradient": {
      "anyOf": [
        {
          "$ref": "#/definitions/LinearGradient"
        },
        {
          "$ref": "#/definitions/RadialGradient"
        }
      ]
    },
    "GradientStop": {
      "additionalProperties": false,
      "properties": {
        "color": {
          "$ref": "#/definitions/Color",
          "description": "The color value at this point in the gradient."
        },
        "offset": {
          "description": "The offset fraction for the color stop, indicating its position within the gradient.",
          "type": "number"
        }
      },
      "required": [
        "offset",
        "color"
      ],
      "type": "object"
    },
    "GraticuleGenerator": {
      "additionalProperties": false,
      "properties": {
        "graticule": {
          "anyOf": [
            {
              "const": true,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/GraticuleParams"
            }
          ],
          "description": "Generate graticule GeoJSON data for geographic reference lines."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        }
      },
      "required": [
        "graticule"
      ],
      "type": "object"
    },
    "GraticuleParams": {
      "additionalProperties": false,
      "properties": {
        "extent": {
          "$ref": "#/definitions/Vector2<Vector2<number>>",
          "description": "Sets both the major and minor extents to the same values."
        },
        "extentMajor": {
          "$ref": "#/definitions/Vector2<Vector2<number>>",
          "description": "The major extent of the graticule as a two-element array of coordinates."
        },
        "extentMinor": {
          "$ref": "#/definitions/Vector2<Vector2<number>>",
          "description": "The minor extent of the graticule as a two-element array of coordinates."
        },
        "precision": {
          "description": "The precision of the graticule in degrees.\n\n__Default value:__ `2.5`",
          "type": "number"
        },
        "step": {
          "$ref": "#/definitions/Vector2<number>",
          "description": "Sets both the major and minor step angles to the same values."
        },
        "stepMajor": {
          "$ref": "#/definitions/Vector2<number>",
          "description": "The major step angles of the graticule.\n\n\n__Default value:__ `[90, 360]`"
        },
        "stepMinor": {
          "$ref": "#/definitions/Vector2<number>",
          "description": "The minor step angles of the graticule.\n\n__Default value:__ `[10, 10]`"
        }
      },
      "type": "object"
    },
    "Header": {
      "additionalProperties": false,
      "description": "Headers of row / column channels for faceted plots.",
      "properties": {
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal text alignment of header labels. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "labelAnchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the labels. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with a label orientation of top these anchor positions map to a left-, center-, or right-aligned label."
        },
        "labelAngle": {
          "description": "The rotation angle of the header labels.\n\n__Default value:__ `0` for column header, `-90` for row header.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical text baseline for the header labels. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `titleLineHeight` rather than `titleFontSize` alone."
        },
        "labelColor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the header label, can be in hex color code or regular color name."
        },
        "labelExpr": {
          "description": "[Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.\n\n__Note:__ The label text and value can be assessed via the `label` and `value` properties of the header's backing `datum` object.",
          "type": "string"
        },
        "labelFont": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font of the header label."
        },
        "labelFontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font size of the header label, in pixels.",
          "minimum": 0
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font style of the header label."
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font weight of the header label."
        },
        "labelLimit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of the header label in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0`, indicating no limit"
        },
        "labelLineHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Line height in pixels for multi-line header labels or title text with `\"line-top\"` or `\"line-bottom\"` baseline."
        },
        "labelOrient": {
          "$ref": "#/definitions/Orient",
          "description": "The orientation of the header label. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`."
        },
        "labelPadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The padding, in pixel, between facet header's label and the plot.\n\n__Default value:__ `10`"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the header.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "orient": {
          "$ref": "#/definitions/Orient",
          "description": "Shortcut for setting both labelOrient and titleOrient."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal text alignment (to the anchor) of header titles."
        },
        "titleAnchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
        },
        "titleAngle": {
          "description": "The rotation angle of the header title.\n\n__Default value:__ `0`.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical text baseline for the header title. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `titleLineHeight` rather than `titleFontSize` alone.\n\n__Default value:__ `\"middle\"`"
        },
        "titleColor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the header title, can be in hex color code or regular color name."
        },
        "titleFont": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font of the header title. (e.g., `\"Helvetica Neue\"`)."
        },
        "titleFontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font size of the header title.",
          "minimum": 0
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font style of the header title."
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font weight of the header title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleLimit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of the header title in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0`, indicating no limit"
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Line height in pixels for multi-line header title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline."
        },
        "titleOrient": {
          "$ref": "#/definitions/Orient",
          "description": "The orientation of the header title. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`."
        },
        "titlePadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The padding, in pixel, between facet header's title and the label.\n\n__Default value:__ `10`"
        }
      },
      "type": "object"
    },
    "HeaderConfig": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal text alignment of header labels. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "labelAnchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the labels. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with a label orientation of top these anchor positions map to a left-, center-, or right-aligned label."
        },
        "labelAngle": {
          "description": "The rotation angle of the header labels.\n\n__Default value:__ `0` for column header, `-90` for row header.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical text baseline for the header labels. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `titleLineHeight` rather than `titleFontSize` alone."
        },
        "labelColor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The color of the header label, can be in hex color code or regular color name."
        },
        "labelExpr": {
          "description": "[Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.\n\n__Note:__ The label text and value can be assessed via the `label` and `value` properties of the header's backing `datum` object.",
          "type": "string"
        },
        "labelFont": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font of the header label."
        },
        "labelFontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font size of the header label, in pixels.",
          "minimum": 0
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font style of the header label."
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font weight of the header label."
        },
        "labelLimit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of the header label in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0`, indicating no limit"
        },
        "labelLineHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Line height in pixels for multi-line header labels or title text with `\"line-top\"` or `\"line-bottom\"` baseline."
        },
        "labelOrient": {
          "$ref": "#/definitions/Orient",
          "description": "The orientation of the header label. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`."
        },
        "labelPadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The padding, in pixel, between facet header's label and the plot.\n\n__Default value:__ `10`"
        },
        "labels": {
          "description": "A boolean flag indicating if labels should be included as part of the header.\n\n__Default value:__ `true`.",
          "type": "boolean"
        },
        "orient": {
          "$ref": "#/definitions/Orient",
          "description": "Shortcut for setting both labelOrient and titleOrient."
        },
        "title": {
          "description": "Set to null to disable title for the axis, legend, or header.",
          "type": "null"
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Horizontal text alignment (to the anchor) of header titles."
        },
        "titleAnchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."
        },
        "titleAngle": {
          "description": "The rotation angle of the header title.\n\n__Default value:__ `0`.",
          "maximum": 360,
          "minimum": -360,
          "type": "number"
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The vertical text baseline for the header title. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `titleLineHeight` rather than `titleFontSize` alone.\n\n__Default value:__ `\"middle\"`"
        },
        "titleColor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Color of the header title, can be in hex color code or regular color name."
        },
        "titleFont": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font of the header title. (e.g., `\"Helvetica Neue\"`)."
        },
        "titleFontSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font size of the header title.",
          "minimum": 0
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The font style of the header title."
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Font weight of the header title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
        },
        "titleLimit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The maximum length of the header title in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0`, indicating no limit"
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Line height in pixels for multi-line header title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline."
        },
        "titleOrient": {
          "$ref": "#/definitions/Orient",
          "description": "The orientation of the header title. One of `\"top\"`, `\"bottom\"`, `\"left\"` or `\"right\"`."
        },
        "titlePadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The padding, in pixel, between facet header's title and the label.\n\n__Default value:__ `10`"
        }
      },
      "type": "object"
    },
    "HexColor": {
      "format": "color-hex",
      "type": "string"
    },
    "ImputeMethod": {
      "enum": [
        "value",
        "median",
        "max",
        "min",
        "mean"
      ],
      "type": "string"
    },
    "ImputeParams": {
      "additionalProperties": false,
      "properties": {
        "frame": {
          "description": "A frame specification as a two-element array used to control the window over which the specified method is applied. The array entries should either be a number indicating the offset from the current data object, or null to indicate unbounded rows preceding or following the current data object. For example, the value `[-5, 5]` indicates that the window should include five objects preceding and five objects following the current object.\n\n__Default value:__:  `[null, null]` indicating that the window includes all objects.",
          "items": {
            "type": [
              "null",
              "number"
            ]
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "keyvals": {
          "anyOf": [
            {
              "items": {},
              "type": "array"
            },
            {
              "$ref": "#/definitions/ImputeSequence"
            }
          ],
          "description": "Defines the key values that should be considered for imputation. An array of key values or an object defining a [number sequence](https://vega.github.io/vega-lite/docs/impute.html#sequence-def).\n\nIf provided, this will be used in addition to the key values observed within the input data. If not provided, the values will be derived from all unique values of the `key` field. For `impute` in `encoding`, the key field is the x-field if the y-field is imputed, or vice versa.\n\nIf there is no impute grouping, this property _must_ be specified."
        },
        "method": {
          "$ref": "#/definitions/ImputeMethod",
          "description": "The imputation method to use for the field value of imputed data objects. One of `\"value\"`, `\"mean\"`, `\"median\"`, `\"max\"` or `\"min\"`.\n\n__Default value:__  `\"value\"`"
        },
        "value": {
          "description": "The field value to use when the imputation `method` is `\"value\"`."
        }
      },
      "type": "object"
    },
    "ImputeSequence": {
      "additionalProperties": false,
      "properties": {
        "start": {
          "description": "The starting value of the sequence. __Default value:__ `0`",
          "type": "number"
        },
        "step": {
          "description": "The step value between sequence entries. __Default value:__ `1` or `-1` if `stop < start`",
          "type": "number"
        },
        "stop": {
          "description": "The ending value(exclusive) of the sequence.",
          "type": "number"
        }
      },
      "required": [
        "stop"
      ],
      "type": "object"
    },
    "ImputeTransform": {
      "additionalProperties": false,
      "properties": {
        "frame": {
          "description": "A frame specification as a two-element array used to control the window over which the specified method is applied. The array entries should either be a number indicating the offset from the current data object, or null to indicate unbounded rows preceding or following the current data object. For example, the value `[-5, 5]` indicates that the window should include five objects preceding and five objects following the current object.\n\n__Default value:__:  `[null, null]` indicating that the window includes all objects.",
          "items": {
            "type": [
              "null",
              "number"
            ]
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "groupby": {
          "description": "An optional array of fields by which to group the values. Imputation will then be performed on a per-group basis.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "impute": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which the missing values should be imputed."
        },
        "key": {
          "$ref": "#/definitions/FieldName",
          "description": "A key field that uniquely identifies data objects within a group. Missing key values (those occurring in the data but not in the current group) will be imputed."
        },
        "keyvals": {
          "anyOf": [
            {
              "items": {},
              "type": "array"
            },
            {
              "$ref": "#/definitions/ImputeSequence"
            }
          ],
          "description": "Defines the key values that should be considered for imputation. An array of key values or an object defining a [number sequence](https://vega.github.io/vega-lite/docs/impute.html#sequence-def).\n\nIf provided, this will be used in addition to the key values observed within the input data. If not provided, the values will be derived from all unique values of the `key` field. For `impute` in `encoding`, the key field is the x-field if the y-field is imputed, or vice versa.\n\nIf there is no impute grouping, this property _must_ be specified."
        },
        "method": {
          "$ref": "#/definitions/ImputeMethod",
          "description": "The imputation method to use for the field value of imputed data objects. One of `\"value\"`, `\"mean\"`, `\"median\"`, `\"max\"` or `\"min\"`.\n\n__Default value:__  `\"value\"`"
        },
        "value": {
          "description": "The field value to use when the imputation `method` is `\"value\"`."
        }
      },
      "required": [
        "impute",
        "key"
      ],
      "type": "object"
    },
    "InlineData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "values": {
          "$ref": "#/definitions/InlineDataset",
          "description": "The full data set, included inline. This can be an array of objects or primitive values, an object, or a string. Arrays of primitive values are ingested as objects with a `data` property. Strings are parsed according to the specified format type."
        }
      },
      "required": [
        "values"
      ],
      "type": "object"
    },
    "InlineDataset": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "boolean"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "object"
          },
          "type": "array"
        },
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    },
    "Interpolate": {
      "enum": [
        "basis",
        "basis-open",
        "basis-closed",
        "bundle",
        "cardinal",
        "cardinal-open",
        "cardinal-closed",
        "catmull-rom",
        "linear",
        "linear-closed",
        "monotone",
        "natural",
        "step",
        "step-before",
        "step-after"
      ],
      "type": "string"
    },
    "IntervalSelectionConfig": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Clears the selection, emptying it of all values. This property can be a [Event Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable clear.\n\n__Default value:__ `dblclick`.\n\n__See also:__ [`clear` examples ](https://vega.github.io/vega-lite/docs/selection.html#clear) in the documentation."
        },
        "encodings": {
          "description": "An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/SingleDefUnitChannel"
          },
          "type": "array"
        },
        "fields": {
          "description": "An array of field names whose values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "mark": {
          "$ref": "#/definitions/BrushConfig",
          "description": "An interval selection also adds a rectangle mark to depict the extents of the interval. The `mark` property can be used to customize the appearance of the mark.\n\n__See also:__ [`mark` examples](https://vega.github.io/vega-lite/docs/selection.html#mark) in the documentation."
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            }
          ],
          "description": "A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection. For interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\n\n__See also:__ [`on` examples](https://vega.github.io/vega-lite/docs/selection.html#on) in the documentation."
        },
        "resolve": {
          "$ref": "#/definitions/SelectionResolution",
          "description": "With layered and multi-view displays, a strategy that determines how selections' data queries are resolved when applied in a filter transform, conditional encoding rule, or scale domain.\n\nOne of:\n- `\"global\"` -- only one brush exists for the entire SPLOM. When the user begins to drag, any previous brushes are cleared, and a new one is constructed.\n- `\"union\"` -- each cell contains its own brush, and points are highlighted if they lie within _any_ of these individual brushes.\n- `\"intersect\"` -- each cell contains its own brush, and points are highlighted only if they fall within _all_ of these individual brushes.\n\n__Default value:__ `global`.\n\n__See also:__ [`resolve` examples](https://vega.github.io/vega-lite/docs/selection.html#resolve) in the documentation."
        },
        "translate": {
          "description": "When truthy, allows a user to interactively move an interval selection back-and-forth. Can be `true`, `false` (to disable panning), or a [Vega event stream definition](https://vega.github.io/vega/docs/event-streams/) which must include a start and end event to trigger continuous panning. Discrete panning (e.g., pressing the left/right arrow keys) will be supported in future versions.\n\n__Default value:__ `true`, which corresponds to `[pointerdown, window:pointerup] > window:pointermove!`. This default allows users to clicks and drags within an interval selection to reposition it.\n\n__See also:__ [`translate` examples](https://vega.github.io/vega-lite/docs/selection.html#translate) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        },
        "type": {
          "const": "interval",
          "description": "Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`.",
          "type": "string"
        },
        "zoom": {
          "description": "When truthy, allows a user to interactively resize an interval selection. Can be `true`, `false` (to disable zooming), or a [Vega event stream definition](https://vega.github.io/vega/docs/event-streams/). Currently, only `wheel` events are supported, but custom event streams can still be used to specify filters, debouncing, and throttling. Future versions will expand the set of events that can trigger this transformation.\n\n__Default value:__ `true`, which corresponds to `wheel!`. This default allows users to use the mouse wheel to resize an interval selection.\n\n__See also:__ [`zoom` examples](https://vega.github.io/vega-lite/docs/selection.html#zoom) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "IntervalSelectionConfigWithoutType": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Clears the selection, emptying it of all values. This property can be a [Event Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable clear.\n\n__Default value:__ `dblclick`.\n\n__See also:__ [`clear` examples ](https://vega.github.io/vega-lite/docs/selection.html#clear) in the documentation."
        },
        "encodings": {
          "description": "An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/SingleDefUnitChannel"
          },
          "type": "array"
        },
        "fields": {
          "description": "An array of field names whose values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "mark": {
          "$ref": "#/definitions/BrushConfig",
          "description": "An interval selection also adds a rectangle mark to depict the extents of the interval. The `mark` property can be used to customize the appearance of the mark.\n\n__See also:__ [`mark` examples](https://vega.github.io/vega-lite/docs/selection.html#mark) in the documentation."
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            }
          ],
          "description": "A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection. For interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\n\n__See also:__ [`on` examples](https://vega.github.io/vega-lite/docs/selection.html#on) in the documentation."
        },
        "resolve": {
          "$ref": "#/definitions/SelectionResolution",
          "description": "With layered and multi-view displays, a strategy that determines how selections' data queries are resolved when applied in a filter transform, conditional encoding rule, or scale domain.\n\nOne of:\n- `\"global\"` -- only one brush exists for the entire SPLOM. When the user begins to drag, any previous brushes are cleared, and a new one is constructed.\n- `\"union\"` -- each cell contains its own brush, and points are highlighted if they lie within _any_ of these individual brushes.\n- `\"intersect\"` -- each cell contains its own brush, and points are highlighted only if they fall within _all_ of these individual brushes.\n\n__Default value:__ `global`.\n\n__See also:__ [`resolve` examples](https://vega.github.io/vega-lite/docs/selection.html#resolve) in the documentation."
        },
        "translate": {
          "description": "When truthy, allows a user to interactively move an interval selection back-and-forth. Can be `true`, `false` (to disable panning), or a [Vega event stream definition](https://vega.github.io/vega/docs/event-streams/) which must include a start and end event to trigger continuous panning. Discrete panning (e.g., pressing the left/right arrow keys) will be supported in future versions.\n\n__Default value:__ `true`, which corresponds to `[pointerdown, window:pointerup] > window:pointermove!`. This default allows users to clicks and drags within an interval selection to reposition it.\n\n__See also:__ [`translate` examples](https://vega.github.io/vega-lite/docs/selection.html#translate) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        },
        "zoom": {
          "description": "When truthy, allows a user to interactively resize an interval selection. Can be `true`, `false` (to disable zooming), or a [Vega event stream definition](https://vega.github.io/vega/docs/event-streams/). Currently, only `wheel` events are supported, but custom event streams can still be used to specify filters, debouncing, and throttling. Future versions will expand the set of events that can trigger this transformation.\n\n__Default value:__ `true`, which corresponds to `wheel!`. This default allows users to use the mouse wheel to resize an interval selection.\n\n__See also:__ [`zoom` examples](https://vega.github.io/vega-lite/docs/selection.html#zoom) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        }
      },
      "type": "object"
    },
    "JoinAggregateFieldDef": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The output name for the join aggregate operation."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which to compute the aggregate function. This can be omitted for functions that do not operate over a field such as `\"count\"`."
        },
        "op": {
          "$ref": "#/definitions/AggregateOp",
          "description": "The aggregation operation to apply (e.g., `\"sum\"`, `\"average\"` or `\"count\"`). See the list of all supported operations [here](https://vega.github.io/vega-lite/docs/aggregate.html#ops)."
        }
      },
      "required": [
        "op",
        "as"
      ],
      "type": "object"
    },
    "JoinAggregateTransform": {
      "additionalProperties": false,
      "properties": {
        "groupby": {
          "description": "The data fields for partitioning the data objects into separate groups. If unspecified, all data points will be in a single group.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "joinaggregate": {
          "description": "The definition of the fields in the join aggregate, and what calculations to use.",
          "items": {
            "$ref": "#/definitions/JoinAggregateFieldDef"
          },
          "type": "array"
        }
      },
      "required": [
        "joinaggregate"
      ],
      "type": "object"
    },
    "JsonDataFormat": {
      "additionalProperties": false,
      "properties": {
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using JavaScript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "property": {
          "description": "The JSON property containing the desired data. This parameter can be used when the loaded JSON file may have surrounding structure or meta-data. For example `\"property\": \"values.features\"` is equivalent to retrieving `json.values.features` from the loaded JSON object.",
          "type": "string"
        },
        "type": {
          "const": "json",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "LabelOverlap": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "const": "parity",
          "type": "string"
        },
        {
          "const": "greedy",
          "type": "string"
        }
      ]
    },
    "LatLongDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/LatLongFieldDef"
        },
        {
          "$ref": "#/definitions/DatumDef"
        }
      ]
    },
    "LatLongFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
          "type": "null"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "const": "quantitative",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "LayerRepeatMapping": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "description": "An array of fields to be repeated horizontally.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "layer": {
          "description": "An array of fields to be repeated as layers.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "row": {
          "description": "An array of fields to be repeated vertically.",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "required": [
        "layer"
      ],
      "type": "object"
    },
    "LayerRepeatSpec": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "repeat": {
          "$ref": "#/definitions/LayerRepeatMapping",
          "description": "Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If `\"repeat\"` is an array, the field can be referred to as `{\"repeat\": \"repeat\"}`. The repeated views are laid out in a wrapped row. You can set the number of columns to control the wrapping. 2) An object that maps `\"row\"` and/or `\"column\"` to the listed fields to be repeated along the particular orientations. The objects `{\"repeat\": \"row\"}` and `{\"repeat\": \"column\"}` can be used to refer to the repeated field respectively."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "spec": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayerSpec"
            },
            {
              "$ref": "#/definitions/UnitSpecWithFrame"
            }
          ],
          "description": "A specification of the view that gets repeated."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "repeat",
        "spec"
      ],
      "type": "object"
    },
    "LayerSpec": {
      "additionalProperties": false,
      "description": "A full layered plot specification, which may contains `encoding` and `projection` properties that will be applied to underlying unit (single-view) specifications.",
      "properties": {
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/SharedEncoding",
          "description": "A shared key-value mapping between encoding channels and definition of fields in the underlying layers."
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The height of a visualization.\n\n- For a plot with a continuous y-field, height should be a number.\n- For a plot with either a discrete y-field or no y-field, height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step. (No y-field is equivalent to having one discrete step.)\n- To enable responsive sizing on height, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous y-field and `config.view.discreteHeight` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        },
        "layer": {
          "description": "Layer or single view specifications to be layered.\n\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed. Instead, use the [facet operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a facet.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/LayerSpec"
              },
              {
                "$ref": "#/definitions/UnitSpec"
              }
            ]
          },
          "type": "array"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of the geographic projection shared by underlying layers."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "An object defining the view background's fill and stroke.\n\n__Default value:__ none (transparent)"
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The width of a visualization.\n\n- For a plot with a continuous x-field, width should be a number.\n- For a plot with either a discrete x-field or no x-field, width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step. (No x-field is equivalent to having one discrete step.)\n- To enable responsive sizing on width, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous x-field and `config.view.discreteWidth` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        }
      },
      "required": [
        "layer"
      ],
      "type": "object"
    },
    "LayoutAlign": {
      "enum": [
        "all",
        "each",
        "none"
      ],
      "type": "string"
    },
    "Legend": {
      "additionalProperties": false,
      "description": "Properties of a legend or boolean flag for determining whether to show it.",
      "properties": {
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the legend from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clipHeight": {
          "anyOf": [
            {
              "description": "The height in pixels to clip symbol legend entries and limit their size.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "columnPadding": {
          "anyOf": [
            {
              "description": "The horizontal padding in pixels between symbol legend entries.\n\n__Default value:__ `10`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "columns": {
          "anyOf": [
            {
              "description": "The number of columns in which to arrange symbol legend entries. A value of `0` or lower indicates a single row with one column per entry.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "Corner radius for the full legend.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of this legend for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If the `aria` property is true, for SVG output the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) will be set to this description. If the description is unspecified it will be automatically generated.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "direction": {
          "$ref": "#/definitions/Orientation",
          "description": "The direction of the legend, one of `\"vertical\"` or `\"horizontal\"`.\n\n__Default value:__\n- For top-/bottom-`orient`ed legends, `\"horizontal\"`\n- For left-/right-`orient`ed legends, `\"vertical\"`\n- For top/bottom-left/right-`orient`ed legends, `\"horizontal\"` for gradient legends and `\"vertical\"` for symbol legends."
        },
        "fillColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Background fill color for the full legend."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "gradientLength": {
          "anyOf": [
            {
              "description": "The length in pixels of the primary axis of a color gradient. This value corresponds to the height of a vertical gradient or the width of a horizontal gradient.\n\n__Default value:__ `200`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the color gradient.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientStrokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the gradient stroke, can be in hex color code or regular color name.\n\n__Default value:__ `\"lightGray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientStrokeWidth": {
          "anyOf": [
            {
              "description": "The width of the gradient stroke, in pixels.\n\n__Default value:__ `0`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientThickness": {
          "anyOf": [
            {
              "description": "The thickness in pixels of the color gradient. This value corresponds to the width of a vertical gradient or the height of a horizontal gradient.\n\n__Default value:__ `16`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gridAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign",
              "description": "The alignment to apply to symbol legends rows and columns. The supported string values are `\"all\"`, `\"each\"` (the default), and `none`. For more information, see the [grid layout documentation](https://vega.github.io/vega/docs/layout).\n\n__Default value:__ `\"each\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "The alignment of the legend label, can be left, center, or right."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "The position of the baseline of legend label, can be `\"top\"`, `\"middle\"`, `\"bottom\"`, or `\"alphabetic\"`.\n\n__Default value:__ `\"middle\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend label, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelExpr": {
          "description": "[Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.\n\n__Note:__ The label text and value can be assessed via the `label` and `value` properties of the legend's backing `datum` object.",
          "type": "string"
        },
        "labelFont": {
          "anyOf": [
            {
              "description": "The font of the legend label.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontSize": {
          "anyOf": [
            {
              "description": "The font size of legend label.\n\n__Default value:__ `10`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style of legend label."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight of legend label."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of legend tick labels.\n\n__Default value:__ `160`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOffset": {
          "anyOf": [
            {
              "description": "The offset of the legend label.\n\n__Default value:__ `4`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOpacity": {
          "anyOf": [
            {
              "description": "Opacity of labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOverlap": {
          "anyOf": [
            {
              "$ref": "#/definitions/LabelOverlap",
              "description": "The strategy to use for resolving overlap of labels in gradient legends. If `false`, no overlap reduction is attempted. If set to `true` (default) or `\"parity\"`, a strategy of removing every other label is used. If set to `\"greedy\"`, a linear scan of the labels is performed, removing any label that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `true`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelPadding": {
          "anyOf": [
            {
              "description": "Padding in pixels between the legend and legend labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelSeparation": {
          "anyOf": [
            {
              "description": "The minimum separation that must be between label bounding boxes for them to be considered non-overlapping (default `0`). This property is ignored if *labelOverlap* resolution is not enabled.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "legendX": {
          "anyOf": [
            {
              "description": "Custom x-position for legend with orient \"none\".",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "legendY": {
          "anyOf": [
            {
              "description": "Custom y-position for legend with orient \"none\".",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "description": "The offset in pixels by which to displace the legend from the data rectangle and axes.\n\n__Default value:__ `18`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "orient": {
          "$ref": "#/definitions/LegendOrient",
          "description": "The orientation of the legend, which determines how the legend is positioned within the scene. One of `\"left\"`, `\"right\"`, `\"top\"`, `\"bottom\"`, `\"top-left\"`, `\"top-right\"`, `\"bottom-left\"`, `\"bottom-right\"`, `\"none\"`.\n\n__Default value:__ `\"right\"`"
        },
        "padding": {
          "anyOf": [
            {
              "description": "The padding between the border and content of the legend group.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "rowPadding": {
          "anyOf": [
            {
              "description": "The vertical padding in pixels between symbol legend entries.\n\n__Default value:__ `2`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Border stroke color for the full legend."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed symbol strokes.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the symbol stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolFillColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend symbol,"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolLimit": {
          "anyOf": [
            {
              "description": "The maximum number of allowed entries for a symbol legend. Additional entries will be dropped.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolOffset": {
          "anyOf": [
            {
              "description": "Horizontal pixel offset for legend symbols.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the legend symbols.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolSize": {
          "anyOf": [
            {
              "description": "The size of the legend symbol, in pixels.\n\n__Default value:__ `100`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolStrokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Stroke color for legend symbols."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolStrokeWidth": {
          "anyOf": [
            {
              "description": "The width of the symbol's stroke.\n\n__Default value:__ `1.5`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolType": {
          "anyOf": [
            {
              "$ref": "#/definitions/SymbolShape",
              "description": "The symbol shape. One of the plotting shapes `circle` (default), `square`, `cross`, `diamond`, `triangle-up`, `triangle-down`, `triangle-right`, or `triangle-left`, the line symbol `stroke`, or one of the centered directional shapes `arrow`, `wedge`, or `triangle`. Alternatively, a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) can be provided. For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.\n\n__Default value:__ `\"circle\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickCount": {
          "anyOf": [
            {
              "$ref": "#/definitions/TickCount",
              "description": "The desired number of tick values for quantitative legends."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickMinStep": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum desired step between legend ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.\n\n__Default value__: `undefined`"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment for legend titles.\n\n__Default value:__ `\"left\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAnchor": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleAnchor",
              "description": "Text anchor position for placing legend titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline for legend titles.  One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone.\n\n__Default value:__ `\"top\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend title, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFont": {
          "anyOf": [
            {
              "description": "The font of the legend title.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontSize": {
          "anyOf": [
            {
              "description": "The font size of the legend title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style of the legend title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight of the legend title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of legend titles.\n\n__Default value:__ `180`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the legend title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOrient": {
          "anyOf": [
            {
              "$ref": "#/definitions/Orient",
              "description": "Orientation of the legend title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titlePadding": {
          "anyOf": [
            {
              "description": "The padding, in pixels, between title and legend.\n\n__Default value:__ `5`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "type": {
          "description": "The type of the legend. Use `\"symbol\"` to create a discrete legend and `\"gradient\"` for a continuous color gradient.\n\n__Default value:__ `\"gradient\"` for non-binned quantitative fields and temporal fields; `\"symbol\"` otherwise.",
          "enum": [
            "symbol",
            "gradient"
          ],
          "type": "string"
        },
        "values": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "items": {
                "type": "boolean"
              },
              "type": "array"
            },
            {
              "items": {
                "$ref": "#/definitions/DateTime"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Explicitly set the visible legend values."
        },
        "zindex": {
          "description": "A non-negative integer indicating the z-index of the legend. If zindex is 0, legend should be drawn behind all chart elements. To put them in front, use zindex = 1.",
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "LegendBinding": {
      "anyOf": [
        {
          "const": "legend",
          "type": "string"
        },
        {
          "$ref": "#/definitions/LegendStreamBinding"
        }
      ]
    },
    "LegendConfig": {
      "additionalProperties": false,
      "properties": {
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the legend from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clipHeight": {
          "anyOf": [
            {
              "description": "The height in pixels to clip symbol legend entries and limit their size.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "columnPadding": {
          "anyOf": [
            {
              "description": "The horizontal padding in pixels between symbol legend entries.\n\n__Default value:__ `10`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "columns": {
          "anyOf": [
            {
              "description": "The number of columns in which to arrange symbol legend entries. A value of `0` or lower indicates a single row with one column per entry.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "Corner radius for the full legend.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of this legend for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If the `aria` property is true, for SVG output the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) will be set to this description. If the description is unspecified it will be automatically generated.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "direction": {
          "$ref": "#/definitions/Orientation",
          "description": "The direction of the legend, one of `\"vertical\"` or `\"horizontal\"`.\n\n__Default value:__\n- For top-/bottom-`orient`ed legends, `\"horizontal\"`\n- For left-/right-`orient`ed legends, `\"vertical\"`\n- For top/bottom-left/right-`orient`ed legends, `\"horizontal\"` for gradient legends and `\"vertical\"` for symbol legends."
        },
        "disable": {
          "description": "Disable legend by default",
          "type": "boolean"
        },
        "fillColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Background fill color for the full legend."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientDirection": {
          "anyOf": [
            {
              "$ref": "#/definitions/Orientation",
              "description": "The default direction (`\"horizontal\"` or `\"vertical\"`) for gradient legends.\n\n__Default value:__ `\"vertical\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientHorizontalMaxLength": {
          "description": "Max legend length for a horizontal gradient when `config.legend.gradientLength` is undefined.\n\n__Default value:__ `200`",
          "type": "number"
        },
        "gradientHorizontalMinLength": {
          "description": "Min legend length for a horizontal gradient when `config.legend.gradientLength` is undefined.\n\n__Default value:__ `100`",
          "type": "number"
        },
        "gradientLabelLimit": {
          "anyOf": [
            {
              "description": "The maximum allowed length in pixels of color ramp gradient labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientLabelOffset": {
          "anyOf": [
            {
              "description": "Vertical offset in pixels for color ramp gradient labels.\n\n__Default value:__ `2`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientLength": {
          "anyOf": [
            {
              "description": "The length in pixels of the primary axis of a color gradient. This value corresponds to the height of a vertical gradient or the width of a horizontal gradient.\n\n__Default value:__ `200`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the color gradient.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientStrokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the gradient stroke, can be in hex color code or regular color name.\n\n__Default value:__ `\"lightGray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientStrokeWidth": {
          "anyOf": [
            {
              "description": "The width of the gradient stroke, in pixels.\n\n__Default value:__ `0`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientThickness": {
          "anyOf": [
            {
              "description": "The thickness in pixels of the color gradient. This value corresponds to the width of a vertical gradient or the height of a horizontal gradient.\n\n__Default value:__ `16`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "gradientVerticalMaxLength": {
          "description": "Max legend length for a vertical gradient when `config.legend.gradientLength` is undefined.\n\n__Default value:__ `200`",
          "type": "number"
        },
        "gradientVerticalMinLength": {
          "description": "Min legend length for a vertical gradient when `config.legend.gradientLength` is undefined.\n\n__Default value:__ `100`",
          "type": "number"
        },
        "gridAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign",
              "description": "The alignment to apply to symbol legends rows and columns. The supported string values are `\"all\"`, `\"each\"` (the default), and `none`. For more information, see the [grid layout documentation](https://vega.github.io/vega/docs/layout).\n\n__Default value:__ `\"each\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "The alignment of the legend label, can be left, center, or right."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "The position of the baseline of legend label, can be `\"top\"`, `\"middle\"`, `\"bottom\"`, or `\"alphabetic\"`.\n\n__Default value:__ `\"middle\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend label, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFont": {
          "anyOf": [
            {
              "description": "The font of the legend label.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontSize": {
          "anyOf": [
            {
              "description": "The font size of legend label.\n\n__Default value:__ `10`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style of legend label."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight of legend label."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of legend tick labels.\n\n__Default value:__ `160`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOffset": {
          "anyOf": [
            {
              "description": "The offset of the legend label.\n\n__Default value:__ `4`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOpacity": {
          "anyOf": [
            {
              "description": "Opacity of labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelOverlap": {
          "anyOf": [
            {
              "$ref": "#/definitions/LabelOverlap"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The strategy to use for resolving overlap of labels in gradient legends. If `false`, no overlap reduction is attempted. If set to `true` or `\"parity\"`, a strategy of removing every other label is used. If set to `\"greedy\"`, a linear scan of the labels is performed, removing any label that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `\"greedy\"` for `log scales otherwise `true`."
        },
        "labelPadding": {
          "anyOf": [
            {
              "description": "Padding in pixels between the legend and legend labels.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "labelSeparation": {
          "anyOf": [
            {
              "description": "The minimum separation that must be between label bounding boxes for them to be considered non-overlapping (default `0`). This property is ignored if *labelOverlap* resolution is not enabled.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "layout": {
          "$ref": "#/definitions/ExprRef"
        },
        "legendX": {
          "anyOf": [
            {
              "description": "Custom x-position for legend with orient \"none\".",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "legendY": {
          "anyOf": [
            {
              "description": "Custom y-position for legend with orient \"none\".",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "description": "The offset in pixels by which to displace the legend from the data rectangle and axes.\n\n__Default value:__ `18`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "orient": {
          "$ref": "#/definitions/LegendOrient",
          "description": "The orientation of the legend, which determines how the legend is positioned within the scene. One of `\"left\"`, `\"right\"`, `\"top\"`, `\"bottom\"`, `\"top-left\"`, `\"top-right\"`, `\"bottom-left\"`, `\"bottom-right\"`, `\"none\"`.\n\n__Default value:__ `\"right\"`"
        },
        "padding": {
          "anyOf": [
            {
              "description": "The padding between the border and content of the legend group.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "rowPadding": {
          "anyOf": [
            {
              "description": "The vertical padding in pixels between symbol legend entries.\n\n__Default value:__ `2`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Border stroke color for the full legend."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "Border stroke dash pattern for the full legend.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "Border stroke width for the full legend.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolBaseFillColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Default fill color for legend symbols. Only applied if there is no `\"fill\"` scale color encoding for the legend.\n\n__Default value:__ `\"transparent\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolBaseStrokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Default stroke color for legend symbols. Only applied if there is no `\"fill\"` scale color encoding for the legend.\n\n__Default value:__ `\"gray\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolDash": {
          "anyOf": [
            {
              "description": "An array of alternating [stroke, space] lengths for dashed symbol strokes.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolDashOffset": {
          "anyOf": [
            {
              "description": "The pixel offset at which to start drawing with the symbol stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolDirection": {
          "anyOf": [
            {
              "$ref": "#/definitions/Orientation",
              "description": "The default direction (`\"horizontal\"` or `\"vertical\"`) for symbol legends.\n\n__Default value:__ `\"vertical\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolFillColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend symbol,"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolLimit": {
          "anyOf": [
            {
              "description": "The maximum number of allowed entries for a symbol legend. Additional entries will be dropped.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolOffset": {
          "anyOf": [
            {
              "description": "Horizontal pixel offset for legend symbols.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the legend symbols.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolSize": {
          "anyOf": [
            {
              "description": "The size of the legend symbol, in pixels.\n\n__Default value:__ `100`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolStrokeColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Stroke color for legend symbols."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolStrokeWidth": {
          "anyOf": [
            {
              "description": "The width of the symbol's stroke.\n\n__Default value:__ `1.5`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "symbolType": {
          "anyOf": [
            {
              "$ref": "#/definitions/SymbolShape",
              "description": "The symbol shape. One of the plotting shapes `circle` (default), `square`, `cross`, `diamond`, `triangle-up`, `triangle-down`, `triangle-right`, or `triangle-left`, the line symbol `stroke`, or one of the centered directional shapes `arrow`, `wedge`, or `triangle`. Alternatively, a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) can be provided. For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.\n\n__Default value:__ `\"circle\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tickCount": {
          "anyOf": [
            {
              "$ref": "#/definitions/TickCount",
              "description": "The desired number of tick values for quantitative legends."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "title": {
          "description": "Set to null to disable title for the axis, legend, or header.",
          "type": "null"
        },
        "titleAlign": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align",
              "description": "Horizontal text alignment for legend titles.\n\n__Default value:__ `\"left\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleAnchor": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleAnchor",
              "description": "Text anchor position for placing legend titles."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleBaseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline",
              "description": "Vertical text baseline for legend titles.  One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone.\n\n__Default value:__ `\"top\"`."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "The color of the legend title, can be in hex color code or regular color name."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFont": {
          "anyOf": [
            {
              "description": "The font of the legend title.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontSize": {
          "anyOf": [
            {
              "description": "The font size of the legend title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style of the legend title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight of the legend title. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLimit": {
          "anyOf": [
            {
              "description": "Maximum allowed pixel width of legend titles.\n\n__Default value:__ `180`.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOpacity": {
          "anyOf": [
            {
              "description": "Opacity of the legend title.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titleOrient": {
          "anyOf": [
            {
              "$ref": "#/definitions/Orient",
              "description": "Orientation of the legend title."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "titlePadding": {
          "anyOf": [
            {
              "description": "The padding, in pixels, between title and legend.\n\n__Default value:__ `5`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "unselectedOpacity": {
          "description": "The opacity of unselected legend entries.\n\n__Default value:__ 0.35.",
          "type": "number"
        },
        "zindex": {
          "anyOf": [
            {
              "description": "The integer z-index indicating the layering of the legend group relative to other axis, mark, and legend groups.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        }
      },
      "type": "object"
    },
    "LegendOrient": {
      "enum": [
        "none",
        "left",
        "right",
        "top",
        "bottom",
        "top-left",
        "top-right",
        "bottom-left",
        "bottom-right"
      ],
      "type": "string"
    },
    "LegendResolveMap": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "$ref": "#/definitions/ResolveMode"
        },
        "color": {
          "$ref": "#/definitions/ResolveMode"
        },
        "fill": {
          "$ref": "#/definitions/ResolveMode"
        },
        "fillOpacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "opacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "shape": {
          "$ref": "#/definitions/ResolveMode"
        },
        "size": {
          "$ref": "#/definitions/ResolveMode"
        },
        "stroke": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeDash": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeOpacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeWidth": {
          "$ref": "#/definitions/ResolveMode"
        }
      },
      "type": "object"
    },
    "LegendStreamBinding": {
      "additionalProperties": false,
      "properties": {
        "legend": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Stream"
            }
          ]
        }
      },
      "required": [
        "legend"
      ],
      "type": "object"
    },
    "LineConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "point": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/OverlayMarkDef"
            },
            {
              "const": "transparent",
              "type": "string"
            }
          ],
          "description": "A flag for overlaying points on top of line or area marks, or an object defining the properties of the overlayed points.\n\n- If this property is `\"transparent\"`, transparent points will be used (for enhancing tooltips and selections).\n\n- If this property is an empty object (`{}`) or `true`, filled points with default properties will be used.\n\n- If this property is `false`, no points would be automatically added to line or area marks.\n\n__Default value:__ `false`."
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "LineString": {
      "additionalProperties": false,
      "description": "LineString geometry object. https://tools.ietf.org/html/rfc7946#section-3.1.4",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "items": {
            "$ref": "#/definitions/Position"
          },
          "type": "array"
        },
        "type": {
          "const": "LineString",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "LinearGradient": {
      "additionalProperties": false,
      "properties": {
        "gradient": {
          "const": "linear",
          "description": "The type of gradient. Use `\"linear\"` for a linear gradient.",
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "stops": {
          "description": "An array of gradient stops defining the gradient color sequence.",
          "items": {
            "$ref": "#/definitions/GradientStop"
          },
          "type": "array"
        },
        "x1": {
          "description": "The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.\n\n__Default value:__ `0`",
          "type": "number"
        },
        "x2": {
          "description": "The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "y1": {
          "description": "The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.\n\n__Default value:__ `0`",
          "type": "number"
        },
        "y2": {
          "description": "The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.\n\n__Default value:__ `0`",
          "type": "number"
        }
      },
      "required": [
        "gradient",
        "stops"
      ],
      "type": "object"
    },
    "LocalMultiTimeUnit": {
      "enum": [
        "yearquarter",
        "yearquartermonth",
        "yearmonth",
        "yearmonthdate",
        "yearmonthdatehours",
        "yearmonthdatehoursminutes",
        "yearmonthdatehoursminutesseconds",
        "yearweek",
        "yearweekday",
        "yearweekdayhours",
        "yearweekdayhoursminutes",
        "yearweekdayhoursminutesseconds",
        "yeardayofyear",
        "quartermonth",
        "monthdate",
        "monthdatehours",
        "monthdatehoursminutes",
        "monthdatehoursminutesseconds",
        "weekday",
        "weeksdayhours",
        "weekdayhoursminutes",
        "weekdayhoursminutesseconds",
        "dayhours",
        "dayhoursminutes",
        "dayhoursminutesseconds",
        "hoursminutes",
        "hoursminutesseconds",
        "minutesseconds",
        "secondsmilliseconds"
      ],
      "type": "string"
    },
    "LocalSingleTimeUnit": {
      "enum": [
        "year",
        "quarter",
        "month",
        "week",
        "day",
        "dayofyear",
        "date",
        "hours",
        "minutes",
        "seconds",
        "milliseconds"
      ],
      "type": "string"
    },
    "Locale": {
      "additionalProperties": false,
      "properties": {
        "number": {
          "$ref": "#/definitions/NumberLocale"
        },
        "time": {
          "$ref": "#/definitions/TimeLocale"
        }
      },
      "type": "object"
    },
    "LoessTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field names for the smoothed points generated by the loess transform.\n\n__Default value:__ The field names of the input x and y values.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "bandwidth": {
          "description": "A bandwidth parameter in the range `[0, 1]` that determines the amount of smoothing.\n\n__Default value:__ `0.3`",
          "type": "number"
        },
        "groupby": {
          "description": "The data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "loess": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field of the dependent variable to smooth."
        },
        "on": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field of the independent variable to use a predictor."
        }
      },
      "required": [
        "loess",
        "on"
      ],
      "type": "object"
    },
    "LogicalAnd<Predicate>": {
      "additionalProperties": false,
      "properties": {
        "and": {
          "items": {
            "$ref": "#/definitions/PredicateComposition"
          },
          "type": "array"
        }
      },
      "required": [
        "and"
      ],
      "type": "object"
    },
    "PredicateComposition": {
      "anyOf": [
        {
          "$ref": "#/definitions/LogicalNot<Predicate>"
        },
        {
          "$ref": "#/definitions/LogicalAnd<Predicate>"
        },
        {
          "$ref": "#/definitions/LogicalOr<Predicate>"
        },
        {
          "$ref": "#/definitions/Predicate"
        }
      ]
    },
    "LogicalNot<Predicate>": {
      "additionalProperties": false,
      "properties": {
        "not": {
          "$ref": "#/definitions/PredicateComposition"
        }
      },
      "required": [
        "not"
      ],
      "type": "object"
    },
    "LogicalOr<Predicate>": {
      "additionalProperties": false,
      "properties": {
        "or": {
          "items": {
            "$ref": "#/definitions/PredicateComposition"
          },
          "type": "array"
        }
      },
      "required": [
        "or"
      ],
      "type": "object"
    },
    "LookupData": {
      "additionalProperties": false,
      "properties": {
        "data": {
          "$ref": "#/definitions/Data",
          "description": "Secondary data source to lookup in."
        },
        "fields": {
          "description": "Fields in foreign data or selection to lookup. If not specified, the entire object is queried.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "key": {
          "$ref": "#/definitions/FieldName",
          "description": "Key in data to lookup."
        }
      },
      "required": [
        "data",
        "key"
      ],
      "type": "object"
    },
    "LookupSelection": {
      "additionalProperties": false,
      "properties": {
        "fields": {
          "description": "Fields in foreign data or selection to lookup. If not specified, the entire object is queried.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "key": {
          "$ref": "#/definitions/FieldName",
          "description": "Key in data to lookup."
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Selection parameter name to look up."
        }
      },
      "required": [
        "key",
        "param"
      ],
      "type": "object"
    },
    "LookupTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldName"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldName"
              },
              "type": "array"
            }
          ],
          "description": "The output fields on which to store the looked up data values.\n\nFor data lookups, this property may be left blank if `from.fields` has been specified (those field names will be used); if `from.fields` has not been specified, `as` must be a string.\n\nFor selection lookups, this property is optional: if unspecified, looked up values will be stored under a property named for the selection; and if specified, it must correspond to `from.fields`."
        },
        "default": {
          "description": "The default value to use if lookup fails.\n\n__Default value:__ `null`"
        },
        "from": {
          "anyOf": [
            {
              "$ref": "#/definitions/LookupData"
            },
            {
              "$ref": "#/definitions/LookupSelection"
            }
          ],
          "description": "Data source or selection for secondary data reference."
        },
        "lookup": {
          "description": "Key in primary data source.",
          "type": "string"
        }
      },
      "required": [
        "lookup",
        "from"
      ],
      "type": "object"
    },
    "Mark": {
      "description": "All types of primitive marks.",
      "enum": [
        "arc",
        "area",
        "bar",
        "image",
        "line",
        "point",
        "rect",
        "rule",
        "text",
        "tick",
        "trail",
        "circle",
        "square",
        "geoshape"
      ],
      "type": "string"
    },
    "MarkConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "MarkDef": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "bandSize": {
          "description": "The width of the ticks.\n\n__Default value:__  3/4 of step (width step for horizontal ticks and height step for vertical ticks).",
          "minimum": 0,
          "type": "number"
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "binSpacing": {
          "description": "Offset between bars for binned field. The ideal value for this is either 0 (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clip": {
          "description": "Whether a mark be clipped to the enclosing group’s width and height.",
          "type": "boolean"
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "continuousBandSize": {
          "description": "The default size of the bars on continuous scales.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusEnd": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For vertical bars, top-left and top-right corner radius.\n\n- For horizontal bars, top-right and bottom-right corner radius."
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "discreteBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RelativeBandSize"
            }
          ],
          "description": "The default size of the bars with discrete dimensions. If unspecified, the default size is  `step-2`, which provides 2 pixel offset between bars.",
          "minimum": 0
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RelativeBandSize"
            }
          ],
          "description": "Height of the marks.  One of:\n\n- A number representing a fixed pixel height.\n\n- A relative band size definition.  For example, `{band: 0.5}` represents half of the band"
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "line": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/OverlayMarkDef"
            }
          ],
          "description": "A flag for overlaying line on top of area marks, or an object defining the properties of the overlayed lines.\n\n- If this value is an empty object (`{}`) or `true`, lines with default properties will be used.\n\n- If this value is `false`, no lines would be automatically added to area marks.\n\n__Default value:__ `false`."
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "minBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum band size for bar and rectangle marks. __Default value:__ `0.25`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "point": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/OverlayMarkDef"
            },
            {
              "const": "transparent",
              "type": "string"
            }
          ],
          "description": "A flag for overlaying points on top of line or area marks, or an object defining the properties of the overlayed points.\n\n- If this property is `\"transparent\"`, transparent points will be used (for enhancing tooltips and selections).\n\n- If this property is an empty object (`{}`) or `true`, filled points with default properties will be used.\n\n- If this property is `false`, no points would be automatically added to line or area marks.\n\n__Default value:__ `false`."
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "radius2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for radius2."
        },
        "radiusOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for radius."
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A string or array of strings indicating the name of custom styles to apply to the mark. A style is a named collection of mark property defaults defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles. Any [mark properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly defined within the `encoding` will override a style default.\n\n__Default value:__ The mark's name. For example, a bar mark will have style `\"bar\"` by default. __Note:__ Any specified style will augment the default style. For example, a bar mark with `\"style\": \"foo\"` will receive from `config.style.bar` and `config.style.foo` (the specified style `\"foo\"` has higher precedence)."
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "theta2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for theta2."
        },
        "thetaOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for theta."
        },
        "thickness": {
          "description": "Thickness of the tick mark.\n\n__Default value:__  `1`",
          "minimum": 0,
          "type": "number"
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "type": {
          "$ref": "#/definitions/Mark",
          "description": "The mark type. This could a primitive mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"geoshape\"`, `\"rule\"`, and `\"text\"`) or a composite mark type (`\"boxplot\"`, `\"errorband\"`, `\"errorbar\"`)."
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RelativeBandSize"
            }
          ],
          "description": "Width of the marks.  One of:\n\n- A number representing a fixed pixel width.\n\n- A relative band size definition.  For example, `{band: 0.5}` represents half of the band."
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for x2-position."
        },
        "xOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for x-position."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for y2-position."
        },
        "yOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for y-position."
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "MarkPropDef<(Gradient|string|null)>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<MarkPropFieldDef,(Gradient|string|null)>"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<DatumDef,(Gradient|string|null)>"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition<MarkPropFieldOrDatumDef,(Gradient|string|null)>"
        }
      ]
    },
    "MarkPropDef<(string|null),TypeForShape>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<MarkPropFieldDef<TypeForShape>,(string|null)>"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<DatumDef,(string|null)>"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition<MarkPropFieldOrDatumDef<TypeForShape>,(string|null)>"
        }
      ]
    },
    "MarkPropDef<number>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<MarkPropFieldDef,number>"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<DatumDef,number>"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition<MarkPropFieldOrDatumDef,number>"
        }
      ]
    },
    "MarkPropDef<number[]>": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<MarkPropFieldDef,number[]>"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<DatumDef,number[]>"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition<MarkPropFieldOrDatumDef,number[]>"
        }
      ]
    },
    "MarkType": {
      "enum": [
        "arc",
        "area",
        "image",
        "group",
        "line",
        "path",
        "rect",
        "rule",
        "shape",
        "symbol",
        "text",
        "trail"
      ],
      "type": "string"
    },
    "MergedStream": {
      "additionalProperties": false,
      "properties": {
        "between": {
          "items": {
            "$ref": "#/definitions/Stream"
          },
          "type": "array"
        },
        "consume": {
          "type": "boolean"
        },
        "debounce": {
          "type": "number"
        },
        "filter": {
          "anyOf": [
            {
              "$ref": "#/definitions/Expr"
            },
            {
              "items": {
                "$ref": "#/definitions/Expr"
              },
              "type": "array"
            }
          ]
        },
        "markname": {
          "type": "string"
        },
        "marktype": {
          "$ref": "#/definitions/MarkType"
        },
        "merge": {
          "items": {
            "$ref": "#/definitions/Stream"
          },
          "type": "array"
        },
        "throttle": {
          "type": "number"
        }
      },
      "required": [
        "merge"
      ],
      "type": "object"
    },
    "Month": {
      "maximum": 12,
      "minimum": 1,
      "type": "number"
    },
    "MultiLineString": {
      "additionalProperties": false,
      "description": "MultiLineString geometry object. https://tools.ietf.org/html/rfc7946#section-3.1.5",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "items": {
            "items": {
              "$ref": "#/definitions/Position"
            },
            "type": "array"
          },
          "type": "array"
        },
        "type": {
          "const": "MultiLineString",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "MultiPoint": {
      "additionalProperties": false,
      "description": "MultiPoint geometry object.  https://tools.ietf.org/html/rfc7946#section-3.1.3",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "items": {
            "$ref": "#/definitions/Position"
          },
          "type": "array"
        },
        "type": {
          "const": "MultiPoint",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "MultiPolygon": {
      "additionalProperties": false,
      "description": "MultiPolygon geometry object. https://tools.ietf.org/html/rfc7946#section-3.1.7",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "items": {
            "items": {
              "items": {
                "$ref": "#/definitions/Position"
              },
              "type": "array"
            },
            "type": "array"
          },
          "type": "array"
        },
        "type": {
          "const": "MultiPolygon",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "MultiTimeUnit": {
      "anyOf": [
        {
          "$ref": "#/definitions/LocalMultiTimeUnit"
        },
        {
          "$ref": "#/definitions/UtcMultiTimeUnit"
        }
      ]
    },
    "NamedData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.\n\nNew data may change the layout but Vega does not always resize the chart. To update the layout when the data updates, set [autosize](https://vega.github.io/vega-lite/docs/size.html#autosize) or explicitly use [view.resize](https://vega.github.io/vega/docs/api/view/#view_resize).",
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "NonArgAggregateOp": {
      "enum": [
        "average",
        "count",
        "distinct",
        "max",
        "mean",
        "median",
        "min",
        "missing",
        "product",
        "q1",
        "q3",
        "ci0",
        "ci1",
        "stderr",
        "stdev",
        "stdevp",
        "sum",
        "valid",
        "values",
        "variance",
        "variancep"
      ],
      "type": "string"
    },
    "NonLayerRepeatSpec": {
      "additionalProperties": false,
      "description": "Base interface for a repeat specification.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "repeat": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/RepeatMapping"
            }
          ],
          "description": "Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If `\"repeat\"` is an array, the field can be referred to as `{\"repeat\": \"repeat\"}`. The repeated views are laid out in a wrapped row. You can set the number of columns to control the wrapping. 2) An object that maps `\"row\"` and/or `\"column\"` to the listed fields to be repeated along the particular orientations. The objects `{\"repeat\": \"row\"}` and `{\"repeat\": \"column\"}` can be used to refer to the repeated field respectively."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "spec": {
          "$ref": "#/definitions/NonNormalizedSpec",
          "description": "A specification of the view that gets repeated."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        }
      },
      "required": [
        "repeat",
        "spec"
      ],
      "type": "object"
    },
    "NonNormalizedSpec": {
      "$ref": "#/definitions/Spec"
    },
    "NumberLocale": {
      "additionalProperties": false,
      "description": "Locale definition for formatting numbers.",
      "properties": {
        "currency": {
          "$ref": "#/definitions/Vector2<string>",
          "description": "The currency prefix and suffix (e.g., [\"$\", \"\"])."
        },
        "decimal": {
          "description": "The decimal point (e.g., \".\").",
          "type": "string"
        },
        "grouping": {
          "description": "The array of group sizes (e.g., [3]), cycled as needed.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "minus": {
          "description": "The minus sign (defaults to hyphen-minus, \"-\").",
          "type": "string"
        },
        "nan": {
          "description": "The not-a-number value (defaults to \"NaN\").",
          "type": "string"
        },
        "numerals": {
          "$ref": "#/definitions/Vector10<string>",
          "description": "An array of ten strings to replace the numerals 0-9."
        },
        "percent": {
          "description": "The percent sign (defaults to \"%\").",
          "type": "string"
        },
        "thousands": {
          "description": "The group separator (e.g., \",\").",
          "type": "string"
        }
      },
      "required": [
        "decimal",
        "thousands",
        "grouping",
        "currency"
      ],
      "type": "object"
    },
    "NumericArrayMarkPropDef": {
      "$ref": "#/definitions/MarkPropDef<number[]>"
    },
    "NumericMarkPropDef": {
      "$ref": "#/definitions/MarkPropDef<number>"
    },
    "OffsetDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/ScaleFieldDef"
        },
        {
          "$ref": "#/definitions/ScaleDatumDef"
        },
        {
          "$ref": "#/definitions/ValueDef<number>"
        }
      ]
    },
    "OrderFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "sort": {
          "$ref": "#/definitions/SortOrder",
          "description": "The sort order. One of `\"ascending\"` (default) or `\"descending\"`."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "OrderOnlyDef": {
      "additionalProperties": false,
      "properties": {
        "sort": {
          "$ref": "#/definitions/SortOrder",
          "description": "The sort order. One of `\"ascending\"` (default) or `\"descending\"`."
        }
      },
      "type": "object"
    },
    "OrderValueDef": {
      "additionalProperties": false,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalValueDef<number>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<number>"
              },
              "type": "array"
            }
          ],
          "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "value"
      ],
      "type": "object"
    },
    "Orient": {
      "enum": [
        "left",
        "right",
        "top",
        "bottom"
      ],
      "type": "string"
    },
    "Orientation": {
      "enum": [
        "horizontal",
        "vertical"
      ],
      "type": "string"
    },
    "OverlayMarkDef": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clip": {
          "description": "Whether a mark be clipped to the enclosing group’s width and height.",
          "type": "boolean"
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "radius2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for radius2."
        },
        "radiusOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for radius."
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A string or array of strings indicating the name of custom styles to apply to the mark. A style is a named collection of mark property defaults defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles. Any [mark properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly defined within the `encoding` will override a style default.\n\n__Default value:__ The mark's name. For example, a bar mark will have style `\"bar\"` by default. __Note:__ Any specified style will augment the default style. For example, a bar mark with `\"style\": \"foo\"` will receive from `config.style.bar` and `config.style.foo` (the specified style `\"foo\"` has higher precedence)."
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "theta2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for theta2."
        },
        "thetaOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for theta."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for x2-position."
        },
        "xOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for x-position."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2Offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for y2-position."
        },
        "yOffset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Offset for y-position."
        }
      },
      "type": "object"
    },
    "Padding": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "additionalProperties": false,
          "properties": {
            "bottom": {
              "type": "number"
            },
            "left": {
              "type": "number"
            },
            "right": {
              "type": "number"
            },
            "top": {
              "type": "number"
            }
          },
          "type": "object"
        }
      ],
      "minimum": 0
    },
    "ParameterExtent": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "field": {
              "$ref": "#/definitions/FieldName",
              "description": "If a selection parameter is specified, the field name to extract selected values for when the selection is [projected](https://vega.github.io/vega-lite/docs/selection.html#project) over multiple fields or encodings."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "The name of a parameter."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "encoding": {
              "$ref": "#/definitions/SingleDefUnitChannel",
              "description": "If a selection parameter is specified, the encoding channel to extract selected values for when a selection is [projected](https://vega.github.io/vega-lite/docs/selection.html#project) over multiple fields or encodings."
            },
            "param": {
              "$ref": "#/definitions/ParameterName",
              "description": "The name of a parameter."
            }
          },
          "required": [
            "param"
          ],
          "type": "object"
        }
      ]
    },
    "ParameterName": {
      "type": "string"
    },
    "ParameterPredicate": {
      "additionalProperties": false,
      "properties": {
        "empty": {
          "description": "For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.",
          "type": "boolean"
        },
        "param": {
          "$ref": "#/definitions/ParameterName",
          "description": "Filter using a parameter name."
        }
      },
      "required": [
        "param"
      ],
      "type": "object"
    },
    "Parse": {
      "additionalProperties": {
        "$ref": "#/definitions/ParseValue"
      },
      "type": "object"
    },
    "ParseValue": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "type": "string"
        },
        {
          "const": "string",
          "type": "string"
        },
        {
          "const": "boolean",
          "type": "string"
        },
        {
          "const": "date",
          "type": "string"
        },
        {
          "const": "number",
          "type": "string"
        }
      ]
    },
    "PivotTransform": {
      "additionalProperties": false,
      "properties": {
        "groupby": {
          "description": "The optional data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "limit": {
          "description": "An optional parameter indicating the maximum number of pivoted fields to generate. The default (`0`) applies no limit. The pivoted `pivot` names are sorted in ascending order prior to enforcing the limit. __Default value:__ `0`",
          "type": "number"
        },
        "op": {
          "$ref": "#/definitions/AggregateOp",
          "description": "The aggregation operation to apply to grouped `value` field values. __Default value:__ `sum`"
        },
        "pivot": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field to pivot on. The unique values of this field become new field names in the output stream."
        },
        "value": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field to populate pivoted fields. The aggregate values of this field become the values of the new pivoted fields."
        }
      },
      "required": [
        "pivot",
        "value"
      ],
      "type": "object"
    },
    "Point": {
      "additionalProperties": false,
      "description": "Point geometry object. https://tools.ietf.org/html/rfc7946#section-3.1.2",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "$ref": "#/definitions/Position"
        },
        "type": {
          "const": "Point",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "PointSelectionConfig": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Clears the selection, emptying it of all values. This property can be a [Event Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable clear.\n\n__Default value:__ `dblclick`.\n\n__See also:__ [`clear` examples ](https://vega.github.io/vega-lite/docs/selection.html#clear) in the documentation."
        },
        "encodings": {
          "description": "An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/SingleDefUnitChannel"
          },
          "type": "array"
        },
        "fields": {
          "description": "An array of field names whose values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "nearest": {
          "description": "When true, an invisible voronoi diagram is computed to accelerate discrete selection. The data value _nearest_ the mouse cursor is added to the selection.\n\n__Default value:__ `false`, which means that data values must be interacted with directly (e.g., clicked on) to be added to the selection.\n\n__See also:__ [`nearest` examples](https://vega.github.io/vega-lite/docs/selection.html#nearest) documentation.",
          "type": "boolean"
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            }
          ],
          "description": "A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection. For interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\n\n__See also:__ [`on` examples](https://vega.github.io/vega-lite/docs/selection.html#on) in the documentation."
        },
        "resolve": {
          "$ref": "#/definitions/SelectionResolution",
          "description": "With layered and multi-view displays, a strategy that determines how selections' data queries are resolved when applied in a filter transform, conditional encoding rule, or scale domain.\n\nOne of:\n- `\"global\"` -- only one brush exists for the entire SPLOM. When the user begins to drag, any previous brushes are cleared, and a new one is constructed.\n- `\"union\"` -- each cell contains its own brush, and points are highlighted if they lie within _any_ of these individual brushes.\n- `\"intersect\"` -- each cell contains its own brush, and points are highlighted only if they fall within _all_ of these individual brushes.\n\n__Default value:__ `global`.\n\n__See also:__ [`resolve` examples](https://vega.github.io/vega-lite/docs/selection.html#resolve) in the documentation."
        },
        "toggle": {
          "description": "Controls whether data values should be toggled (inserted or removed from a point selection) or only ever inserted into point selections.\n\nOne of:\n- `true` -- the default behavior, which corresponds to `\"event.shiftKey\"`.  As a result, data values are toggled when the user interacts with the shift-key pressed.\n- `false` -- disables toggling behaviour; the selection will only ever contain a single data value corresponding to the most recent interaction.\n- A [Vega expression](https://vega.github.io/vega/docs/expressions/) which is re-evaluated as the user interacts. If the expression evaluates to `true`, the data value is toggled into or out of the point selection. If the expression evaluates to `false`, the point selection is first cleared, and the data value is then inserted. For example, setting the value to the Vega expression `\"true\"` will toggle data values without the user pressing the shift-key.\n\n__Default value:__ `true`\n\n__See also:__ [`toggle` examples](https://vega.github.io/vega-lite/docs/selection.html#toggle) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        },
        "type": {
          "const": "point",
          "description": "Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`.",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "PointSelectionConfigWithoutType": {
      "additionalProperties": false,
      "properties": {
        "clear": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Clears the selection, emptying it of all values. This property can be a [Event Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable clear.\n\n__Default value:__ `dblclick`.\n\n__See also:__ [`clear` examples ](https://vega.github.io/vega-lite/docs/selection.html#clear) in the documentation."
        },
        "encodings": {
          "description": "An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/SingleDefUnitChannel"
          },
          "type": "array"
        },
        "fields": {
          "description": "An array of field names whose values must match for a data tuple to fall within the selection.\n\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "nearest": {
          "description": "When true, an invisible voronoi diagram is computed to accelerate discrete selection. The data value _nearest_ the mouse cursor is added to the selection.\n\n__Default value:__ `false`, which means that data values must be interacted with directly (e.g., clicked on) to be added to the selection.\n\n__See also:__ [`nearest` examples](https://vega.github.io/vega-lite/docs/selection.html#nearest) documentation.",
          "type": "boolean"
        },
        "on": {
          "anyOf": [
            {
              "$ref": "#/definitions/Stream"
            },
            {
              "type": "string"
            }
          ],
          "description": "A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection. For interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\n\n__See also:__ [`on` examples](https://vega.github.io/vega-lite/docs/selection.html#on) in the documentation."
        },
        "resolve": {
          "$ref": "#/definitions/SelectionResolution",
          "description": "With layered and multi-view displays, a strategy that determines how selections' data queries are resolved when applied in a filter transform, conditional encoding rule, or scale domain.\n\nOne of:\n- `\"global\"` -- only one brush exists for the entire SPLOM. When the user begins to drag, any previous brushes are cleared, and a new one is constructed.\n- `\"union\"` -- each cell contains its own brush, and points are highlighted if they lie within _any_ of these individual brushes.\n- `\"intersect\"` -- each cell contains its own brush, and points are highlighted only if they fall within _all_ of these individual brushes.\n\n__Default value:__ `global`.\n\n__See also:__ [`resolve` examples](https://vega.github.io/vega-lite/docs/selection.html#resolve) in the documentation."
        },
        "toggle": {
          "description": "Controls whether data values should be toggled (inserted or removed from a point selection) or only ever inserted into point selections.\n\nOne of:\n- `true` -- the default behavior, which corresponds to `\"event.shiftKey\"`.  As a result, data values are toggled when the user interacts with the shift-key pressed.\n- `false` -- disables toggling behaviour; the selection will only ever contain a single data value corresponding to the most recent interaction.\n- A [Vega expression](https://vega.github.io/vega/docs/expressions/) which is re-evaluated as the user interacts. If the expression evaluates to `true`, the data value is toggled into or out of the point selection. If the expression evaluates to `false`, the point selection is first cleared, and the data value is then inserted. For example, setting the value to the Vega expression `\"true\"` will toggle data values without the user pressing the shift-key.\n\n__Default value:__ `true`\n\n__See also:__ [`toggle` examples](https://vega.github.io/vega-lite/docs/selection.html#toggle) in the documentation.",
          "type": [
            "string",
            "boolean"
          ]
        }
      },
      "type": "object"
    },
    "PolarDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/PositionFieldDefBase"
        },
        {
          "$ref": "#/definitions/PositionDatumDefBase"
        },
        {
          "$ref": "#/definitions/PositionValueDef"
        }
      ]
    },
    "Polygon": {
      "additionalProperties": false,
      "description": "Polygon geometry object. https://tools.ietf.org/html/rfc7946#section-3.1.6",
      "properties": {
        "bbox": {
          "$ref": "#/definitions/BBox",
          "description": "Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections. https://tools.ietf.org/html/rfc7946#section-5"
        },
        "coordinates": {
          "items": {
            "items": {
              "$ref": "#/definitions/Position"
            },
            "type": "array"
          },
          "type": "array"
        },
        "type": {
          "const": "Polygon",
          "description": "Specifies the type of GeoJSON object.",
          "type": "string"
        }
      },
      "required": [
        "coordinates",
        "type"
      ],
      "type": "object"
    },
    "Position": {
      "description": "A Position is an array of coordinates. https://tools.ietf.org/html/rfc7946#section-3.1.1 Array should contain between two and three elements. The previous GeoJSON specification allowed more elements (e.g., which could be used to represent M values), but the current specification only allows X, Y, and (optionally) Z to be defined.",
      "items": {
        "type": "number"
      },
      "type": "array"
    },
    "Position2Def": {
      "anyOf": [
        {
          "$ref": "#/definitions/SecondaryFieldDef"
        },
        {
          "$ref": "#/definitions/DatumDef"
        },
        {
          "$ref": "#/definitions/PositionValueDef"
        }
      ]
    },
    "PositionDatumDef": {
      "additionalProperties": false,
      "properties": {
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/Axis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "impute": {
          "anyOf": [
            {
              "$ref": "#/definitions/ImputeParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining the properties of the Impute Operation to be applied. The field value of the other positional channel is taken as `key` of the `Impute` Operation. The field of the `color` channel if specified is used as `groupby` of the `Impute` Operation.\n\n__See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "stack": {
          "anyOf": [
            {
              "$ref": "#/definitions/StackOffset"
            },
            {
              "type": "null"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "PositionDatumDefBase": {
      "additionalProperties": false,
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "stack": {
          "anyOf": [
            {
              "$ref": "#/definitions/StackOffset"
            },
            {
              "type": "null"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "PositionDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/PositionFieldDef"
        },
        {
          "$ref": "#/definitions/PositionDatumDef"
        },
        {
          "$ref": "#/definitions/PositionValueDef"
        }
      ]
    },
    "PositionFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "axis": {
          "anyOf": [
            {
              "$ref": "#/definitions/Axis"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "impute": {
          "anyOf": [
            {
              "$ref": "#/definitions/ImputeParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining the properties of the Impute Operation to be applied. The field value of the other positional channel is taken as `key` of the `Impute` Operation. The field of the `color` channel if specified is used as `groupby` of the `Impute` Operation.\n\n__See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "stack": {
          "anyOf": [
            {
              "$ref": "#/definitions/StackOffset"
            },
            {
              "type": "null"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "PositionFieldDefBase": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "stack": {
          "anyOf": [
            {
              "$ref": "#/definitions/StackOffset"
            },
            {
              "type": "null"
            },
            {
              "type": "boolean"
            }
          ],
          "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "PositionValueDef": {
      "$ref": "#/definitions/ValueDef<(number|\"width\"|\"height\"|ExprRef)>"
    },
    "Predicate": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldEqualPredicate"
        },
        {
          "$ref": "#/definitions/FieldRangePredicate"
        },
        {
          "$ref": "#/definitions/FieldOneOfPredicate"
        },
        {
          "$ref": "#/definitions/FieldLTPredicate"
        },
        {
          "$ref": "#/definitions/FieldGTPredicate"
        },
        {
          "$ref": "#/definitions/FieldLTEPredicate"
        },
        {
          "$ref": "#/definitions/FieldGTEPredicate"
        },
        {
          "$ref": "#/definitions/FieldValidPredicate"
        },
        {
          "$ref": "#/definitions/ParameterPredicate"
        },
        {
          "type": "string"
        }
      ]
    },
    "PrimitiveValue": {
      "type": [
        "number",
        "string",
        "boolean",
        "null"
      ]
    },
    "Projection": {
      "additionalProperties": false,
      "properties": {
        "center": {
          "anyOf": [
            {
              "$ref": "#/definitions/Vector2<number>",
              "description": "The projection's center, a two-element array of longitude and latitude in degrees.\n\n__Default value:__ `[0, 0]`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clipAngle": {
          "anyOf": [
            {
              "description": "The projection's clipping circle radius to the specified angle in degrees. If `null`, switches to [antimeridian](http://bl.ocks.org/mbostock/3788999) cutting rather than small-circle clipping.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "clipExtent": {
          "anyOf": [
            {
              "$ref": "#/definitions/Vector2<Vector2<number>>",
              "description": "The projection's viewport clip extent to the specified bounds in pixels. The extent bounds are specified as an array `[[x0, y0], [x1, y1]]`, where `x0` is the left-side of the viewport, `y0` is the top, `x1` is the right and `y1` is the bottom. If `null`, no viewport clipping is performed."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "coefficient": {
          "anyOf": [
            {
              "description": "The coefficient parameter for the `hammer` projection.\n\n__Default value:__ `2`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "distance": {
          "anyOf": [
            {
              "description": "For the `satellite` projection, the distance from the center of the sphere to the point of view, as a proportion of the sphere’s radius. The recommended maximum clip angle for a given `distance` is acos(1 / distance) converted to degrees. If tilt is also applied, then more conservative clipping may be necessary.\n\n__Default value:__ `2.0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "extent": {
          "anyOf": [
            {
              "$ref": "#/definitions/Vector2<Vector2<number>>"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fit": {
          "anyOf": [
            {
              "$ref": "#/definitions/Fit"
            },
            {
              "items": {
                "$ref": "#/definitions/Fit"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fraction": {
          "anyOf": [
            {
              "description": "The fraction parameter for the `bottomley` projection.\n\n__Default value:__ `0.5`, corresponding to a sin(ψ) where ψ = π/6.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lobes": {
          "anyOf": [
            {
              "description": "The number of lobes in projections that support multi-lobe views: `berghaus`, `gingery`, or `healpix`. The default value varies based on the projection type.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "parallel": {
          "anyOf": [
            {
              "description": "The parallel parameter for projections that support it: `armadillo`, `bonne`, `craig`, `cylindricalEqualArea`, `cylindricalStereographic`, `hammerRetroazimuthal`, `loximuthal`, or `rectangularPolyconic`. The default value varies based on the projection type.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "parallels": {
          "anyOf": [
            {
              "description": "For conic projections, the [two standard parallels](https://en.wikipedia.org/wiki/Map_projection#Conic) that define the map layout. The default depends on the specific conic projection used.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "pointRadius": {
          "anyOf": [
            {
              "description": "The default radius (in pixels) to use when drawing GeoJSON `Point` and `MultiPoint` geometries. This parameter sets a constant default value. To modify the point radius in response to data, see the corresponding parameter of the GeoPath and GeoShape transforms.\n\n__Default value:__ `4.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "precision": {
          "anyOf": [
            {
              "description": "The threshold for the projection's [adaptive resampling](http://bl.ocks.org/mbostock/3795544) to the specified value in pixels. This value corresponds to the [Douglas–Peucker distance](http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm). If precision is not specified, returns the projection's current resampling precision which defaults to `√0.5 ≅ 0.70710…`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "description": "The radius parameter for the `airy` or `gingery` projection. The default value varies based on the projection type.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ratio": {
          "anyOf": [
            {
              "description": "The ratio parameter for the `hill`, `hufnagel`, or `wagner` projections. The default value varies based on the projection type.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "reflectX": {
          "anyOf": [
            {
              "description": "Sets whether or not the x-dimension is reflected (negated) in the output.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "reflectY": {
          "anyOf": [
            {
              "description": "Sets whether or not the y-dimension is reflected (negated) in the output.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "rotate": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/Vector2<number>"
                },
                {
                  "$ref": "#/definitions/Vector3<number>"
                }
              ],
              "description": "The projection's three-axis rotation to the specified angles, which must be a two- or three-element array of numbers [`lambda`, `phi`, `gamma`] specifying the rotation angles in degrees about each spherical axis. (These correspond to yaw, pitch and roll.)\n\n__Default value:__ `[0, 0, 0]`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "scale": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The projection’s scale (zoom) factor, overriding automatic fitting. The default scale is projection-specific. The scale factor corresponds linearly to the distance between projected points; however, scale factor values are not equivalent across projections."
        },
        "size": {
          "anyOf": [
            {
              "$ref": "#/definitions/Vector2<number>",
              "description": "Used in conjunction with fit, provides the width and height in pixels of the area to which the projection should be automatically fit."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "spacing": {
          "anyOf": [
            {
              "description": "The spacing parameter for the `lagrange` projection.\n\n__Default value:__ `0.5`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tilt": {
          "anyOf": [
            {
              "description": "The tilt angle (in degrees) for the `satellite` projection.\n\n__Default value:__ `0`.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "translate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Vector2<number>"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The projection’s translation offset as a two-element array `[tx, ty]`."
        },
        "type": {
          "anyOf": [
            {
              "$ref": "#/definitions/ProjectionType"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The cartographic projection to use. This value is case-insensitive, for example `\"albers\"` and `\"Albers\"` indicate the same projection type. You can find all valid projection types [in the documentation](https://vega.github.io/vega-lite/docs/projection.html#projection-types).\n\n__Default value:__ `equalEarth`"
        }
      },
      "type": "object"
    },
    "ProjectionConfig": {
      "$ref": "#/definitions/Projection",
      "description": "Any property of Projection can be in config"
    },
    "ProjectionType": {
      "enum": [
        "albers",
        "albersUsa",
        "azimuthalEqualArea",
        "azimuthalEquidistant",
        "conicConformal",
        "conicEqualArea",
        "conicEquidistant",
        "equalEarth",
        "equirectangular",
        "gnomonic",
        "identity",
        "mercator",
        "naturalEarth1",
        "orthographic",
        "stereographic",
        "transverseMercator"
      ],
      "type": "string"
    },
    "QuantileTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field names for the probability and quantile values.\n\n__Default value:__ `[\"prob\", \"value\"]`",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "groupby": {
          "description": "The data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "probs": {
          "description": "An array of probabilities in the range (0, 1) for which to compute quantile values. If not specified, the *step* parameter will be used.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "quantile": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which to perform quantile estimation."
        },
        "step": {
          "description": "A probability step size (default 0.01) for sampling quantile values. All values from one-half the step size up to 1 (exclusive) will be sampled. This parameter is only used if the *probs* parameter is not provided.",
          "type": "number"
        }
      },
      "required": [
        "quantile"
      ],
      "type": "object"
    },
    "RadialGradient": {
      "additionalProperties": false,
      "properties": {
        "gradient": {
          "const": "radial",
          "description": "The type of gradient. Use `\"radial\"` for a radial gradient.",
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "r1": {
          "description": "The radius length, in normalized [0, 1] coordinates, of the inner circle for the gradient.\n\n__Default value:__ `0`",
          "type": "number"
        },
        "r2": {
          "description": "The radius length, in normalized [0, 1] coordinates, of the outer circle for the gradient.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "stops": {
          "description": "An array of gradient stops defining the gradient color sequence.",
          "items": {
            "$ref": "#/definitions/GradientStop"
          },
          "type": "array"
        },
        "x1": {
          "description": "The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle for the gradient.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "x2": {
          "description": "The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle for the gradient.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "y1": {
          "description": "The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle for the gradient.\n\n__Default value:__ `0.5`",
          "type": "number"
        },
        "y2": {
          "description": "The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle for the gradient.\n\n__Default value:__ `0.5`",
          "type": "number"
        }
      },
      "required": [
        "gradient",
        "stops"
      ],
      "type": "object"
    },
    "RangeConfig": {
      "additionalProperties": {
        "anyOf": [
          {
            "$ref": "#/definitions/RangeScheme"
          },
          {
            "type": "array"
          }
        ]
      },
      "properties": {
        "category": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeScheme"
            },
            {
              "items": {
                "$ref": "#/definitions/Color"
              },
              "type": "array"
            }
          ],
          "description": "Default [color scheme](https://vega.github.io/vega/docs/schemes/) for categorical data."
        },
        "diverging": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeScheme"
            },
            {
              "items": {
                "$ref": "#/definitions/Color"
              },
              "type": "array"
            }
          ],
          "description": "Default [color scheme](https://vega.github.io/vega/docs/schemes/) for diverging quantitative ramps."
        },
        "heatmap": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeScheme"
            },
            {
              "items": {
                "$ref": "#/definitions/Color"
              },
              "type": "array"
            }
          ],
          "description": "Default [color scheme](https://vega.github.io/vega/docs/schemes/) for quantitative heatmaps."
        },
        "ordinal": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeScheme"
            },
            {
              "items": {
                "$ref": "#/definitions/Color"
              },
              "type": "array"
            }
          ],
          "description": "Default [color scheme](https://vega.github.io/vega/docs/schemes/) for rank-ordered data."
        },
        "ramp": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeScheme"
            },
            {
              "items": {
                "$ref": "#/definitions/Color"
              },
              "type": "array"
            }
          ],
          "description": "Default [color scheme](https://vega.github.io/vega/docs/schemes/) for sequential quantitative ramps."
        },
        "symbol": {
          "description": "Array of [symbol](https://vega.github.io/vega/docs/marks/symbol/) names or paths for the default shape palette.",
          "items": {
            "$ref": "#/definitions/SymbolShape"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "RangeEnum": {
      "enum": [
        "width",
        "height",
        "symbol",
        "category",
        "ordinal",
        "ramp",
        "diverging",
        "heatmap"
      ],
      "type": "string"
    },
    "RangeRaw": {
      "items": {
        "anyOf": [
          {
            "type": "null"
          },
          {
            "type": "boolean"
          },
          {
            "type": "string"
          },
          {
            "type": "number"
          },
          {
            "$ref": "#/definitions/RangeRawArray"
          }
        ]
      },
      "type": "array"
    },
    "RangeRawArray": {
      "items": {
        "type": "number"
      },
      "type": "array"
    },
    "RangeScheme": {
      "anyOf": [
        {
          "$ref": "#/definitions/RangeEnum"
        },
        {
          "$ref": "#/definitions/RangeRaw"
        },
        {
          "additionalProperties": false,
          "properties": {
            "count": {
              "type": "number"
            },
            "extent": {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "scheme": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "$ref": "#/definitions/ColorScheme"
                }
              ]
            }
          },
          "required": [
            "scheme"
          ],
          "type": "object"
        }
      ]
    },
    "RectConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "binSpacing": {
          "description": "Offset between bars for binned field. The ideal value for this is either 0 (preferred by statisticians) or 1 (Vega-Lite default, D3 example style).\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "continuousBandSize": {
          "description": "The default size of the bars on continuous scales.\n\n__Default value:__ `5`",
          "minimum": 0,
          "type": "number"
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "discreteBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RelativeBandSize"
            }
          ],
          "description": "The default size of the bars with discrete dimensions. If unspecified, the default size is  `step-2`, which provides 2 pixel offset between bars.",
          "minimum": 0
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "minBandSize": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The minimum band size for bar and rectangle marks. __Default value:__ `0.25`"
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "RegressionTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "description": "The output field names for the smoothed points generated by the regression transform.\n\n__Default value:__ The field names of the input x and y values.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "extent": {
          "description": "A [min, max] domain over the independent (x) field for the starting and ending points of the generated trend line.",
          "items": {
            "type": "number"
          },
          "maxItems": 2,
          "minItems": 2,
          "type": "array"
        },
        "groupby": {
          "description": "The data fields to group by. If not specified, a single group containing all data objects will be used.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "method": {
          "description": "The functional form of the regression model. One of `\"linear\"`, `\"log\"`, `\"exp\"`, `\"pow\"`, `\"quad\"`, or `\"poly\"`.\n\n__Default value:__ `\"linear\"`",
          "enum": [
            "linear",
            "log",
            "exp",
            "pow",
            "quad",
            "poly"
          ],
          "type": "string"
        },
        "on": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field of the independent variable to use a predictor."
        },
        "order": {
          "description": "The polynomial order (number of coefficients) for the 'poly' method.\n\n__Default value:__ `3`",
          "type": "number"
        },
        "params": {
          "description": "A boolean flag indicating if the transform should return the regression model parameters (one object per group), rather than trend line points. The resulting objects include a `coef` array of fitted coefficient values (starting with the intercept term and then including terms of increasing order) and an `rSquared` value (indicating the total variance explained by the model).\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "regression": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field of the dependent variable to predict."
        }
      },
      "required": [
        "regression",
        "on"
      ],
      "type": "object"
    },
    "RelativeBandSize": {
      "additionalProperties": false,
      "properties": {
        "band": {
          "description": "The relative band size.  For example `0.5` means half of the band scale's band width.",
          "type": "number"
        }
      },
      "required": [
        "band"
      ],
      "type": "object"
    },
    "RepeatMapping": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "description": "An array of fields to be repeated horizontally.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "row": {
          "description": "An array of fields to be repeated vertically.",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "RepeatRef": {
      "additionalProperties": false,
      "description": "Reference to a repeated value.",
      "properties": {
        "repeat": {
          "enum": [
            "row",
            "column",
            "repeat",
            "layer"
          ],
          "type": "string"
        }
      },
      "required": [
        "repeat"
      ],
      "type": "object"
    },
    "RepeatSpec": {
      "anyOf": [
        {
          "$ref": "#/definitions/NonLayerRepeatSpec"
        },
        {
          "$ref": "#/definitions/LayerRepeatSpec"
        }
      ]
    },
    "Resolve": {
      "additionalProperties": false,
      "description": "Defines how scales, axes, and legends from different specs should be combined. Resolve is a mapping from `scale`, `axis`, and `legend` to a mapping from channels to resolutions. Scales and guides can be resolved to be `\"independent\"` or `\"shared\"`.",
      "properties": {
        "axis": {
          "$ref": "#/definitions/AxisResolveMap"
        },
        "legend": {
          "$ref": "#/definitions/LegendResolveMap"
        },
        "scale": {
          "$ref": "#/definitions/ScaleResolveMap"
        }
      },
      "type": "object"
    },
    "ResolveMode": {
      "enum": [
        "independent",
        "shared"
      ],
      "type": "string"
    },
    "RowCol<LayoutAlign>": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "$ref": "#/definitions/LayoutAlign"
        },
        "row": {
          "$ref": "#/definitions/LayoutAlign"
        }
      },
      "type": "object"
    },
    "RowCol<boolean>": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "type": "boolean"
        },
        "row": {
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "RowCol<number>": {
      "additionalProperties": false,
      "properties": {
        "column": {
          "type": "number"
        },
        "row": {
          "type": "number"
        }
      },
      "type": "object"
    },
    "RowColumnEncodingFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "align": {
          "$ref": "#/definitions/LayoutAlign",
          "description": "The alignment to apply to row/column facet's subplot. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "center": {
          "description": "Boolean flag indicating if facet's subviews should be centered relative to their respective rows or columns.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "header": {
          "anyOf": [
            {
              "$ref": "#/definitions/Header"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of a facet's header."
        },
        "sort": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortArray"
            },
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "$ref": "#/definitions/EncodingSortField"
            },
            {
              "type": "null"
            }
          ],
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` is not supported for `row` and `column`."
        },
        "spacing": {
          "description": "The spacing in pixels between facet's sub-views.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)",
          "type": "number"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "SampleTransform": {
      "additionalProperties": false,
      "properties": {
        "sample": {
          "description": "The maximum number of data objects to include in the sample.\n\n__Default value:__ `1000`",
          "type": "number"
        }
      },
      "required": [
        "sample"
      ],
      "type": "object"
    },
    "Scale": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The alignment of the steps within the scale range.\n\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n\n__Default value:__ `0.5`"
        },
        "base": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The logarithm base of the `log` scale (default `10`)."
        },
        "bins": {
          "$ref": "#/definitions/ScaleBins",
          "description": "Bin boundaries can be provided to scales as either an explicit array of bin boundaries or as a bin specification object. The legal values are:\n- An [array](../types/#Array) literal of bin boundary values. For example, `[0, 5, 10, 15, 20]`. The array must include both starting and ending boundaries. The previous example uses five values to indicate a total of four bin intervals: [0-5), [5-10), [10-15), [15-20]. Array literals may include signal references as elements.\n- A [bin specification object](https://vega.github.io/vega-lite/docs/scale.html#bins) that indicates the bin _step_ size, and optionally the _start_ and _stop_ boundaries.\n- An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels."
        },
        "clamp": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default)."
        },
        "constant": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n\n__Default value:__ `1`"
        },
        "domain": {
          "anyOf": [
            {
              "items": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "string"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "$ref": "#/definitions/DateTime"
                  },
                  {
                    "$ref": "#/definitions/ExprRef"
                  }
                ]
              },
              "type": "array"
            },
            {
              "const": "unaggregated",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ParameterExtent"
            },
            {
              "$ref": "#/definitions/DomainUnionWith"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Customized domain values in the form of constant values or dynamic values driven by a parameter.\n\n1) Constant `domain` for _quantitative_ fields can take one of the following forms:\n\n- A two-element array with minimum and maximum values. To create a diverging scale, this two-element array can be combined with the `domainMid` property.\n- An array with more than two entries, for [Piecewise quantitative scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n- A string value `\"unaggregated\"`, if the input field is aggregated, to indicate that the domain should include the raw data values prior to the aggregation.\n\n2) Constant `domain` for _temporal_ fields can be a two-element array with minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\n\n3) Constant `domain` for _ordinal_ and _nominal_ fields can be an array that lists valid input values.\n\n4) To combine (union) specified constant domain with the field's values, `domain` can be an object with a `unionWith` property that specify constant domain to be combined. For example, `domain: {unionWith: [0, 100]}` for a quantitative scale means that the scale domain always includes `[0, 100]`, but will include other values in the fields beyond `[0, 100]`.\n\n5) Domain can also takes an object defining a field or encoding of a parameter that [interactively determines](https://vega.github.io/vega-lite/docs/selection.html#scale-domains) the scale domain."
        },
        "domainMax": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains."
        },
        "domainMid": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains."
        },
        "domainMin": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains."
        },
        "domainRaw": {
          "$ref": "#/definitions/ExprRef",
          "description": "An expression for an array of raw values that, if non-null, directly overrides the _domain_ property. This is useful for supporting interactions such as panning or zooming a scale. The scale may be initially determined using a data-driven domain, then modified in response to user input by setting the rawDomain value."
        },
        "exponent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The exponent of the `pow` scale."
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/ScaleInterpolateEnum"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/ScaleInterpolateParams"
            }
          ],
          "description": "The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n\n* __Default value:__ `hcl`"
        },
        "nice": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/TimeInterval"
            },
            {
              "$ref": "#/definitions/TimeIntervalStep"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\nFor temporal fields with time and utc scales, the `nice` value can be a string indicating the desired time interval. Legal values are `\"millisecond\"`, `\"second\"`, `\"minute\"`, `\"hour\"`, `\"day\"`, `\"week\"`, `\"month\"`, and `\"year\"`. Alternatively, `time` and `utc` scales can accept an object-valued interval specifier of the form `{\"interval\": \"month\", \"step\": 3}`, which includes a desired number of interval steps. Here, the domain would snap to quarter (Jan, Apr, Jul, Oct) boundaries.\n\n__Default value:__ `true` for unbinned _quantitative_ fields without explicit domain bounds; `false` otherwise."
        },
        "padding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\n\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\n\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`. By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.",
          "minimum": 0
        },
        "paddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.",
          "maximum": 1,
          "minimum": 0
        },
        "paddingOuter": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.",
          "maximum": 1,
          "minimum": 0
        },
        "range": {
          "anyOf": [
            {
              "$ref": "#/definitions/RangeEnum"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string"
                  },
                  {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  {
                    "$ref": "#/definitions/ExprRef"
                  }
                ]
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/FieldRange"
            }
          ],
          "description": "The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\"symbol\"`, or `\"diverging\"`).\n\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating  minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\n\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values or an object with a `field` property representing the range values.  For example, if a field `color` contains CSS color names, we can set `range` to `{field: \"color\"}`.\n\n__Notes:__\n\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."
        },
        "rangeMax": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Sets the maximum value in the scale range, overriding the `range` property or the default range. This property is only intended for use with scales having continuous ranges."
        },
        "rangeMin": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Sets the minimum value in the scale range, overriding the `range` property or the default range. This property is only intended for use with scales having continuous ranges."
        },
        "reverse": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, reverses the order of the scale range. __Default value:__ `false`."
        },
        "round": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`."
        },
        "scheme": {
          "anyOf": [
            {
              "$ref": "#/definitions/ColorScheme"
            },
            {
              "$ref": "#/definitions/SchemeParams"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\"category10\"` or `\"blues\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
        },
        "type": {
          "$ref": "#/definitions/ScaleType",
          "description": "The type of scale. Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\"linear\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\"pow\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\"sqrt\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\"symlog\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\"log\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\"time\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\"utc\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\n\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\"ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\"band\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\"point\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\"bin-ordinal\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\"quantile\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\"quantize\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\"threshold\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\n\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."
        },
        "zero": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`."
        }
      },
      "type": "object"
    },
    "ScaleBinParams": {
      "additionalProperties": false,
      "properties": {
        "start": {
          "description": "The starting (lowest-valued) bin boundary.\n\n__Default value:__ The lowest value of the scale domain will be used.",
          "type": "number"
        },
        "step": {
          "description": "The step size defining the bin interval width.",
          "type": "number"
        },
        "stop": {
          "description": "The stopping (highest-valued) bin boundary.\n\n__Default value:__ The highest value of the scale domain will be used.",
          "type": "number"
        }
      },
      "required": [
        "step"
      ],
      "type": "object"
    },
    "ScaleBins": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        {
          "$ref": "#/definitions/ScaleBinParams"
        }
      ]
    },
    "ScaleConfig": {
      "additionalProperties": false,
      "properties": {
        "bandPaddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default inner padding for `x` and `y` band scales.\n\n__Default value:__\n- `nestedOffsetPaddingInner` for x/y scales with nested x/y offset scales.\n- `barBandPaddingInner` for bar marks (`0.1` by default)\n- `rectBandPaddingInner` for rect and other marks (`0` by default)",
          "maximum": 1,
          "minimum": 0
        },
        "bandPaddingOuter": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default outer padding for `x` and `y` band scales.\n\n__Default value:__ `paddingInner/2` (which makes _width/height = number of unique values * step_)",
          "maximum": 1,
          "minimum": 0
        },
        "bandWithNestedOffsetPaddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default inner padding for `x` and `y` band scales with nested `xOffset` and `yOffset` encoding.\n\n__Default value:__ `0.2`",
          "maximum": 1,
          "minimum": 0
        },
        "bandWithNestedOffsetPaddingOuter": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default outer padding for `x` and `y` band scales with nested `xOffset` and `yOffset` encoding.\n\n__Default value:__ `0.2`",
          "maximum": 1,
          "minimum": 0
        },
        "barBandPaddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default inner padding for `x` and `y` band-ordinal scales of `\"bar\"` marks.\n\n__Default value:__ `0.1`",
          "maximum": 1,
          "minimum": 0
        },
        "clamp": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, values that exceed the data domain are clamped to either the minimum or maximum range value"
        },
        "continuousPadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default padding for continuous x/y scales.\n\n__Default:__ The bar width for continuous x-scale of a vertical bar and continuous y-scale of a horizontal bar.; `0` otherwise.",
          "minimum": 0
        },
        "maxBandSize": {
          "description": "The default max value for mapping quantitative fields to bar's size/bandSize.\n\nIf undefined (default), we will use the axis's size (width or height) - 1.",
          "minimum": 0,
          "type": "number"
        },
        "maxFontSize": {
          "description": "The default max value for mapping quantitative fields to text's size/fontSize.\n\n__Default value:__ `40`",
          "minimum": 0,
          "type": "number"
        },
        "maxOpacity": {
          "description": "Default max opacity for mapping a field to opacity.\n\n__Default value:__ `0.8`",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "maxSize": {
          "description": "Default max value for point size scale.",
          "minimum": 0,
          "type": "number"
        },
        "maxStrokeWidth": {
          "description": "Default max strokeWidth for the scale of strokeWidth for rule and line marks and of size for trail marks.\n\n__Default value:__ `4`",
          "minimum": 0,
          "type": "number"
        },
        "minBandSize": {
          "description": "The default min value for mapping quantitative fields to bar and tick's size/bandSize scale with zero=false.\n\n__Default value:__ `2`",
          "minimum": 0,
          "type": "number"
        },
        "minFontSize": {
          "description": "The default min value for mapping quantitative fields to tick's size/fontSize scale with zero=false\n\n__Default value:__ `8`",
          "minimum": 0,
          "type": "number"
        },
        "minOpacity": {
          "description": "Default minimum opacity for mapping a field to opacity.\n\n__Default value:__ `0.3`",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "minSize": {
          "description": "Default minimum value for point size scale with zero=false.\n\n__Default value:__ `9`",
          "minimum": 0,
          "type": "number"
        },
        "minStrokeWidth": {
          "description": "Default minimum strokeWidth for the scale of strokeWidth for rule and line marks and of size for trail marks with zero=false.\n\n__Default value:__ `1`",
          "minimum": 0,
          "type": "number"
        },
        "offsetBandPaddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default padding inner for xOffset/yOffset's band scales.\n\n__Default Value:__ `0`"
        },
        "offsetBandPaddingOuter": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default padding outer for xOffset/yOffset's band scales.\n\n__Default Value:__ `0`"
        },
        "pointPadding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default outer padding for `x` and `y` point-ordinal scales.\n\n__Default value:__ `0.5` (which makes _width/height = number of unique values * step_)",
          "maximum": 1,
          "minimum": 0
        },
        "quantileCount": {
          "description": "Default range cardinality for [`quantile`](https://vega.github.io/vega-lite/docs/scale.html#quantile) scale.\n\n__Default value:__ `4`",
          "minimum": 0,
          "type": "number"
        },
        "quantizeCount": {
          "description": "Default range cardinality for [`quantize`](https://vega.github.io/vega-lite/docs/scale.html#quantize) scale.\n\n__Default value:__ `4`",
          "minimum": 0,
          "type": "number"
        },
        "rectBandPaddingInner": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default inner padding for `x` and `y` band-ordinal scales of `\"rect\"` marks.\n\n__Default value:__ `0`",
          "maximum": 1,
          "minimum": 0
        },
        "round": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "If true, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid. (Only available for `x`, `y`, and `size` scales.)"
        },
        "useUnaggregatedDomain": {
          "description": "Use the source data range before aggregation as scale domain instead of aggregated data for aggregate axis.\n\nThis is equivalent to setting `domain` to `\"unaggregate\"` for aggregated _quantitative_ fields by default.\n\nThis property only works with aggregate functions that produce values within the raw data domain (`\"mean\"`, `\"average\"`, `\"median\"`, `\"q1\"`, `\"q3\"`, `\"min\"`, `\"max\"`). For other aggregations that produce values outside of the raw data domain (e.g. `\"count\"`, `\"sum\"`), this property is ignored.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "xReverse": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Reverse x-scale by default (useful for right-to-left charts)."
        },
        "zero": {
          "description": "Default `scale.zero` for [`continuous`](https://vega.github.io/vega-lite/docs/scale.html#continuous) scales except for (1) x/y-scales of non-ranged bar or area charts and (2) size scales.\n\n__Default value:__ `true`",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "ScaleDatumDef": {
      "additionalProperties": false,
      "properties": {
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "datum": {
          "anyOf": [
            {
              "$ref": "#/definitions/PrimitiveValue"
            },
            {
              "$ref": "#/definitions/DateTime"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "$ref": "#/definitions/RepeatRef"
            }
          ],
          "description": "A constant value in data domain."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/Type",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "ScaleFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "scale": {
          "anyOf": [
            {
              "$ref": "#/definitions/Scale"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
        },
        "sort": {
          "$ref": "#/definitions/Sort",
          "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "ScaleInterpolateEnum": {
      "enum": [
        "rgb",
        "lab",
        "hcl",
        "hsl",
        "hsl-long",
        "hcl-long",
        "cubehelix",
        "cubehelix-long"
      ],
      "type": "string"
    },
    "ScaleInterpolateParams": {
      "additionalProperties": false,
      "properties": {
        "gamma": {
          "type": "number"
        },
        "type": {
          "enum": [
            "rgb",
            "cubehelix",
            "cubehelix-long"
          ],
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ScaleResolveMap": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "$ref": "#/definitions/ResolveMode"
        },
        "color": {
          "$ref": "#/definitions/ResolveMode"
        },
        "fill": {
          "$ref": "#/definitions/ResolveMode"
        },
        "fillOpacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "opacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "radius": {
          "$ref": "#/definitions/ResolveMode"
        },
        "shape": {
          "$ref": "#/definitions/ResolveMode"
        },
        "size": {
          "$ref": "#/definitions/ResolveMode"
        },
        "stroke": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeDash": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeOpacity": {
          "$ref": "#/definitions/ResolveMode"
        },
        "strokeWidth": {
          "$ref": "#/definitions/ResolveMode"
        },
        "theta": {
          "$ref": "#/definitions/ResolveMode"
        },
        "x": {
          "$ref": "#/definitions/ResolveMode"
        },
        "xOffset": {
          "$ref": "#/definitions/ResolveMode"
        },
        "y": {
          "$ref": "#/definitions/ResolveMode"
        },
        "yOffset": {
          "$ref": "#/definitions/ResolveMode"
        }
      },
      "type": "object"
    },
    "ScaleType": {
      "enum": [
        "linear",
        "log",
        "pow",
        "sqrt",
        "symlog",
        "identity",
        "sequential",
        "time",
        "utc",
        "quantile",
        "quantize",
        "threshold",
        "bin-ordinal",
        "ordinal",
        "point",
        "band"
      ],
      "type": "string"
    },
    "SchemeParams": {
      "additionalProperties": false,
      "properties": {
        "count": {
          "description": "The number of colors to use in the scheme. This can be useful for scale types such as `\"quantize\"`, which use the length of the scale range to determine the number of discrete bins for the scale domain.",
          "type": "number"
        },
        "extent": {
          "description": "The extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.",
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "name": {
          "$ref": "#/definitions/ColorScheme",
          "description": "A color scheme name for ordinal scales (e.g., `\"category10\"` or `\"blues\"`).\n\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "SecondaryFieldDef": {
      "additionalProperties": false,
      "description": "A field definition of a secondary channel that shares a scale with another primary channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
          "type": "null"
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        }
      },
      "type": "object"
    },
    "SelectionConfig": {
      "additionalProperties": false,
      "properties": {
        "interval": {
          "$ref": "#/definitions/IntervalSelectionConfigWithoutType",
          "description": "The default definition for an [`interval`](https://vega.github.io/vega-lite/docs/parameter.html#select) selection. All properties and transformations for an interval selection definition (except `type`) may be specified here.\n\nFor instance, setting `interval` to `{\"translate\": false}` disables the ability to move interval selections by default."
        },
        "point": {
          "$ref": "#/definitions/PointSelectionConfigWithoutType",
          "description": "The default definition for a [`point`](https://vega.github.io/vega-lite/docs/parameter.html#select) selection. All properties and transformations  for a point selection definition (except `type`) may be specified here.\n\nFor instance, setting `point` to `{\"on\": \"dblclick\"}` populates point selections on double-click by default."
        }
      },
      "type": "object"
    },
    "SelectionInit": {
      "anyOf": [
        {
          "$ref": "#/definitions/PrimitiveValue"
        },
        {
          "$ref": "#/definitions/DateTime"
        }
      ]
    },
    "SelectionInitInterval": {
      "anyOf": [
        {
          "$ref": "#/definitions/Vector2<boolean>"
        },
        {
          "$ref": "#/definitions/Vector2<number>"
        },
        {
          "$ref": "#/definitions/Vector2<string>"
        },
        {
          "$ref": "#/definitions/Vector2<DateTime>"
        }
      ]
    },
    "SelectionInitIntervalMapping": {
      "$ref": "#/definitions/Dict<SelectionInitInterval>"
    },
    "SelectionInitMapping": {
      "$ref": "#/definitions/Dict<SelectionInit>"
    },
    "SelectionParameter": {
      "additionalProperties": false,
      "properties": {
        "bind": {
          "anyOf": [
            {
              "$ref": "#/definitions/Binding"
            },
            {
              "additionalProperties": {
                "$ref": "#/definitions/Binding"
              },
              "type": "object"
            },
            {
              "$ref": "#/definitions/LegendBinding"
            },
            {
              "const": "scales",
              "type": "string"
            }
          ],
          "description": "When set, a selection is populated by input elements (also known as dynamic query widgets) or by interacting with the corresponding legend. Direct manipulation interaction is disabled by default; to re-enable it, set the selection's [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties) property.\n\nLegend bindings are restricted to selections that only specify a single field or encoding.\n\nQuery widget binding takes the form of Vega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind) or can be a mapping between projected field/encodings and binding definitions.\n\n__See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation."
        },
        "name": {
          "$ref": "#/definitions/ParameterName",
          "description": "Required. A unique name for the selection parameter. Selection names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \"$\", or \"_\") and may not start with a digit. Reserved keywords that may not be used as parameter names are \"datum\", \"event\", \"item\", and \"parent\"."
        },
        "select": {
          "anyOf": [
            {
              "$ref": "#/definitions/SelectionType"
            },
            {
              "$ref": "#/definitions/PointSelectionConfig"
            },
            {
              "$ref": "#/definitions/IntervalSelectionConfig"
            }
          ],
          "description": "Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/SelectionInit"
            },
            {
              "items": {
                "$ref": "#/definitions/SelectionInitMapping"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/SelectionInitIntervalMapping"
            }
          ],
          "description": "Initialize the selection with a mapping between [projected channels or field names](https://vega.github.io/vega-lite/docs/selection.html#project) and initial values.\n\n__See also:__ [`init`](https://vega.github.io/vega-lite/docs/value.html) documentation."
        }
      },
      "required": [
        "name",
        "select"
      ],
      "type": "object"
    },
    "SelectionResolution": {
      "enum": [
        "global",
        "union",
        "intersect"
      ],
      "type": "string"
    },
    "SelectionType": {
      "enum": [
        "point",
        "interval"
      ],
      "type": "string"
    },
    "SequenceGenerator": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "sequence": {
          "$ref": "#/definitions/SequenceParams",
          "description": "Generate a sequence of numbers."
        }
      },
      "required": [
        "sequence"
      ],
      "type": "object"
    },
    "SequenceParams": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The name of the generated sequence field.\n\n__Default value:__ `\"data\"`"
        },
        "start": {
          "description": "The starting value of the sequence (inclusive).",
          "type": "number"
        },
        "step": {
          "description": "The step value between sequence entries.\n\n__Default value:__ `1`",
          "type": "number"
        },
        "stop": {
          "description": "The ending value of the sequence (exclusive).",
          "type": "number"
        }
      },
      "required": [
        "start",
        "stop"
      ],
      "type": "object"
    },
    "SequentialMultiHue": {
      "enum": [
        "turbo",
        "viridis",
        "inferno",
        "magma",
        "plasma",
        "cividis",
        "bluegreen",
        "bluegreen-3",
        "bluegreen-4",
        "bluegreen-5",
        "bluegreen-6",
        "bluegreen-7",
        "bluegreen-8",
        "bluegreen-9",
        "bluepurple",
        "bluepurple-3",
        "bluepurple-4",
        "bluepurple-5",
        "bluepurple-6",
        "bluepurple-7",
        "bluepurple-8",
        "bluepurple-9",
        "goldgreen",
        "goldgreen-3",
        "goldgreen-4",
        "goldgreen-5",
        "goldgreen-6",
        "goldgreen-7",
        "goldgreen-8",
        "goldgreen-9",
        "goldorange",
        "goldorange-3",
        "goldorange-4",
        "goldorange-5",
        "goldorange-6",
        "goldorange-7",
        "goldorange-8",
        "goldorange-9",
        "goldred",
        "goldred-3",
        "goldred-4",
        "goldred-5",
        "goldred-6",
        "goldred-7",
        "goldred-8",
        "goldred-9",
        "greenblue",
        "greenblue-3",
        "greenblue-4",
        "greenblue-5",
        "greenblue-6",
        "greenblue-7",
        "greenblue-8",
        "greenblue-9",
        "orangered",
        "orangered-3",
        "orangered-4",
        "orangered-5",
        "orangered-6",
        "orangered-7",
        "orangered-8",
        "orangered-9",
        "purplebluegreen",
        "purplebluegreen-3",
        "purplebluegreen-4",
        "purplebluegreen-5",
        "purplebluegreen-6",
        "purplebluegreen-7",
        "purplebluegreen-8",
        "purplebluegreen-9",
        "purpleblue",
        "purpleblue-3",
        "purpleblue-4",
        "purpleblue-5",
        "purpleblue-6",
        "purpleblue-7",
        "purpleblue-8",
        "purpleblue-9",
        "purplered",
        "purplered-3",
        "purplered-4",
        "purplered-5",
        "purplered-6",
        "purplered-7",
        "purplered-8",
        "purplered-9",
        "redpurple",
        "redpurple-3",
        "redpurple-4",
        "redpurple-5",
        "redpurple-6",
        "redpurple-7",
        "redpurple-8",
        "redpurple-9",
        "yellowgreenblue",
        "yellowgreenblue-3",
        "yellowgreenblue-4",
        "yellowgreenblue-5",
        "yellowgreenblue-6",
        "yellowgreenblue-7",
        "yellowgreenblue-8",
        "yellowgreenblue-9",
        "yellowgreen",
        "yellowgreen-3",
        "yellowgreen-4",
        "yellowgreen-5",
        "yellowgreen-6",
        "yellowgreen-7",
        "yellowgreen-8",
        "yellowgreen-9",
        "yelloworangebrown",
        "yelloworangebrown-3",
        "yelloworangebrown-4",
        "yelloworangebrown-5",
        "yelloworangebrown-6",
        "yelloworangebrown-7",
        "yelloworangebrown-8",
        "yelloworangebrown-9",
        "yelloworangered",
        "yelloworangered-3",
        "yelloworangered-4",
        "yelloworangered-5",
        "yelloworangered-6",
        "yelloworangered-7",
        "yelloworangered-8",
        "yelloworangered-9",
        "darkblue",
        "darkblue-3",
        "darkblue-4",
        "darkblue-5",
        "darkblue-6",
        "darkblue-7",
        "darkblue-8",
        "darkblue-9",
        "darkgold",
        "darkgold-3",
        "darkgold-4",
        "darkgold-5",
        "darkgold-6",
        "darkgold-7",
        "darkgold-8",
        "darkgold-9",
        "darkgreen",
        "darkgreen-3",
        "darkgreen-4",
        "darkgreen-5",
        "darkgreen-6",
        "darkgreen-7",
        "darkgreen-8",
        "darkgreen-9",
        "darkmulti",
        "darkmulti-3",
        "darkmulti-4",
        "darkmulti-5",
        "darkmulti-6",
        "darkmulti-7",
        "darkmulti-8",
        "darkmulti-9",
        "darkred",
        "darkred-3",
        "darkred-4",
        "darkred-5",
        "darkred-6",
        "darkred-7",
        "darkred-8",
        "darkred-9",
        "lightgreyred",
        "lightgreyred-3",
        "lightgreyred-4",
        "lightgreyred-5",
        "lightgreyred-6",
        "lightgreyred-7",
        "lightgreyred-8",
        "lightgreyred-9",
        "lightgreyteal",
        "lightgreyteal-3",
        "lightgreyteal-4",
        "lightgreyteal-5",
        "lightgreyteal-6",
        "lightgreyteal-7",
        "lightgreyteal-8",
        "lightgreyteal-9",
        "lightmulti",
        "lightmulti-3",
        "lightmulti-4",
        "lightmulti-5",
        "lightmulti-6",
        "lightmulti-7",
        "lightmulti-8",
        "lightmulti-9",
        "lightorange",
        "lightorange-3",
        "lightorange-4",
        "lightorange-5",
        "lightorange-6",
        "lightorange-7",
        "lightorange-8",
        "lightorange-9",
        "lighttealblue",
        "lighttealblue-3",
        "lighttealblue-4",
        "lighttealblue-5",
        "lighttealblue-6",
        "lighttealblue-7",
        "lighttealblue-8",
        "lighttealblue-9"
      ],
      "type": "string"
    },
    "SequentialSingleHue": {
      "enum": [
        "blues",
        "tealblues",
        "teals",
        "greens",
        "browns",
        "greys",
        "purples",
        "warmgreys",
        "reds",
        "oranges"
      ],
      "type": "string"
    },
    "ShapeDef": {
      "$ref": "#/definitions/MarkPropDef<(string|null),TypeForShape>"
    },
    "SharedEncoding": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "color": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Gradient"
                },
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "description": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "format": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Dict"
                }
              ],
              "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
            },
            "formatType": {
              "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
              "type": "string"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "detail": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldDefWithoutScale"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldDefWithoutScale"
              },
              "type": "array"
            }
          ],
          "description": "Additional levels of detail for grouping data in aggregate views and in line, trail, and area marks without mapping data to a specific visual channel."
        },
        "fill": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Gradient"
                },
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "fillOpacity": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "href": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "format": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Dict"
                }
              ],
              "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
            },
            "formatType": {
              "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
              "type": "string"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "key": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "type": "object"
        },
        "latitude": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "const": "quantitative",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "type": "object"
        },
        "latitude2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "longitude": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "const": "quantitative",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            }
          },
          "type": "object"
        },
        "longitude2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "opacity": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/OrderFieldDef"
            },
            {
              "items": {
                "$ref": "#/definitions/OrderFieldDef"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/OrderValueDef"
            },
            {
              "$ref": "#/definitions/OrderOnlyDef"
            }
          ],
          "description": "Order of the marks.\n- For stacked marks, this `order` channel encodes [stack order](https://vega.github.io/vega-lite/docs/stack.html#order).\n- For line and trail marks, this `order` channel encodes order of data points in the lines. This can be useful for creating [a connected scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html). Setting `order` to `{\"value\": null}` makes the line marks use the original order in the data sources.\n- Otherwise, this `order` channel encodes layer order of the marks.\n\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping."
        },
        "radius": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "stack": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StackOffset"
                },
                {
                  "type": "null"
                },
                {
                  "type": "boolean"
                }
              ],
              "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "radius2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "shape": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef<TypeForShape>"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TypeForShape",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "size": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "stroke": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Gradient"
                },
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "strokeDash": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "strokeOpacity": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "strokeWidth": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "legend": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Legend"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the legend. If `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.\n\n__See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "text": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalStringFieldDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "format": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Dict"
                }
              ],
              "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
            },
            "formatType": {
              "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
              "type": "string"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "theta": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "stack": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StackOffset"
                },
                {
                  "type": "null"
                },
                {
                  "type": "boolean"
                }
              ],
              "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "theta2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "tooltip": {
          "anyOf": [
            {
              "$ref": "#/definitions/StringFieldDefWithCondition"
            },
            {
              "$ref": "#/definitions/StringValueDefWithCondition"
            },
            {
              "items": {
                "$ref": "#/definitions/StringFieldDef"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the `tooltip` property in the mark definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip in Vega-Lite."
        },
        "url": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "condition": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
                },
                {
                  "anyOf": [
                    {
                      "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
                    },
                    {
                      "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                    },
                    {
                      "items": {
                        "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
                      },
                      "type": "array"
                    }
                  ],
                  "description": "A field definition or one or more value definition(s) with a parameter predicate."
                }
              ],
              "description": "One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\n\n__Note:__ A field definition's `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "format": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/Dict"
                }
              ],
              "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
            },
            "formatType": {
              "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
              "type": "string"
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/StandardType",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "x": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "axis": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Axis"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "impute": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ImputeParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining the properties of the Impute Operation to be applied. The field value of the other positional channel is taken as `key` of the `Impute` Operation. The field of the `color` channel if specified is used as `groupby` of the `Impute` Operation.\n\n__See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "stack": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StackOffset"
                },
                {
                  "type": "null"
                },
                {
                  "type": "boolean"
                }
              ],
              "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "x2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "xError": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        },
        "xError2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        },
        "xOffset": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        },
        "y": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "axis": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Axis"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\n\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "const": "binned",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "impute": {
              "anyOf": [
                {
                  "$ref": "#/definitions/ImputeParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining the properties of the Impute Operation to be applied. The field value of the other positional channel is taken as `key` of the `Impute` Operation. The field of the `color` channel if specified is used as `groupby` of the `Impute` Operation.\n\n__See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "stack": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StackOffset"
                },
                {
                  "type": "null"
                },
                {
                  "type": "boolean"
                }
              ],
              "description": "Type of stacking offset if the field should be stacked. `stack` is only applicable for `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `\"zero\"` or `true`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart).\n- `\"normalize\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized) and pie charts [with percentage tooltip](https://vega.github.io/vega-lite/docs/arc.html#tooltip)). <br/>\n-`\"center\"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)).\n- `null` or `false` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a linear scale; (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default.\n\n__See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "y2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "$ref": "#/definitions/Type",
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "const": "width",
                  "type": "string"
                },
                {
                  "const": "height",
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
            }
          },
          "type": "object"
        },
        "yError": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        },
        "yError2": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.",
              "type": "null"
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        },
        "yOffset": {
          "additionalProperties": false,
          "properties": {
            "aggregate": {
              "$ref": "#/definitions/Aggregate",
              "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
            },
            "bandPosition": {
              "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "bin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/BinParams"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
            },
            "datum": {
              "anyOf": [
                {
                  "$ref": "#/definitions/PrimitiveValue"
                },
                {
                  "$ref": "#/definitions/DateTime"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                },
                {
                  "$ref": "#/definitions/RepeatRef"
                }
              ],
              "description": "A constant value in data domain."
            },
            "field": {
              "$ref": "#/definitions/Field",
              "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
            },
            "scale": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Scale"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\n\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\n\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."
            },
            "sort": {
              "$ref": "#/definitions/Sort",
              "description": "Sort order for the encoded field.\n\nFor continuous fields (quantitative or temporal), `sort` can be either `\"ascending\"` or `\"descending\"`.\n\nFor discrete fields, `sort` can be one of the following:\n- `\"ascending\"` or `\"descending\"` -- for sorting by the values' natural order in JavaScript.\n- [A string indicating an encoding channel name to sort by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `\"x\"` or `\"y\"`) with an optional minus prefix for descending sort (e.g., `\"-x\"` to sort by x-field, descending). This channel string is short-form of [a sort-by-encoding definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For example, `\"sort\": \"-x\"` is equivalent to `\"sort\": {\"encoding\": \"x\", \"order\": \"descending\"}`.\n- [A sort field definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by another field.\n- [An array specifying the field values in preferred order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the sort order will obey the values in the array, followed by any unspecified values in their original order. For discrete time field, values in the sort array can be [date-time definition objects](types#datetime). In addition, for time units `\"month\"` and `\"day\"`, the values can be the month or day names (case insensitive) or their 3-letter initials (e.g., `\"Mon\"`, `\"Tue\"`).\n- `null` indicating no sort.\n\n__Default value:__ `\"ascending\"`\n\n__Note:__ `null` and sorting by another channel is not supported for `row` and `column`.\n\n__See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation."
            },
            "timeUnit": {
              "anyOf": [
                {
                  "$ref": "#/definitions/TimeUnit"
                },
                {
                  "$ref": "#/definitions/BinnedTimeUnit"
                },
                {
                  "$ref": "#/definitions/TimeUnitParams"
                }
              ],
              "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
            },
            "type": {
              "anyOf": [
                {
                  "$ref": "#/definitions/StandardType",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                },
                {
                  "$ref": "#/definitions/Type",
                  "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
                }
              ],
              "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
            },
            "value": {
              "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
              "type": "number"
            }
          },
          "type": "object"
        }
      },
      "type": "object"
    },
    "SingleDefUnitChannel": {
      "enum": [
        "x",
        "y",
        "xOffset",
        "yOffset",
        "x2",
        "y2",
        "longitude",
        "latitude",
        "longitude2",
        "latitude2",
        "theta",
        "theta2",
        "radius",
        "radius2",
        "color",
        "fill",
        "stroke",
        "opacity",
        "fillOpacity",
        "strokeOpacity",
        "strokeWidth",
        "strokeDash",
        "size",
        "angle",
        "shape",
        "key",
        "text",
        "href",
        "url",
        "description"
      ],
      "type": "string"
    },
    "SingleTimeUnit": {
      "anyOf": [
        {
          "$ref": "#/definitions/LocalSingleTimeUnit"
        },
        {
          "$ref": "#/definitions/UtcSingleTimeUnit"
        }
      ]
    },
    "Sort": {
      "anyOf": [
        {
          "$ref": "#/definitions/SortArray"
        },
        {
          "$ref": "#/definitions/AllSortString"
        },
        {
          "$ref": "#/definitions/EncodingSortField"
        },
        {
          "$ref": "#/definitions/SortByEncoding"
        },
        {
          "type": "null"
        }
      ]
    },
    "SortArray": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "items": {
            "type": "boolean"
          },
          "type": "array"
        },
        {
          "items": {
            "$ref": "#/definitions/DateTime"
          },
          "type": "array"
        }
      ]
    },
    "SortByChannel": {
      "enum": [
        "x",
        "y",
        "color",
        "fill",
        "stroke",
        "strokeWidth",
        "size",
        "shape",
        "fillOpacity",
        "strokeOpacity",
        "opacity",
        "text"
      ],
      "type": "string"
    },
    "SortByChannelDesc": {
      "enum": [
        "-x",
        "-y",
        "-color",
        "-fill",
        "-stroke",
        "-strokeWidth",
        "-size",
        "-shape",
        "-fillOpacity",
        "-strokeOpacity",
        "-opacity",
        "-text"
      ],
      "type": "string"
    },
    "SortByEncoding": {
      "additionalProperties": false,
      "properties": {
        "encoding": {
          "$ref": "#/definitions/SortByChannel",
          "description": "The [encoding channel](https://vega.github.io/vega-lite/docs/encoding.html#channels) to sort by (e.g., `\"x\"`, `\"y\"`)"
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "type": "null"
            }
          ],
          "description": "The sort order. One of `\"ascending\"` (default), `\"descending\"`, or `null` (no not sort)."
        }
      },
      "required": [
        "encoding"
      ],
      "type": "object"
    },
    "SortField": {
      "additionalProperties": false,
      "description": "A sort definition for transform",
      "properties": {
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The name of the field to sort."
        },
        "order": {
          "anyOf": [
            {
              "$ref": "#/definitions/SortOrder"
            },
            {
              "type": "null"
            }
          ],
          "description": "Whether to sort the field in ascending or descending order. One of `\"ascending\"` (default), `\"descending\"`, or `null` (no not sort)."
        }
      },
      "required": [
        "field"
      ],
      "type": "object"
    },
    "SortOrder": {
      "enum": [
        "ascending",
        "descending"
      ],
      "type": "string"
    },
    "SphereGenerator": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "sphere": {
          "anyOf": [
            {
              "const": true,
              "type": "boolean"
            },
            {
              "additionalProperties": false,
              "type": "object"
            }
          ],
          "description": "Generate sphere GeoJSON data for the full globe."
        }
      },
      "required": [
        "sphere"
      ],
      "type": "object"
    },
    "StackOffset": {
      "enum": [
        "zero",
        "center",
        "normalize"
      ],
      "type": "string"
    },
    "StackTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "anyOf": [
            {
              "$ref": "#/definitions/FieldName"
            },
            {
              "items": {
                "$ref": "#/definitions/FieldName"
              },
              "maxItems": 2,
              "minItems": 2,
              "type": "array"
            }
          ],
          "description": "Output field names. This can be either a string or an array of strings with two elements denoting the name for the fields for stack start and stack end respectively. If a single string(e.g., `\"val\"`) is provided, the end field will be `\"val_end\"`."
        },
        "groupby": {
          "description": "The data fields to group by.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "offset": {
          "description": "Mode for stacking marks. One of `\"zero\"` (default), `\"center\"`, or `\"normalize\"`. The `\"zero\"` offset will stack starting at `0`. The `\"center\"` offset will center the stacks. The `\"normalize\"` offset will compute percentage values for each stack point, with output values in the range `[0,1]`.\n\n__Default value:__ `\"zero\"`",
          "enum": [
            "zero",
            "center",
            "normalize"
          ],
          "type": "string"
        },
        "sort": {
          "description": "Field that determines the order of leaves in the stacked charts.",
          "items": {
            "$ref": "#/definitions/SortField"
          },
          "type": "array"
        },
        "stack": {
          "$ref": "#/definitions/FieldName",
          "description": "The field which is stacked."
        }
      },
      "required": [
        "stack",
        "groupby",
        "as"
      ],
      "type": "object"
    },
    "StandardType": {
      "enum": [
        "quantitative",
        "ordinal",
        "temporal",
        "nominal"
      ],
      "type": "string"
    },
    "Step": {
      "additionalProperties": false,
      "properties": {
        "for": {
          "$ref": "#/definitions/StepFor",
          "description": "Whether to apply the step to position scale or offset scale when there are both `x` and `xOffset` or both `y` and `yOffset` encodings."
        },
        "step": {
          "description": "The size (width/height) per discrete step.",
          "type": "number"
        }
      },
      "required": [
        "step"
      ],
      "type": "object"
    },
    "StepFor": {
      "enum": [
        "position",
        "offset"
      ],
      "type": "string"
    },
    "Stream": {
      "anyOf": [
        {
          "$ref": "#/definitions/EventStream"
        },
        {
          "$ref": "#/definitions/DerivedStream"
        },
        {
          "$ref": "#/definitions/MergedStream"
        }
      ]
    },
    "StringFieldDef": {
      "additionalProperties": false,
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "format": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/definitions/Dict"
            }
          ],
          "description": "When used with the default `\"number\"` and `\"time\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\n\n- If the format type is `\"number\"` (e.g., for quantitative fields), this is D3's [number format pattern](https://github.com/d3/d3-format#locale_format).\n- If the format type is `\"time\"` (e.g., for temporal fields), this is D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.\n\nWhen used with a [custom `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this value will be passed as `format` alongside `datum.value` to the registered function.\n\n__Default value:__  Derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for number format and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time format."
        },
        "formatType": {
          "description": "The format type for labels. One of `\"number\"`, `\"time\"`, or a [registered custom format type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).\n\n__Default value:__\n- `\"time\"` for temporal fields and ordinal and nominal fields with `timeUnit`.\n- `\"number\"` for quantitative fields as well as ordinal and nominal fields without `timeUnit`.",
          "type": "string"
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "StringFieldDefWithCondition": {
      "$ref": "#/definitions/FieldOrDatumDefWithCondition<StringFieldDef,string>"
    },
    "StringValueDefWithCondition": {
      "$ref": "#/definitions/ValueDefWithCondition<MarkPropFieldOrDatumDef,(string|null)>"
    },
    "StrokeCap": {
      "enum": [
        "butt",
        "round",
        "square"
      ],
      "type": "string"
    },
    "StrokeJoin": {
      "enum": [
        "miter",
        "round",
        "bevel"
      ],
      "type": "string"
    },
    "StyleConfigIndex": {
      "additionalProperties": {
        "anyOf": [
          {
            "$ref": "#/definitions/AnyMarkConfig"
          },
          {
            "$ref": "#/definitions/Axis"
          }
        ]
      },
      "properties": {
        "arc": {
          "$ref": "#/definitions/RectConfig",
          "description": "Arc-specific Config"
        },
        "area": {
          "$ref": "#/definitions/AreaConfig",
          "description": "Area-Specific Config"
        },
        "bar": {
          "$ref": "#/definitions/BarConfig",
          "description": "Bar-Specific Config"
        },
        "circle": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Circle-Specific Config"
        },
        "geoshape": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Geoshape-Specific Config"
        },
        "group-subtitle": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Default style for chart subtitles"
        },
        "group-title": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Default style for chart titles"
        },
        "guide-label": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Default style for axis, legend, and header labels."
        },
        "guide-title": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Default style for axis, legend, and header titles."
        },
        "image": {
          "$ref": "#/definitions/RectConfig",
          "description": "Image-specific Config"
        },
        "line": {
          "$ref": "#/definitions/LineConfig",
          "description": "Line-Specific Config"
        },
        "mark": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Mark Config"
        },
        "point": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Point-Specific Config"
        },
        "rect": {
          "$ref": "#/definitions/RectConfig",
          "description": "Rect-Specific Config"
        },
        "rule": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Rule-Specific Config"
        },
        "square": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Square-Specific Config"
        },
        "text": {
          "$ref": "#/definitions/MarkConfig",
          "description": "Text-Specific Config"
        },
        "tick": {
          "$ref": "#/definitions/TickConfig",
          "description": "Tick-Specific Config"
        },
        "trail": {
          "$ref": "#/definitions/LineConfig",
          "description": "Trail-Specific Config"
        }
      },
      "type": "object"
    },
    "SymbolShape": {
      "type": "string"
    },
    "Text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      ]
    },
    "TextBaseline": {
      "anyOf": [
        {
          "const": "alphabetic",
          "type": "string"
        },
        {
          "$ref": "#/definitions/Baseline"
        },
        {
          "const": "line-top",
          "type": "string"
        },
        {
          "const": "line-bottom",
          "type": "string"
        }
      ]
    },
    "TextDef": {
      "anyOf": [
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<StringFieldDef,Text>"
        },
        {
          "$ref": "#/definitions/FieldOrDatumDefWithCondition<StringDatumDef,Text>"
        },
        {
          "$ref": "#/definitions/ValueDefWithCondition<StringFieldDef,Text>"
        }
      ]
    },
    "TextDirection": {
      "enum": [
        "ltr",
        "rtl"
      ],
      "type": "string"
    },
    "TickConfig": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/Align"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One of `\"left\"`, `\"right\"`, `\"center\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "angle": {
          "anyOf": [
            {
              "description": "The rotation angle of the text, in degrees.",
              "maximum": 360,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG element, removing the mark item from the ARIA accessibility tree.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRole": {
          "anyOf": [
            {
              "description": "Sets the type of user interface element of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"role\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ariaRoleDescription": {
          "anyOf": [
            {
              "description": "A human-readable, author-localized description for the role of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the \"aria-roledescription\" attribute. Warning: this property is experimental and may be changed in the future.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aspect": {
          "anyOf": [
            {
              "description": "Whether to keep aspect ratio of image marks.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "bandSize": {
          "description": "The width of the ticks.\n\n__Default value:__  3/4 of step (width step for horizontal ticks and height step for vertical ticks).",
          "minimum": 0,
          "type": "number"
        },
        "baseline": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextBaseline"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For text marks, the vertical text baseline. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, `\"line-bottom\"`, or an expression reference that provides one of the valid values. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the `lineHeight` rather than `fontSize` alone.\n\nFor range marks, the vertical alignment of the marks. One of `\"top\"`, `\"middle\"`, `\"bottom\"`.\n\n__Note:__ Expression reference is *not* supported for range marks."
        },
        "blend": {
          "anyOf": [
            {
              "$ref": "#/definitions/Blend",
              "description": "The color blend mode for drawing an item on its current background. Any valid [CSS mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value can be used.\n\n__Default value: `\"source-over\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "color": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default color.\n\n__Default value:__ <span style=\"color: #4682b4;\">&#9632;</span> `\"#4682b4\"`\n\n__Note:__\n- This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).\n- The `fill` and `stroke` properties have higher precedence than `color` and will override `color`."
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusBottomRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' bottom right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopLeft": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top right corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cornerRadiusTopRight": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles' top left corner.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "anyOf": [
            {
              "$ref": "#/definitions/Cursor",
              "description": "The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "description": {
          "anyOf": [
            {
              "description": "A text description of the mark item for [ARIA accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG output only). If specified, this property determines the [\"aria-label\" attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dir": {
          "anyOf": [
            {
              "$ref": "#/definitions/TextDirection",
              "description": "The direction of the text. One of `\"ltr\"` (left-to-right) or `\"rtl\"` (right-to-left). This property determines on which side is truncated in response to the limit parameter.\n\n__Default value:__ `\"ltr\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "ellipsis": {
          "anyOf": [
            {
              "description": "The ellipsis string for text truncated in response to the limit parameter.\n\n__Default value:__ `\"…\"`",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "endAngle": {
          "anyOf": [
            {
              "description": "The end angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default fill color. This property has higher precedence than `config.color`. Set to `null` to remove fill.\n\n__Default value:__ (None)"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "filled": {
          "description": "Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `false` for all `point`, `line`, and `rule` marks as well as `geoshape` marks for [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources; otherwise, `true`.\n\n__Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config).",
          "type": "boolean"
        },
        "font": {
          "anyOf": [
            {
              "description": "The typeface to set the text in (e.g., `\"Helvetica Neue\"`).",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "The font size, in pixels.\n\n__Default value:__ `11`",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "The font style (e.g., `\"italic\"`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "The font weight. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "description": "Height of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "href": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "A URL to load upon mouse click. If defined, the mark acts as a hyperlink."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "innerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "interpolate": {
          "anyOf": [
            {
              "$ref": "#/definitions/Interpolate",
              "description": "The line interpolation method to use for line and area marks. One of the following:\n- `\"linear\"`: piecewise linear segments, as in a polyline.\n- `\"linear-closed\"`: close the linear segments to form a polygon.\n- `\"step\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"step-before\"`: alternate between vertical and horizontal segments, as in a step function.\n- `\"step-after\"`: alternate between horizontal and vertical segments, as in a step function.\n- `\"basis\"`: a B-spline, with control point duplication on the ends.\n- `\"basis-open\"`: an open B-spline; may not intersect the start or end.\n- `\"basis-closed\"`: a closed B-spline, as in a loop.\n- `\"cardinal\"`: a Cardinal spline, with control point duplication on the ends.\n- `\"cardinal-open\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `\"cardinal-closed\"`: a closed Cardinal spline, as in a loop.\n- `\"bundle\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `\"monotone\"`: cubic interpolation that preserves monotonicity in y."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "invalid": {
          "description": "Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`).\n- If set to `\"filter\"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks).\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.",
          "enum": [
            "filter",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum length of the text mark in pixels. The text value will be automatically truncated if the rendered size exceeds the limit.\n\n__Default value:__ `0` -- indicating no limit",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineBreak": {
          "anyOf": [
            {
              "description": "A delimiter, such as a newline character, upon which to break text strings into multiple lines. This property is ignored if the text is array-valued.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "The line height in pixels (the spacing between subsequent lines of text) for multi-line text marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "order": {
          "description": "For line and trail marks, this `order` property can be set to `null` or `false` to make the lines use the original order in the data sources.",
          "type": [
            "null",
            "boolean"
          ]
        },
        "orient": {
          "$ref": "#/definitions/Orientation",
          "description": "The orientation of a non-stacked bar, tick, area, and line charts. The value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick should be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line and trail marks, this property determines the sort order of the points in the line if `config.sortLineBy` is not specified. For stacked charts, this is always determined by the orientation of the stack; therefore explicitly specified value will be ignored."
        },
        "outerRadius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "padAngle": {
          "anyOf": [
            {
              "description": "The angular padding applied to sides of the arc, in radians.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "radius": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "For arc mark, the primary (outer) radius in pixels.\n\nFor text marks, polar coordinate radial offset, in pixels, of the text from the origin determined by the `x` and `y` properties.\n\n__Default value:__ `min(plot_width, plot_height)/2`",
          "minimum": 0
        },
        "radius2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The secondary (inner) radius in pixels of arc marks.\n\n__Default value:__ `0`",
          "minimum": 0
        },
        "shape": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/SymbolShape"
                },
                {
                  "type": "string"
                }
              ],
              "description": "Shape of the point marks. Supported values include:\n- plotting shapes: `\"circle\"`, `\"square\"`, `\"cross\"`, `\"diamond\"`, `\"triangle-up\"`, `\"triangle-down\"`, `\"triangle-right\"`, or `\"triangle-left\"`.\n- the line symbol `\"stroke\"`\n- centered directional shapes `\"arrow\"`, `\"wedge\"`, or `\"triangle\"`\n- a custom [SVG path string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct sizing, custom shape paths should be defined within a square bounding box with coordinates ranging from -1 to 1 along both the x and y dimensions.)\n\n__Default value:__ `\"circle\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default size for marks.\n- For `point`/`circle`/`square`, this represents the pixel area of the marks. Note that this value sets the area of the symbol; the side lengths will increase with the square root of this value.\n- For `bar`, this represents the band size of the bar, in pixels.\n- For `text`, this represents the font size, in pixels.\n\n__Default value:__\n- `30` for point, circle, square marks; width/height's `step`\n- `2` for bar marks with discrete dimensions;\n- `5` for bar marks with continuous dimensions;\n- `11` for text marks.",
          "minimum": 0
        },
        "smooth": {
          "anyOf": [
            {
              "description": "A boolean flag (default true) indicating if the image should be smoothed when resized. If false, individual pixels should be scaled directly rather than interpolated with smoothing. For SVG rendering, this option may not work in some browsers due to lack of standardization.",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "startAngle": {
          "anyOf": [
            {
              "description": "The start angle in radians for arc marks. A value of `0` indicates up (north), increasing values proceed clockwise.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Default stroke color. This property has higher precedence than `config.color`. Set to `null` to remove stroke.\n\n__Default value:__ (None)"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOffset": {
          "anyOf": [
            {
              "description": "The offset in pixels at which to draw the group stroke and fill. If unspecified, the default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths align with the pixel grid.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "tension": {
          "anyOf": [
            {
              "description": "Depending on the interpolation type, sets the tension parameter (for line and area marks).",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text",
              "description": "Placeholder text if the `text` channel is not specified"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "theta": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "- For arc marks, the arc length in radians if theta2 is not specified, otherwise the start arc angle. (A value of 0 indicates up or “north”, increasing values proceed clockwise.)\n\n- For text marks, polar coordinate angle in radians.",
          "maximum": 360,
          "minimum": 0
        },
        "theta2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing values proceed clockwise."
        },
        "thickness": {
          "description": "Thickness of the tick mark.\n\n__Default value:__  `1`",
          "minimum": 0,
          "type": "number"
        },
        "timeUnitBandPosition": {
          "description": "Default relative band position for a time unit. If set to `0`, the marks will be positioned at the beginning of the time unit band step. If set to `0.5`, the marks will be positioned in the middle of the time unit band step.",
          "type": "number"
        },
        "timeUnitBandSize": {
          "description": "Default relative band size for a time unit. If set to `1`, the bandwidth of the marks will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be half of the time unit band step.",
          "type": "number"
        },
        "tooltip": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/TooltipContent"
            },
            {
              "$ref": "#/definitions/ExprRef"
            },
            {
              "type": "null"
            }
          ],
          "description": "The tooltip text string to show upon mouse hover or an object defining which fields should the tooltip be derived from.\n\n- If `tooltip` is `true` or `{\"content\": \"encoding\"}`, then all fields from `encoding` will be used.\n- If `tooltip` is `{\"content\": \"data\"}`, then all fields that appear in the highlighted data point will be used.\n- If set to `null` or `false`, then no tooltip will be used.\n\nSee the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for a detailed discussion about tooltip  in Vega-Lite.\n\n__Default value:__ `null`"
        },
        "url": {
          "anyOf": [
            {
              "$ref": "#/definitions/URI",
              "description": "The URL of the image file for image marks."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "description": "Width of the marks.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X coordinates of the marks, or width of horizontal `\"bar\"` and `\"area\"` without specified `x2` or `width`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "x2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "X2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"width\"` for the width of the plot."
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y coordinates of the marks, or height of vertical `\"bar\"` and `\"area\"` without specified `y2` or `height`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        },
        "y2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "Y2 coordinates for ranged `\"area\"`, `\"bar\"`, `\"rect\"`, and  `\"rule\"`.\n\nThe `value` of this channel can be a number or a string `\"height\"` for the height of the plot."
        }
      },
      "type": "object"
    },
    "TickCount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "$ref": "#/definitions/TimeInterval"
        },
        {
          "$ref": "#/definitions/TimeIntervalStep"
        }
      ]
    },
    "TimeInterval": {
      "enum": [
        "millisecond",
        "second",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "year"
      ],
      "type": "string"
    },
    "TimeIntervalStep": {
      "additionalProperties": false,
      "properties": {
        "interval": {
          "$ref": "#/definitions/TimeInterval"
        },
        "step": {
          "type": "number"
        }
      },
      "required": [
        "interval",
        "step"
      ],
      "type": "object"
    },
    "TimeLocale": {
      "additionalProperties": false,
      "description": "Locale definition for formatting dates and times.",
      "properties": {
        "date": {
          "description": "The date (%x) format specifier (e.g., \"%m/%d/%Y\").",
          "type": "string"
        },
        "dateTime": {
          "description": "The date and time (%c) format specifier (e.g., \"%a %b %e %X %Y\").",
          "type": "string"
        },
        "days": {
          "$ref": "#/definitions/Vector7<string>",
          "description": "The full names of the weekdays, starting with Sunday."
        },
        "months": {
          "$ref": "#/definitions/Vector12<string>",
          "description": "The full names of the months (starting with January)."
        },
        "periods": {
          "$ref": "#/definitions/Vector2<string>",
          "description": "The A.M. and P.M. equivalents (e.g., [\"AM\", \"PM\"])."
        },
        "shortDays": {
          "$ref": "#/definitions/Vector7<string>",
          "description": "The abbreviated names of the weekdays, starting with Sunday."
        },
        "shortMonths": {
          "$ref": "#/definitions/Vector12<string>",
          "description": "The abbreviated names of the months (starting with January)."
        },
        "time": {
          "description": "The time (%X) format specifier (e.g., \"%H:%M:%S\").",
          "type": "string"
        }
      },
      "required": [
        "dateTime",
        "date",
        "time",
        "periods",
        "days",
        "shortDays",
        "months",
        "shortMonths"
      ],
      "type": "object"
    },
    "TimeUnit": {
      "anyOf": [
        {
          "$ref": "#/definitions/SingleTimeUnit"
        },
        {
          "$ref": "#/definitions/MultiTimeUnit"
        }
      ]
    },
    "TimeUnitParams": {
      "additionalProperties": false,
      "description": "Time Unit Params for encoding predicate, which can specified if the data is  already \"binned\".",
      "properties": {
        "binned": {
          "description": "Whether the data has already been binned to this time unit. If true, Vega-Lite will only format the data, marks, and guides, without applying the timeUnit transform to re-bin the data again.",
          "type": "boolean"
        },
        "maxbins": {
          "description": "If no `unit` is specified, maxbins is used to infer time units.",
          "type": "number"
        },
        "step": {
          "description": "The number of steps between bins, in terms of the least significant unit provided.",
          "type": "number"
        },
        "unit": {
          "$ref": "#/definitions/TimeUnit",
          "description": "Defines how date-time values should be binned."
        },
        "utc": {
          "description": "True to use UTC timezone. Equivalent to using a `utc` prefixed `TimeUnit`.",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "TimeUnitTransform": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The output field to write the timeUnit value."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field to apply time unit."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitTransformParams"
            }
          ],
          "description": "The timeUnit."
        }
      },
      "required": [
        "timeUnit",
        "field",
        "as"
      ],
      "type": "object"
    },
    "TimeUnitTransformParams": {
      "additionalProperties": false,
      "properties": {
        "maxbins": {
          "description": "If no `unit` is specified, maxbins is used to infer time units.",
          "type": "number"
        },
        "step": {
          "description": "The number of steps between bins, in terms of the least significant unit provided.",
          "type": "number"
        },
        "unit": {
          "$ref": "#/definitions/TimeUnit",
          "description": "Defines how date-time values should be binned."
        },
        "utc": {
          "description": "True to use UTC timezone. Equivalent to using a `utc` prefixed `TimeUnit`.",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "TitleAnchor": {
      "enum": [
        null,
        "start",
        "middle",
        "end"
      ],
      "type": [
        "null",
        "string"
      ]
    },
    "TitleConfig": {
      "$ref": "#/definitions/BaseTitleNoValueRefs"
    },
    "TitleFrame": {
      "enum": [
        "bounds",
        "group"
      ],
      "type": "string"
    },
    "TitleOrient": {
      "enum": [
        "none",
        "left",
        "right",
        "top",
        "bottom"
      ],
      "type": "string"
    },
    "TitleParams": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "$ref": "#/definitions/Align",
          "description": "Horizontal text alignment for title text. One of `\"left\"`, `\"center\"`, or `\"right\"`."
        },
        "anchor": {
          "$ref": "#/definitions/TitleAnchor",
          "description": "The anchor position for placing the title. One of `\"start\"`, `\"middle\"`, or `\"end\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\n\n__Default value:__ `\"middle\"` for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. `\"start\"` for other composite views.\n\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. For other composite views, `anchor` is always `\"start\"`."
        },
        "angle": {
          "anyOf": [
            {
              "description": "Angle in degrees of title and subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "aria": {
          "anyOf": [
            {
              "description": "A boolean flag indicating if [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be included (SVG output only). If `false`, the \"aria-hidden\" attribute will be set on the output SVG group, removing the title from the ARIA accessibility tree.\n\n__Default value:__ `true`",
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "baseline": {
          "$ref": "#/definitions/TextBaseline",
          "description": "Vertical text baseline for title and subtitle text. One of `\"alphabetic\"` (default), `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"line-top\"`, or `\"line-bottom\"`. The `\"line-top\"` and `\"line-bottom\"` values operate similarly to `\"top\"` and `\"bottom\"`, but are calculated relative to the *lineHeight* rather than *fontSize* alone."
        },
        "color": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Text color for title text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dx": {
          "anyOf": [
            {
              "description": "Delta offset for title and subtitle text x-coordinate.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "dy": {
          "anyOf": [
            {
              "description": "Delta offset for title and subtitle text y-coordinate.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "font": {
          "anyOf": [
            {
              "description": "Font name for title text.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontSize": {
          "anyOf": [
            {
              "description": "Font size in pixels for title text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style for title text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "fontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight for title text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "frame": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "$ref": "#/definitions/TitleFrame"
                },
                {
                  "type": "string"
                }
              ],
              "description": "The reference frame for the anchor position, one of `\"bounds\"` (to anchor relative to the full bounding box) or `\"group\"` (to anchor relative to the group width or height)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "limit": {
          "anyOf": [
            {
              "description": "The maximum allowed length in pixels of title and subtitle text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "lineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line title text or title text with `\"line-top\"` or `\"line-bottom\"` baseline.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "offset": {
          "anyOf": [
            {
              "description": "The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "orient": {
          "anyOf": [
            {
              "$ref": "#/definitions/TitleOrient",
              "description": "Default title orientation (`\"top\"`, `\"bottom\"`, `\"left\"`, or `\"right\"`)"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A [mark style property](https://vega.github.io/vega-lite/docs/config.html#style) to apply to the title text mark.\n\n__Default value:__ `\"group-title\"`."
        },
        "subtitle": {
          "$ref": "#/definitions/Text",
          "description": "The subtitle Text."
        },
        "subtitleColor": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/definitions/Color"
                }
              ],
              "description": "Text color for subtitle text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFont": {
          "anyOf": [
            {
              "description": "Font name for subtitle text.",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontSize": {
          "anyOf": [
            {
              "description": "Font size in pixels for subtitle text.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontStyle": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontStyle",
              "description": "Font style for subtitle text."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleFontWeight": {
          "anyOf": [
            {
              "$ref": "#/definitions/FontWeight",
              "description": "Font weight for subtitle text. This can be either a string (e.g `\"bold\"`, `\"normal\"`) or a number (`100`, `200`, `300`, ..., `900` where `\"normal\"` = `400` and `\"bold\"` = `700`)."
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitleLineHeight": {
          "anyOf": [
            {
              "description": "Line height in pixels for multi-line subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "subtitlePadding": {
          "anyOf": [
            {
              "description": "The padding in pixels between title and subtitle text.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "text": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The title text."
        },
        "zindex": {
          "description": "The integer z-index indicating the layering of the title group relative to other axis, mark and legend groups.\n\n__Default value:__ `0`.",
          "minimum": 0,
          "type": "number"
        }
      },
      "required": [
        "text"
      ],
      "type": "object"
    },
    "TooltipContent": {
      "additionalProperties": false,
      "properties": {
        "content": {
          "enum": [
            "encoding",
            "data"
          ],
          "type": "string"
        }
      },
      "required": [
        "content"
      ],
      "type": "object"
    },
    "TopLevelConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "concat": {
          "description": "A list of views to be concatenated.",
          "items": {
            "$ref": "#/definitions/NonNormalizedSpec"
          },
          "type": "array"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        }
      },
      "required": [
        "concat"
      ],
      "type": "object"
    },
    "TopLevelHConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "hconcat": {
          "description": "A list of views to be concatenated and put into a row.",
          "items": {
            "$ref": "#/definitions/NonNormalizedSpec"
          },
          "type": "array"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "description": "The spacing in pixels between sub-views of the concat operator.\n\n__Default value__: `10`",
          "type": "number"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        }
      },
      "required": [
        "hconcat"
      ],
      "type": "object"
    },
    "TopLevelVConcatSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "description": "The spacing in pixels between sub-views of the concat operator.\n\n__Default value__: `10`",
          "type": "number"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        },
        "vconcat": {
          "description": "A list of views to be concatenated and put into a column.",
          "items": {
            "$ref": "#/definitions/NonNormalizedSpec"
          },
          "type": "array"
        }
      },
      "required": [
        "vconcat"
      ],
      "type": "object"
    },
    "TopLevelLayerSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/SharedEncoding",
          "description": "A shared key-value mapping between encoding channels and definition of fields in the underlying layers."
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The height of a visualization.\n\n- For a plot with a continuous y-field, height should be a number.\n- For a plot with either a discrete y-field or no y-field, height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step. (No y-field is equivalent to having one discrete step.)\n- To enable responsive sizing on height, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous y-field and `config.view.discreteHeight` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        },
        "layer": {
          "description": "Layer or single view specifications to be layered.\n\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed. Instead, use the [facet operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a facet.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/LayerSpec"
              },
              {
                "$ref": "#/definitions/UnitSpec"
              }
            ]
          },
          "type": "array"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of the geographic projection shared by underlying layers."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "An object defining the view background's fill and stroke.\n\n__Default value:__ none (transparent)"
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The width of a visualization.\n\n- For a plot with a continuous x-field, width should be a number.\n- For a plot with either a discrete x-field or no x-field, width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step. (No x-field is equivalent to having one discrete step.)\n- To enable responsive sizing on width, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous x-field and `config.view.discreteWidth` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        }
      },
      "required": [
        "layer"
      ],
      "type": "object"
    },
    "TopLevelRepeatSpec": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
              "format": "uri",
              "type": "string"
            },
            "align": {
              "anyOf": [
                {
                  "$ref": "#/definitions/LayoutAlign"
                },
                {
                  "$ref": "#/definitions/RowCol<LayoutAlign>"
                }
              ],
              "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
            },
            "autosize": {
              "anyOf": [
                {
                  "$ref": "#/definitions/AutosizeType"
                },
                {
                  "$ref": "#/definitions/AutoSizeParams"
                }
              ],
              "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
            },
            "background": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Color"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
            },
            "bounds": {
              "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
              "enum": [
                "full",
                "flush"
              ],
              "type": "string"
            },
            "center": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/RowCol<boolean>"
                }
              ],
              "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
            },
            "columns": {
              "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
              "type": "number"
            },
            "config": {
              "$ref": "#/definitions/Config",
              "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
            },
            "data": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Data"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
            },
            "datasets": {
              "$ref": "#/definitions/Datasets",
              "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
            },
            "description": {
              "description": "Description of this mark for commenting purpose.",
              "type": "string"
            },
            "name": {
              "description": "Name of the visualization for later reference.",
              "type": "string"
            },
            "padding": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Padding"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
            },
            "params": {
              "description": "Dynamic variables or selections that parameterize a visualization.",
              "items": {
                "$ref": "#/definitions/TopLevelParameter"
              },
              "type": "array"
            },
            "repeat": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "$ref": "#/definitions/RepeatMapping"
                }
              ],
              "description": "Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If `\"repeat\"` is an array, the field can be referred to as `{\"repeat\": \"repeat\"}`. The repeated views are laid out in a wrapped row. You can set the number of columns to control the wrapping. 2) An object that maps `\"row\"` and/or `\"column\"` to the listed fields to be repeated along the particular orientations. The objects `{\"repeat\": \"row\"}` and `{\"repeat\": \"column\"}` can be used to refer to the repeated field respectively."
            },
            "resolve": {
              "$ref": "#/definitions/Resolve",
              "description": "Scale, axis, and legend resolutions for view composition specifications."
            },
            "spacing": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/RowCol<number>"
                }
              ],
              "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
            },
            "spec": {
              "$ref": "#/definitions/NonNormalizedSpec",
              "description": "A specification of the view that gets repeated."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "$ref": "#/definitions/TitleParams"
                }
              ],
              "description": "Title for the plot."
            },
            "transform": {
              "description": "An array of data transformations such as filter and new field calculation.",
              "items": {
                "$ref": "#/definitions/Transform"
              },
              "type": "array"
            },
            "usermeta": {
              "$ref": "#/definitions/Dict",
              "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
            }
          },
          "required": [
            "repeat",
            "spec"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "$schema": {
              "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
              "format": "uri",
              "type": "string"
            },
            "align": {
              "anyOf": [
                {
                  "$ref": "#/definitions/LayoutAlign"
                },
                {
                  "$ref": "#/definitions/RowCol<LayoutAlign>"
                }
              ],
              "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
            },
            "autosize": {
              "anyOf": [
                {
                  "$ref": "#/definitions/AutosizeType"
                },
                {
                  "$ref": "#/definitions/AutoSizeParams"
                }
              ],
              "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
            },
            "background": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Color"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
            },
            "bounds": {
              "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
              "enum": [
                "full",
                "flush"
              ],
              "type": "string"
            },
            "center": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "$ref": "#/definitions/RowCol<boolean>"
                }
              ],
              "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
            },
            "columns": {
              "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
              "type": "number"
            },
            "config": {
              "$ref": "#/definitions/Config",
              "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
            },
            "data": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Data"
                },
                {
                  "type": "null"
                }
              ],
              "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
            },
            "datasets": {
              "$ref": "#/definitions/Datasets",
              "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
            },
            "description": {
              "description": "Description of this mark for commenting purpose.",
              "type": "string"
            },
            "name": {
              "description": "Name of the visualization for later reference.",
              "type": "string"
            },
            "padding": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Padding"
                },
                {
                  "$ref": "#/definitions/ExprRef"
                }
              ],
              "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
            },
            "params": {
              "description": "Dynamic variables or selections that parameterize a visualization.",
              "items": {
                "$ref": "#/definitions/TopLevelParameter"
              },
              "type": "array"
            },
            "repeat": {
              "$ref": "#/definitions/LayerRepeatMapping",
              "description": "Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If `\"repeat\"` is an array, the field can be referred to as `{\"repeat\": \"repeat\"}`. The repeated views are laid out in a wrapped row. You can set the number of columns to control the wrapping. 2) An object that maps `\"row\"` and/or `\"column\"` to the listed fields to be repeated along the particular orientations. The objects `{\"repeat\": \"row\"}` and `{\"repeat\": \"column\"}` can be used to refer to the repeated field respectively."
            },
            "resolve": {
              "$ref": "#/definitions/Resolve",
              "description": "Scale, axis, and legend resolutions for view composition specifications."
            },
            "spacing": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "$ref": "#/definitions/RowCol<number>"
                }
              ],
              "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
            },
            "spec": {
              "anyOf": [
                {
                  "$ref": "#/definitions/LayerSpec"
                },
                {
                  "$ref": "#/definitions/UnitSpecWithFrame"
                }
              ],
              "description": "A specification of the view that gets repeated."
            },
            "title": {
              "anyOf": [
                {
                  "$ref": "#/definitions/Text"
                },
                {
                  "$ref": "#/definitions/TitleParams"
                }
              ],
              "description": "Title for the plot."
            },
            "transform": {
              "description": "An array of data transformations such as filter and new field calculation.",
              "items": {
                "$ref": "#/definitions/Transform"
              },
              "type": "array"
            },
            "usermeta": {
              "$ref": "#/definitions/Dict",
              "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
            }
          },
          "required": [
            "repeat",
            "spec"
          ],
          "type": "object"
        }
      ]
    },
    "TopLevelFacetSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "columns": {
          "description": "The number of columns to include in the view composition layout.\n\n__Default value__: `undefined` -- An infinite number of columns (a single row) will be assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel (for `facet` and `repeat`).\n\n__Note__:\n\n1) This property is only for:\n- the general (wrappable) `concat` operator (not `hconcat`/`vconcat`)\n- the `facet` and `repeat` operator with one field/repetition definition (without row/column nesting)\n\n2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using the `row` channel (for `facet` and `repeat`).",
          "type": "number"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "facet": {
          "anyOf": [
            {
              "$ref": "#/definitions/FacetFieldDef"
            },
            {
              "$ref": "#/definitions/FacetMapping"
            }
          ],
          "description": "Definition for how to facet the data. One of: 1) [a field definition for faceting the plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An object that maps `row` and `column` channels to their field definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)"
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "Dynamic variables or selections that parameterize a visualization.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "spec": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayerSpec"
            },
            {
              "$ref": "#/definitions/UnitSpecWithFrame"
            }
          ],
          "description": "A specification of the view that gets faceted."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        }
      },
      "required": [
        "data",
        "facet",
        "spec"
      ],
      "type": "object"
    },
    "TopLevelParameter": {
      "anyOf": [
        {
          "$ref": "#/definitions/VariableParameter"
        },
        {
          "$ref": "#/definitions/TopLevelSelectionParameter"
        }
      ]
    },
    "TopLevelSelectionParameter": {
      "additionalProperties": false,
      "properties": {
        "bind": {
          "anyOf": [
            {
              "$ref": "#/definitions/Binding"
            },
            {
              "additionalProperties": {
                "$ref": "#/definitions/Binding"
              },
              "type": "object"
            },
            {
              "$ref": "#/definitions/LegendBinding"
            },
            {
              "const": "scales",
              "type": "string"
            }
          ],
          "description": "When set, a selection is populated by input elements (also known as dynamic query widgets) or by interacting with the corresponding legend. Direct manipulation interaction is disabled by default; to re-enable it, set the selection's [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties) property.\n\nLegend bindings are restricted to selections that only specify a single field or encoding.\n\nQuery widget binding takes the form of Vega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind) or can be a mapping between projected field/encodings and binding definitions.\n\n__See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation."
        },
        "name": {
          "$ref": "#/definitions/ParameterName",
          "description": "Required. A unique name for the selection parameter. Selection names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \"$\", or \"_\") and may not start with a digit. Reserved keywords that may not be used as parameter names are \"datum\", \"event\", \"item\", and \"parent\"."
        },
        "select": {
          "anyOf": [
            {
              "$ref": "#/definitions/SelectionType"
            },
            {
              "$ref": "#/definitions/PointSelectionConfig"
            },
            {
              "$ref": "#/definitions/IntervalSelectionConfig"
            }
          ],
          "description": "Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\n\n- `\"point\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\n- `\"interval\"` -- to select a continuous range of data values on `drag`."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/SelectionInit"
            },
            {
              "items": {
                "$ref": "#/definitions/SelectionInitMapping"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/SelectionInitIntervalMapping"
            }
          ],
          "description": "Initialize the selection with a mapping between [projected channels or field names](https://vega.github.io/vega-lite/docs/selection.html#project) and initial values.\n\n__See also:__ [`init`](https://vega.github.io/vega-lite/docs/value.html) documentation."
        },
        "views": {
          "description": "By default, top-level selections are applied to every view in the visualization. If this property is specified, selections will only be applied to views with the given names.",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "required": [
        "name",
        "select"
      ],
      "type": "object"
    },
    "TopLevelSpec": {
      "anyOf": [
        {
          "$ref": "#/definitions/TopLevelUnitSpec"
        },
        {
          "$ref": "#/definitions/TopLevelFacetSpec"
        },
        {
          "$ref": "#/definitions/TopLevelLayerSpec"
        },
        {
          "$ref": "#/definitions/TopLevelRepeatSpec"
        },
        {
          "$ref": "#/definitions/TopLevelConcatSpec"
        },
        {
          "$ref": "#/definitions/TopLevelVConcatSpec"
        },
        {
          "$ref": "#/definitions/TopLevelHConcatSpec"
        }
      ],
      "description": "A Vega-Lite top-level specification. This is the root class for all Vega-Lite specifications. (The json schema is generated from this type.)"
    },
    "TopLevelUnitSpec": {
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "description": "URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v5.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",
          "format": "uri",
          "type": "string"
        },
        "align": {
          "anyOf": [
            {
              "$ref": "#/definitions/LayoutAlign"
            },
            {
              "$ref": "#/definitions/RowCol<LayoutAlign>"
            }
          ],
          "description": "The alignment to apply to grid rows and columns. The supported string values are `\"all\"`, `\"each\"`, and `\"none\"`.\n\n- For `\"none\"`, a flow layout will be used, in which adjacent subviews are simply placed one after the other.\n- For `\"each\"`, subviews will be aligned into a clean grid structure, but each row or column may be of variable size.\n- For `\"all\"`, subviews will be aligned and each row or column will be sized identically based on the maximum observed size. String values for this property will be applied to both grid rows and columns.\n\nAlternatively, an object value of the form `{\"row\": string, \"column\": string}` can be used to supply different alignments for rows and columns.\n\n__Default value:__ `\"all\"`."
        },
        "autosize": {
          "anyOf": [
            {
              "$ref": "#/definitions/AutosizeType"
            },
            {
              "$ref": "#/definitions/AutoSizeParams"
            }
          ],
          "description": "How the visualization size should be determined. If a string, should be one of `\"pad\"`, `\"fit\"` or `\"none\"`. Object values can additionally specify parameters for content sizing and automatic resizing.\n\n__Default value__: `pad`"
        },
        "background": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "CSS color property to use as the background of the entire view.\n\n__Default value:__ `\"white\"`"
        },
        "bounds": {
          "description": "The bounds calculation method to use for determining the extent of a sub-plot. One of `full` (the default) or `flush`.\n\n- If set to `full`, the entire calculated bounds (including axes, title, and legend) will be used.\n- If set to `flush`, only the specified width and height values for the sub-view will be used. The `flush` setting can be useful when attempting to place sub-plots without axes or legends into a uniform grid structure.\n\n__Default value:__ `\"full\"`",
          "enum": [
            "full",
            "flush"
          ],
          "type": "string"
        },
        "center": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/RowCol<boolean>"
            }
          ],
          "description": "Boolean flag indicating if subviews should be centered relative to their respective rows or columns.\n\nAn object value of the form `{\"row\": boolean, \"column\": boolean}` can be used to supply different centering values for rows and columns.\n\n__Default value:__ `false`"
        },
        "config": {
          "$ref": "#/definitions/Config",
          "description": "Vega-Lite configuration object. This property can only be defined at the top-level of a specification."
        },
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "datasets": {
          "$ref": "#/definitions/Datasets",
          "description": "A global data store for named datasets. This is a mapping from names to inline datasets. This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/FacetedEncoding",
          "description": "A key-value mapping between encoding channels and definition of fields."
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The height of a visualization.\n\n- For a plot with a continuous y-field, height should be a number.\n- For a plot with either a discrete y-field or no y-field, height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step. (No y-field is equivalent to having one discrete step.)\n- To enable responsive sizing on height, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous y-field and `config.view.discreteHeight` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        },
        "mark": {
          "$ref": "#/definitions/AnyMark",
          "description": "A string describing the mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"rule\"`, `\"geoshape\"`, and `\"text\"`) or a [mark definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def)."
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "padding": {
          "anyOf": [
            {
              "$ref": "#/definitions/Padding"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. If an object, the value should have the format `{\"left\": 5, \"top\": 5, \"right\": 5, \"bottom\": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`"
        },
        "params": {
          "description": "An array of parameters that may either be simple variables, or more complex selections that map user input to data queries.",
          "items": {
            "$ref": "#/definitions/TopLevelParameter"
          },
          "type": "array"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of geographic projection, which will be applied to `shape` path for `\"geoshape\"` marks and to `latitude` and `\"longitude\"` channels for other marks."
        },
        "resolve": {
          "$ref": "#/definitions/Resolve",
          "description": "Scale, axis, and legend resolutions for view composition specifications."
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/RowCol<number>"
            }
          ],
          "description": "The spacing in pixels between sub-views of the composition operator. An object of the form `{\"row\": number, \"column\": number}` can be used to set different spacing values for rows and columns.\n\n__Default value__: Depends on `\"spacing\"` property of [the view composition configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by default)"
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "usermeta": {
          "$ref": "#/definitions/Dict",
          "description": "Optional metadata that will be passed to Vega. This object is completely ignored by Vega and Vega-Lite and can be used for custom metadata."
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "An object defining the view background's fill and stroke.\n\n__Default value:__ none (transparent)"
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The width of a visualization.\n\n- For a plot with a continuous x-field, width should be a number.\n- For a plot with either a discrete x-field or no x-field, width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step. (No x-field is equivalent to having one discrete step.)\n- To enable responsive sizing on width, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous x-field and `config.view.discreteWidth` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        }
      },
      "required": [
        "data",
        "mark"
      ],
      "type": "object"
    },
    "TopoDataFormat": {
      "additionalProperties": false,
      "properties": {
        "feature": {
          "description": "The name of the TopoJSON object set to convert to a GeoJSON feature collection. For example, in a map of the world, there may be an object set named `\"countries\"`. Using the feature property, we can extract this set and generate a GeoJSON feature object for each country.",
          "type": "string"
        },
        "mesh": {
          "description": "The name of the TopoJSON object set to convert to mesh. Similar to the `feature` option, `mesh` extracts a named TopoJSON object set.  Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features. Extracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties.",
          "type": "string"
        },
        "parse": {
          "anyOf": [
            {
              "$ref": "#/definitions/Parse"
            },
            {
              "type": "null"
            }
          ],
          "description": "If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\"number\"`, `\"boolean\"`, `\"date\"`, or null (do not parse the field)). For example, `\"parse\": {\"modified_on\": \"date\"}` parses the `modified_on` field in each input record a Date value.\n\nFor `\"date\"`, we parse data based using JavaScript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \"date:'%m%d%Y'\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \"utc:'%m%d%Y'\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"
        },
        "type": {
          "const": "topojson",
          "description": "Type of input data: `\"json\"`, `\"csv\"`, `\"tsv\"`, `\"dsv\"`.\n\n__Default value:__  The default format type is determined by the extension of the file URL. If no extension is detected, `\"json\"` will be used by default.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "Transform": {
      "anyOf": [
        {
          "$ref": "#/definitions/AggregateTransform"
        },
        {
          "$ref": "#/definitions/BinTransform"
        },
        {
          "$ref": "#/definitions/CalculateTransform"
        },
        {
          "$ref": "#/definitions/DensityTransform"
        },
        {
          "$ref": "#/definitions/ExtentTransform"
        },
        {
          "$ref": "#/definitions/FilterTransform"
        },
        {
          "$ref": "#/definitions/FlattenTransform"
        },
        {
          "$ref": "#/definitions/FoldTransform"
        },
        {
          "$ref": "#/definitions/ImputeTransform"
        },
        {
          "$ref": "#/definitions/JoinAggregateTransform"
        },
        {
          "$ref": "#/definitions/LoessTransform"
        },
        {
          "$ref": "#/definitions/LookupTransform"
        },
        {
          "$ref": "#/definitions/QuantileTransform"
        },
        {
          "$ref": "#/definitions/RegressionTransform"
        },
        {
          "$ref": "#/definitions/TimeUnitTransform"
        },
        {
          "$ref": "#/definitions/SampleTransform"
        },
        {
          "$ref": "#/definitions/StackTransform"
        },
        {
          "$ref": "#/definitions/WindowTransform"
        },
        {
          "$ref": "#/definitions/PivotTransform"
        }
      ]
    },
    "Type": {
      "description": "Data type based on level of measurement",
      "enum": [
        "quantitative",
        "ordinal",
        "temporal",
        "nominal",
        "geojson"
      ],
      "type": "string"
    },
    "TypeForShape": {
      "enum": [
        "nominal",
        "ordinal",
        "geojson"
      ],
      "type": "string"
    },
    "TypedFieldDef": {
      "additionalProperties": false,
      "description": "Definition object for a data field, its type and transformation of an encoding channel.",
      "properties": {
        "aggregate": {
          "$ref": "#/definitions/Aggregate",
          "description": "Aggregation function for the field (e.g., `\"mean\"`, `\"sum\"`, `\"median\"`, `\"min\"`, `\"max\"`, `\"count\"`).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html) documentation."
        },
        "bandPosition": {
          "description": "Relative position on a band of a stacked, binned, time unit, or band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "bin": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/BinParams"
            },
            {
              "const": "binned",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A flag for binning a `quantitative` field, [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters), or indicating that the data for `x` or `y` channel are binned before they are imported into Vega-Lite (`\"binned\"`).\n\n- If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html#bin-parameters) will be applied.\n\n- If `\"binned\"`, this indicates that the data for the `x` (or `y`) channel are already binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust the axis ticks based on the bin step, you can also set the axis's [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.\n\n__Default value:__ `false`\n\n__See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation."
        },
        "field": {
          "$ref": "#/definitions/Field",
          "description": "__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\n\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\n\n__Notes:__ 1)  Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\"field\": \"foo.bar\"` and `\"field\": \"foo['bar']\"`). If field names contain dots or brackets but are not nested, you can use `\\\\` to escape dots and brackets (e.g., `\"a\\\\.b\"` and `\"a\\\\[0\\\\]\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`."
        },
        "timeUnit": {
          "anyOf": [
            {
              "$ref": "#/definitions/TimeUnit"
            },
            {
              "$ref": "#/definitions/BinnedTimeUnit"
            },
            {
              "$ref": "#/definitions/TimeUnitParams"
            }
          ],
          "description": "Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).\n\n__Default value:__ `undefined` (None)\n\n__See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html) documentation."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "type": "null"
            }
          ],
          "description": "A title for the field. If `null`, the title will be removed.\n\n__Default value:__  derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `\"Sum of Profit\"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `\"Profit (binned)\"`, `\"Transaction Date (year-month)\"`). Otherwise, the title is simply the field name.\n\n__Notes__:\n\n1) You can customize the default field title format by providing the [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config) property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/usage/compile.html#field-title).\n\n2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used."
        },
        "type": {
          "$ref": "#/definitions/StandardType",
          "description": "The type of measurement (`\"quantitative\"`, `\"temporal\"`, `\"ordinal\"`, or `\"nominal\"`) for the encoded field or constant value (`datum`). It can also be a `\"geojson\"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).\n\nVega-Lite automatically infers data types in many cases as discussed below. However, type is required for a field if: (1) the field is not nominal and the field encoding has no specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort` order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin` or `timeUnit`.\n\n__Default value:__\n\n1) For a data `field`, `\"nominal\"` is the default data type unless the field encoding has `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the following criteria:\n- `\"quantitative\"` is the default type if (1) the encoded field contains `bin` or `aggregate` except `\"argmin\"` and `\"argmax\"`, (2) the encoding channel is `latitude` or `longitude` channel or (3) if the specified scale type is [a quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type).\n- `\"temporal\"` is the default type if (1) the encoded field contains `timeUnit` or (2) the specified scale type is a time or utc scale\n- `\"ordinal\"` is the default type if (1) the encoded field contains a [custom `sort` order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2) the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is `order`.\n\n2) For a constant value in data domain (`datum`):\n- `\"quantitative\"` if the datum is a number\n- `\"nominal\"` if the datum is a string\n- `\"temporal\"` if the datum is [a date time object](https://vega.github.io/vega-lite/docs/datetime.html)\n\n__Note:__\n- Data `type` describes the semantics of the data rather than the primitive data types (number, string, etc.). The same primitive data type can have different types of measurement. For example, numeric data can represent quantitative, ordinal, or nominal data.\n- Data values for a temporal field can be either a date-time string (e.g., `\"2015-03-07 12:32:17\"`, `\"17:01\"`, `\"2015-03-16\"`. `\"2015\"`) or a timestamp number (e.g., `1552199579097`).\n- When using with [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be either `\"quantitative\"` (for using a linear bin scale) or [`\"ordinal\"` (for using an ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type` property can be either `\"temporal\"` (default, for using a temporal scale) or [`\"ordinal\"` (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).\n- When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html), the `type` property refers to the post-aggregation data type. For example, we can calculate count `distinct` of a categorical field `\"cat\"` using `{\"aggregate\": \"distinct\", \"field\": \"cat\"}`. The `\"type\"` of the aggregate output is `\"quantitative\"`.\n- Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must have exactly the same type as their primary channels (e.g., `x`, `y`).\n\n__See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation."
        }
      },
      "type": "object"
    },
    "URI": {
      "format": "uri-reference",
      "type": "string"
    },
    "UnitSpec": {
      "$ref": "#/definitions/GenericUnitSpec<Encoding,AnyMark>",
      "description": "A unit specification, which can contain either [primitive marks or composite marks](https://vega.github.io/vega-lite/docs/mark.html#types)."
    },
    "UnitSpecWithFrame": {
      "additionalProperties": false,
      "properties": {
        "data": {
          "anyOf": [
            {
              "$ref": "#/definitions/Data"
            },
            {
              "type": "null"
            }
          ],
          "description": "An object describing the data source. Set to `null` to ignore the parent's data source. If no data is set, it is derived from the parent."
        },
        "description": {
          "description": "Description of this mark for commenting purpose.",
          "type": "string"
        },
        "encoding": {
          "$ref": "#/definitions/Encoding",
          "description": "A key-value mapping between encoding channels and definition of fields."
        },
        "height": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The height of a visualization.\n\n- For a plot with a continuous y-field, height should be a number.\n- For a plot with either a discrete y-field or no y-field, height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step. (No y-field is equivalent to having one discrete step.)\n- To enable responsive sizing on height, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous y-field and `config.view.discreteHeight` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        },
        "mark": {
          "$ref": "#/definitions/AnyMark",
          "description": "A string describing the mark type (one of `\"bar\"`, `\"circle\"`, `\"square\"`, `\"tick\"`, `\"line\"`, `\"area\"`, `\"point\"`, `\"rule\"`, `\"geoshape\"`, and `\"text\"`) or a [mark definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def)."
        },
        "name": {
          "description": "Name of the visualization for later reference.",
          "type": "string"
        },
        "params": {
          "description": "An array of parameters that may either be simple variables, or more complex selections that map user input to data queries.",
          "items": {
            "$ref": "#/definitions/SelectionParameter"
          },
          "type": "array"
        },
        "projection": {
          "$ref": "#/definitions/Projection",
          "description": "An object defining properties of geographic projection, which will be applied to `shape` path for `\"geoshape\"` marks and to `latitude` and `\"longitude\"` channels for other marks."
        },
        "title": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/TitleParams"
            }
          ],
          "description": "Title for the plot."
        },
        "transform": {
          "description": "An array of data transformations such as filter and new field calculation.",
          "items": {
            "$ref": "#/definitions/Transform"
          },
          "type": "array"
        },
        "view": {
          "$ref": "#/definitions/ViewBackground",
          "description": "An object defining the view background's fill and stroke.\n\n__Default value:__ none (transparent)"
        },
        "width": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "container",
              "type": "string"
            },
            {
              "$ref": "#/definitions/Step"
            }
          ],
          "description": "The width of a visualization.\n\n- For a plot with a continuous x-field, width should be a number.\n- For a plot with either a discrete x-field or no x-field, width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step. (No x-field is equivalent to having one discrete step.)\n- To enable responsive sizing on width, it should be set to `\"container\"`.\n\n__Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous x-field and `config.view.discreteWidth` otherwise.\n\n__Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view and the `\"container\"` option cannot be used.\n\n__See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation."
        }
      },
      "required": [
        "mark"
      ],
      "type": "object"
    },
    "UrlData": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "$ref": "#/definitions/DataFormat",
          "description": "An object that specifies the format for parsing the data."
        },
        "name": {
          "description": "Provide a placeholder name and bind data at runtime.",
          "type": "string"
        },
        "url": {
          "description": "An URL from which to load the data set. Use the `format.type` property to ensure the loaded data is correctly parsed.",
          "type": "string"
        }
      },
      "required": [
        "url"
      ],
      "type": "object"
    },
    "UtcMultiTimeUnit": {
      "enum": [
        "utcyearquarter",
        "utcyearquartermonth",
        "utcyearmonth",
        "utcyearmonthdate",
        "utcyearmonthdatehours",
        "utcyearmonthdatehoursminutes",
        "utcyearmonthdatehoursminutesseconds",
        "utcyearweek",
        "utcyearweekday",
        "utcyearweekdayhours",
        "utcyearweekdayhoursminutes",
        "utcyearweekdayhoursminutesseconds",
        "utcyeardayofyear",
        "utcquartermonth",
        "utcmonthdate",
        "utcmonthdatehours",
        "utcmonthdatehoursminutes",
        "utcmonthdatehoursminutesseconds",
        "utcweekday",
        "utcweeksdayhours",
        "utcweekdayhoursminutes",
        "utcweekdayhoursminutesseconds",
        "utcdayhours",
        "utcdayhoursminutes",
        "utcdayhoursminutesseconds",
        "utchoursminutes",
        "utchoursminutesseconds",
        "utcminutesseconds",
        "utcsecondsmilliseconds"
      ],
      "type": "string"
    },
    "UtcSingleTimeUnit": {
      "enum": [
        "utcyear",
        "utcquarter",
        "utcmonth",
        "utcweek",
        "utcday",
        "utcdayofyear",
        "utcdate",
        "utchours",
        "utcminutes",
        "utcseconds",
        "utcmilliseconds"
      ],
      "type": "string"
    },
    "ValueDef<(number|\"width\"|\"height\"|ExprRef)>": {
      "additionalProperties": false,
      "description": "Definition object for a constant value (primitive value or gradient definition) of an encoding channel.",
      "properties": {
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "const": "width",
              "type": "string"
            },
            {
              "const": "height",
              "type": "string"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "required": [
        "value"
      ],
      "type": "object"
    },
    "ValueDef<number>": {
      "additionalProperties": false,
      "description": "Definition object for a constant value (primitive value or gradient definition) of an encoding channel.",
      "properties": {
        "value": {
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity).",
          "type": "number"
        }
      },
      "required": [
        "value"
      ],
      "type": "object"
    },
    "ValueDefWithCondition<MarkPropFieldOrDatumDef,(Gradient|string|null)>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Gradient|string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Gradient"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<MarkPropFieldOrDatumDef,(string|null)>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<MarkPropFieldOrDatumDef,number>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<MarkPropFieldOrDatumDef,number[]>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(number[]|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<MarkPropFieldOrDatumDef<TypeForShape>,(string|null)>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalMarkPropFieldOrDatumDef<TypeForShape>"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(string|null|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "ValueDefWithCondition<StringFieldDef,Text>": {
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "condition": {
          "anyOf": [
            {
              "$ref": "#/definitions/ConditionalStringFieldDef"
            },
            {
              "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
            },
            {
              "items": {
                "$ref": "#/definitions/ConditionalValueDef<(Text|ExprRef)>"
              },
              "type": "array"
            }
          ],
          "description": "A field definition or one or more value definition(s) with a parameter predicate."
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/definitions/Text"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "A constant value in visual domain (e.g., `\"red\"` / `\"#0099ff\"` / [gradient definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values between `0` to `1` for opacity)."
        }
      },
      "type": "object"
    },
    "VariableParameter": {
      "additionalProperties": false,
      "properties": {
        "bind": {
          "$ref": "#/definitions/Binding",
          "description": "Binds the parameter to an external input element such as a slider, selection list or radio button group."
        },
        "expr": {
          "$ref": "#/definitions/Expr",
          "description": "An expression for the value of the parameter. This expression may include other parameters, in which case the parameter will automatically update in response to upstream parameter changes."
        },
        "name": {
          "$ref": "#/definitions/ParameterName",
          "description": "A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \"$\", or \"_\") and may not start with a digit. Reserved keywords that may not be used as parameter names are \"datum\", \"event\", \"item\", and \"parent\"."
        },
        "value": {
          "description": "The [initial value](http://vega.github.io/vega-lite/docs/value.html) of the parameter.\n\n__Default value:__ `undefined`"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "Vector10<string>": {
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "minItems": 10,
      "type": "array"
    },
    "Vector12<string>": {
      "items": {
        "type": "string"
      },
      "maxItems": 12,
      "minItems": 12,
      "type": "array"
    },
    "Vector2<DateTime>": {
      "items": {
        "$ref": "#/definitions/DateTime"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "Vector2<Vector2<number>>": {
      "items": {
        "$ref": "#/definitions/Vector2<number>"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "Vector2<boolean>": {
      "items": {
        "type": "boolean"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "Vector2<number>": {
      "items": {
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "Vector2<string>": {
      "items": {
        "type": "string"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "Vector3<number>": {
      "items": {
        "type": "number"
      },
      "maxItems": 3,
      "minItems": 3,
      "type": "array"
    },
    "Vector7<string>": {
      "items": {
        "type": "string"
      },
      "maxItems": 7,
      "minItems": 7,
      "type": "array"
    },
    "ViewBackground": {
      "additionalProperties": false,
      "properties": {
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "$ref": "#/definitions/Cursor",
          "description": "The mouse cursor used over the view. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color.\n\n__Default value:__ `undefined`"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color.\n\n__Default value:__ `\"#ddd\"`"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "style": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "A string or array of strings indicating the name of custom styles to apply to the view background. A style is a named collection of mark property defaults defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles.\n\n__Default value:__ `\"cell\"` __Note:__ Any specified view background properties will augment the default style."
        }
      },
      "type": "object"
    },
    "ViewConfig": {
      "additionalProperties": false,
      "properties": {
        "clip": {
          "description": "Whether the view should be clipped.",
          "type": "boolean"
        },
        "continuousHeight": {
          "description": "The default height when the plot has a continuous y-field for x or latitude, or has arc marks.\n\n__Default value:__ `200`",
          "type": "number"
        },
        "continuousWidth": {
          "description": "The default width when the plot has a continuous field for x or longitude, or has arc marks.\n\n__Default value:__ `200`",
          "type": "number"
        },
        "cornerRadius": {
          "anyOf": [
            {
              "description": "The radius in pixels of rounded rectangles or arcs' corners.\n\n__Default value:__ `0`",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "cursor": {
          "$ref": "#/definitions/Cursor",
          "description": "The mouse cursor used over the view. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used."
        },
        "discreteHeight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "additionalProperties": false,
              "properties": {
                "step": {
                  "type": "number"
                }
              },
              "required": [
                "step"
              ],
              "type": "object"
            }
          ],
          "description": "The default height when the plot has non arc marks and either a discrete y-field or no y-field. The height can be either a number indicating a fixed height or an object in the form of `{step: number}` defining the height per discrete step.\n\n__Default value:__ a step size based on `config.view.step`."
        },
        "discreteWidth": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "additionalProperties": false,
              "properties": {
                "step": {
                  "type": "number"
                }
              },
              "required": [
                "step"
              ],
              "type": "object"
            }
          ],
          "description": "The default width when the plot has non-arc marks and either a discrete x-field or no x-field. The width can be either a number indicating a fixed width or an object in the form of `{step: number}` defining the width per discrete step.\n\n__Default value:__ a step size based on `config.view.step`."
        },
        "fill": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The fill color.\n\n__Default value:__ `undefined`"
        },
        "fillOpacity": {
          "anyOf": [
            {
              "description": "The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",
          "maximum": 1,
          "minimum": 0
        },
        "step": {
          "description": "Default step size for x-/y- discrete fields.",
          "type": "number"
        },
        "stroke": {
          "anyOf": [
            {
              "$ref": "#/definitions/Color"
            },
            {
              "type": "null"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ],
          "description": "The stroke color.\n\n__Default value:__ `\"#ddd\"`"
        },
        "strokeCap": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeCap",
              "description": "The stroke cap for line ending style. One of `\"butt\"`, `\"round\"`, or `\"square\"`.\n\n__Default value:__ `\"butt\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDash": {
          "anyOf": [
            {
              "description": "An array of alternating stroke, space lengths for creating dashed or dotted lines.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeDashOffset": {
          "anyOf": [
            {
              "description": "The offset (in pixels) into which to begin drawing with the stroke dash array.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeJoin": {
          "anyOf": [
            {
              "$ref": "#/definitions/StrokeJoin",
              "description": "The stroke line join method. One of `\"miter\"`, `\"round\"` or `\"bevel\"`.\n\n__Default value:__ `\"miter\"`"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeMiterLimit": {
          "anyOf": [
            {
              "description": "The miter limit at which to bevel a line join.",
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeOpacity": {
          "anyOf": [
            {
              "description": "The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        },
        "strokeWidth": {
          "anyOf": [
            {
              "description": "The stroke width, in pixels.",
              "minimum": 0,
              "type": "number"
            },
            {
              "$ref": "#/definitions/ExprRef"
            }
          ]
        }
      },
      "type": "object"
    },
    "WindowEventType": {
      "anyOf": [
        {
          "$ref": "#/definitions/EventType"
        },
        {
          "type": "string"
        }
      ]
    },
    "WindowFieldDef": {
      "additionalProperties": false,
      "properties": {
        "as": {
          "$ref": "#/definitions/FieldName",
          "description": "The output name for the window operation."
        },
        "field": {
          "$ref": "#/definitions/FieldName",
          "description": "The data field for which to compute the aggregate or window function. This can be omitted for window functions that do not operate over a field such as `\"count\"`, `\"rank\"`, `\"dense_rank\"`."
        },
        "op": {
          "anyOf": [
            {
              "$ref": "#/definitions/AggregateOp"
            },
            {
              "$ref": "#/definitions/WindowOnlyOp"
            }
          ],
          "description": "The window or aggregation operation to apply within a window (e.g., `\"rank\"`, `\"lead\"`, `\"sum\"`, `\"average\"` or `\"count\"`). See the list of all supported operations [here](https://vega.github.io/vega-lite/docs/window.html#ops)."
        },
        "param": {
          "description": "Parameter values for the window functions. Parameter values can be omitted for operations that do not accept a parameter.\n\nSee the list of all supported operations and their parameters [here](https://vega.github.io/vega-lite/docs/transforms/window.html).",
          "type": "number"
        }
      },
      "required": [
        "op",
        "as"
      ],
      "type": "object"
    },
    "WindowOnlyOp": {
      "enum": [
        "row_number",
        "rank",
        "dense_rank",
        "percent_rank",
        "cume_dist",
        "ntile",
        "lag",
        "lead",
        "first_value",
        "last_value",
        "nth_value"
      ],
      "type": "string"
    },
    "WindowTransform": {
      "additionalProperties": false,
      "properties": {
        "frame": {
          "description": "A frame specification as a two-element array indicating how the sliding window should proceed. The array entries should either be a number indicating the offset from the current data object, or null to indicate unbounded rows preceding or following the current data object. The default value is `[null, 0]`, indicating that the sliding window includes the current object and all preceding objects. The value `[-5, 5]` indicates that the window should include five objects preceding and five objects following the current object. Finally, `[null, null]` indicates that the window frame should always include all data objects. If you this frame and want to assign the same value to add objects, you can use the simpler [join aggregate transform](https://vega.github.io/vega-lite/docs/joinaggregate.html). The only operators affected are the aggregation operations and the `first_value`, `last_value`, and `nth_value` window operations. The other window operations are not affected by this.\n\n__Default value:__:  `[null, 0]` (includes the current object and all preceding objects)",
          "items": {
            "type": [
              "null",
              "number"
            ]
          },
          "type": "array"
        },
        "groupby": {
          "description": "The data fields for partitioning the data objects into separate windows. If unspecified, all data points will be in a single window.",
          "items": {
            "$ref": "#/definitions/FieldName"
          },
          "type": "array"
        },
        "ignorePeers": {
          "description": "Indicates if the sliding window frame should ignore peer values (data that are considered identical by the sort criteria). The default is false, causing the window frame to expand to include all peer values. If set to true, the window frame will be defined by offset values only. This setting only affects those operations that depend on the window frame, namely aggregation operations and the first_value, last_value, and nth_value window operations.\n\n__Default value:__ `false`",
          "type": "boolean"
        },
        "sort": {
          "description": "A sort field definition for sorting data objects within a window. If two data objects are considered equal by the comparator, they are considered \"peer\" values of equal rank. If sort is not specified, the order is undefined: data objects are processed in the order they are observed and none are considered peers (the ignorePeers parameter is ignored and treated as if set to `true`).",
          "items": {
            "$ref": "#/definitions/SortField"
          },
          "type": "array"
        },
        "window": {
          "description": "The definition of the fields in the window, and what calculations to use.",
          "items": {
            "$ref": "#/definitions/WindowFieldDef"
          },
          "type": "array"
        }
      },
      "required": [
        "window"
      ],
      "type": "object"
    }
  }
}

---

--- METRICS ---
- Files Extracted: 21
- Estimated Token Budget: ~495523 tokens
- Canonical Reference: https://codewiki.google/github.com/thu-ml/tianshou
