Я не уверен, что избавлюсь от пустых ячеек, но вы можете использовать параметр stacked для получения результата, а также да вы можете передать массив цветов в метод bar , который будет соответственно отобразите цвет.
import pandas as pd
data = [
['alpha', 'x', 1],
['alpha', 'y', 2],
['alpha', 'z', 2],
['beta', 'x', 3],
['beta', 'z', 4]]
df = pd.DataFrame(data, columns=['P','Q','R'])
df.pivot('P','Q','R').plot.bar(rot=0, stacked=True,color = ['blue', 'green', 'red'])
Надеюсь, это поможет.