mark(el, scene, prev, markTypes) {
      if (!this.isDirty(scene)) {
        return scene._svg;
      }
      const svg = this._svg,
        markType = scene.marktype,
        mdef = Marks[markType],
        events = scene.interactive === false ? 'none' : null,
        isGroup = mdef.tag === 'g';
      const parent = bind$1(scene, el, prev, 'g', svg);
      if (markType !== 'group' && markTypes != null && !markTypes.includes(markType)) {
        domClear(parent, 0);
        return scene._svg;
      }
      parent.setAttribute('class', cssClass(scene));

      // apply aria attributes to parent container element
      const aria = ariaMarkAttributes(scene);
      for (const key in aria) setAttribute(parent, key, aria[key]);
      if (!isGroup) {
        setAttribute(parent, 'pointer-events', events);
      }
      setAttribute(parent, 'clip-path', scene.clip ? clip$1(this, scene, scene.group) : null);
      let sibling = null,
        i = 0;
      const process = item => {
        const dirty = this.isDirty(item),
          node = bind$1(item, parent, sibling, mdef.tag, svg);
        if (dirty) {
          this._update(mdef, node, item);
          if (isGroup) recurse(this, node, item, markTypes);
        }
        sibling = node;
        ++i;
      };
      if (mdef.nested) {
        if (scene.items.length) process(scene.items[0]);
      } else {
        visit(scene, process);
      }
      domClear(parent, i);
      return parent;
    }
Render a set of mark items.
@param {SVGElement} el - The parent element in the SVG tree.
@param {object} scene - The mark parent to render.
@param {SVGElement} prev - The previous sibling in the SVG tree.
@param {Array} markTypes - Array of the mark types to render.
                           If undefined, render all mark types