ENH: Allow bar and barh plots to use index values for x position.
_Note_: This is my first attempt to contribute code to pandas, so any correction is more than welcome.


This proposal adds a new parameter to the bar and barh plots, `positioning`, with the values:
- sequential: The index values are added sequentially (`x=0, 1, 2, 3...`) and only the tick label shows the value.
- numerical: The X axis positions will be related to the real index values.
- categorical: The X axis ticks includes all the possible categories, even if are not all used in the index.

With these modes it is possible to create richer bar plots, useful to compare results from different samples.

## Details

With the current bar and barh plots is difficult to create a graph where the categorical axis (x for bar) follows the real values
of the input data.
For example, if we have 10 machines that are not always active and we are collecting the RAM and CPU usage we can have
a data set like:
```python
data = pd.DataFrame({
    'machine': [1, 6, 4, 2, 10],
    'cpu': [0.9, 0.8, 0.8, 0.9, 0.7],
    'ram': [0.6, 0.7, 0.2, 0.9, 1.0]
})

data.plot.bar(x='machine', rot=0)
```
![image](https://user-images.githubusercontent.com/1187546/127787243-6bbcb568-a51f-48dd-8181-88ad5ed379fb.png)

This can be misleading and difficult to compare with data from other sample:

```python
other = pd.DataFrame({
    'machine': [2, 5, 4, 8, 10],
    'cpu': [0.7, 0.3, 0.8, 0.7, 0.8],
    'ram': [0.5, 0.9, 0.6, 0.6, 0.8]
})

fig, axes = plt.subplots(2, 1)
data.plot.bar(x='machine', ax=axes[0], ylabel='day 1', rot=0)
other.plot.bar(x='machine', ax=axes[1], ylabel='day 2', rot=0)
fig.suptitle('Difficult to correlate plots')
```
![image](https://user-images.githubusercontent.com/1187546/127787490-637e1504-4733-46b9-8537-ab51998017ec.png)

This proposal introduces the possibility to interpret the x values according to the numerical value, solving this issue:

```python
fig, axes = plt.subplots(2, 1, sharex='col')
data.plot.bar(x='machine', ax=axes[0], ylabel='day 1', rot=0, positioning="numerical")
other.plot.bar(x='machine', ax=axes[1], ylabel='day 2', rot=0, positioning="numerical")
axes[1].set_xlim(0.5, 10.5)
fig.suptitle('Aligned plot')
```

![image](https://user-images.githubusercontent.com/1187546/127787686-ed3a3bcc-76c7-4039-8d66-56b953aaf862.png)

When the X axis is a categorical data it is possible to also include all the missing labels in the X-axis,
so it is easier to compare graphs generated in different moments.

```python
machines = ['OP1', 'OP2', 'OP3', 'OP4', 'OP5', 'SP1', 'SP2', 'SP3', 'SP4', 'SP5']
day_1 = pd.DataFrame({'machine': ['OP1', 'SP1', 'OP4', 'OP2', 'SP5'], 'cpu': [0.9, 0.8, 0.8, 0.9, 0.7], 'ram': [0.6, 0.7, 0.2, 0.9, 1.0]})
day_1['machine'] = pd.Categorical(day_1['machine'], machines)
day_2 = pd.DataFrame({
    'machine': ['OP2', 'OP5', 'OP4', 'SP3', 'SP4'],
    'cpu': [0.7, 0.3, 0.8, 0.7, 0.8],
    'ram': [0.5, 0.9, 0.6, 0.6, 0.8]
})

day_2['machine'] = pd.Categorical(day_2['machine'], machines)
fig, axes = plt.subplots(2, 1, sharex='col')
day_1.plot.bar(x='machine', ax=axes[0], ylabel='day 1', rot=0, positioning="categorical")
day_2.plot.bar(x='machine', ax=axes[1], ylabel='day 2', rot=0, positioning="categorical")
fig.suptitle('Plot with Categories')
```
![image](https://user-images.githubusercontent.com/1187546/127787905-298e2935-a49b-4282-8c9f-1b55fbd667bd.png)


## Other changes

I also factorized the documentation of bar and barh so they share the same examples. In the current version of the docs there are subtle differences between the bar and barh pages, I tried to unify them.

## Open Points

- Not convinced at all with the name of the flag and the values, for sure someone can find better alternative
- Current code works well with "absolute" index like float, integer categorical or timestamp. It does not work with relative index like period, timedelta or date offsets. Sometimes is fair enough (like using  MonthEnd) but in other cases like TimeDelta the problem arises in the different way matplotlib converts the width parameter of bar.
- I added some tests, but I need to add additional ones to check proper behaviour with error bars and stacked plots.
- The code can be better organized, but requires to modify the content of some of the BarPlot class properties between `__init__` and the call to `_make_plot`. I preferred to keep backwards compatibility, even if this class looks internal to pandas.

_NOTE_: I renamed the parameter from `x_mode` to `positioning`. Still not the best, but at least do not produce confusion for the  barh plots (where it really position the Y axis). Still not perfect, as there is also the parameter `position` that might be confusing.


- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [ ] whatsnew entry
