### Communities

tag:snake search within a tag
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
created:<1w created < 1 week ago
post_type:xxxx type of post
Q&A

+3
−0

# MWE

``````import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(9, 4), columns=['a', 'b', 'c', 'd'])
df.plot.bar()
plt.show()
`````` # Question

How do I add separating vertical lines between groups? Say these are groups of three:
`(0, 1, 2), LINE, (3, 4, 5), LINE, (6, 7, 8)`

# Notes

This really helps for recognizing patterns and tracking trends in a busy, but useful graph.

Why does this post require moderator attention?
Why should this post be closed?

+3
−0

One possibility with `axvline`:

``````import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(9, 4), columns=['a', 'b', 'c', 'd'])
df.plot.bar()
plt.axvline(x=2.5, ymin=0, ymax=1)
plt.axvline(x=5.5, ymin=0, ymax=1)
plt.show()
`````` Why does this post require moderator attention?

Also works when saving plot to variable! (1 comment)
+1
−0

I don't think this is possible using just the Pandas plotting API. You can use the lower-level Matplotlib API to do just about anything you can imagine:

``````ax = df.plot.bar()
vlines = [2.5, 5.5] # x-positions of the group separators
ax.vlines(vlines, 0, 1,
transform=ax.get_xaxis_transform(), # 
color='black',
linewidths=0.8) # 
# : This makes the above 0 and 1 refer to the top and bottom
# of the plot, regardless of the actual scale used for the data.
# : 0.8 is the default width used for the axis frame
# (matplotlib.rcParams['axes.linewidth'], if you prefer).
plt.show()
``````

`ax` here is a Matplotlib `Axes` object, and you can read about all the things you can do with it here.

Why does this post require moderator attention? 