TYP: mostly io, plotting
- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `black pandas`
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

cc @simonjayhawkins can i get your thoughts on two remaining mypy complaints

```
pandas/io/excel/_base.py:795: error: "Callable[[ExcelWriter], Tuple[str, ...]]" has no attribute "__iter__" (not iterable)  [attr-defined]
pandas/io/stata.py:892: error: unused 'type: ignore' comment
```

The excel one is because it doesn't recognize 

```
@property
@abstractmethod
def supported_extensions(self) -> Tuple[str, ...]:
```

as returning `Tuple[str, ...]`.  I expect if that were resolved it would still complain bc subclasses just pin the tuple as a class attribute instead of a property (easy to make a property, but much more verbose which im not wild about)

The stata unused type:ignore becomes used once we remove stata from the setup.cfg exclusion.  The only working way I've found to make mypy accept `TYPE_MAP: List[Union[int, str]] = list(range(251)) + list("abcd")` is with

```
TYPE_MAP: List[Union[int, str]] = cast(List[Union[int, str]], list(range(251))) + list("abcd")
```

which i find much less clear than the `# type:ignore`d version.