<p>我已经找到了解决我自己问题的办法。我对最初回答我问题的@<a href="https://stackoverflow.com/users/2077270/dermen">dermen</a>给予了部分信任。我的回答受到了他的启发。在</p>
<p>虽然@dermen的解决方案是正确的,但我觉得我需要一种方法,我不必手动调整栏的宽度或担心位置。在</p>
<p>下面的解决方案可以适用于任意数量的城市,以及属于该城市的年度数据。重要的是要知道,在下面的解决方案中,绘制的数据帧是多级数据帧。在数据帧被排序的情况下,解决方案可能会中断,因为打印是按特定的顺序进行的。在</p>
<p><a href="https://i.stack.imgur.com/LhuvV.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/LhuvV.png" alt="enter image description here"/></a></p>
<pre><code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import random
matplotlib.style.use('ggplot')
taste = ['Sweet','Spicy','Sour','Bitter']
store = ['Asian','Italian','American','Greek','Mexican']
df1 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df2 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df3 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df4 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df5 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df6 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df7 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df8 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df9 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df10 = pd.DataFrame({'Taste':[random.choice(taste) for x in range(10)],
'Store':[random.choice(store) for x in range(10)],
'Sold':1000+100*np.random.rand(10)})
df1['Year'] = '2010'
df1['City'] = 'MIA'
df2['Year'] = '2011'
df2['City'] = 'MIA'
df3['Year'] = '2012'
df3['City'] = 'MIA'
df4['Year'] = '2010'
df4['City'] = 'ATL'
df5['Year'] = '2011'
df5['City'] = 'ATL'
df6['Year'] = '2012'
df6['City'] = 'ATL'
df7['Year'] = '2013'
df7['City'] = 'ATL'
df8['Year'] = '2014'
df8['City'] = 'ATL'
df9['Year'] = '2013'
df9['City'] = 'CHI'
df10['Year'] = '2014'
df10['City'] = 'CHI'
DF = pd.concat([df1,df2,df3,df4,df5,df6,df7,df8,df9,df10])
DFG = DF.groupby(['Taste', 'Year', 'City'])
DFGSum = DFG.sum().unstack(['Year','City']).sum(axis=1,level=['City','Year'])
#DFGSum is a multilevel DataFrame
import itertools
color_cycle = itertools.cycle( plt.rcParams['axes.color_cycle'] )
plot_colors = [] #Array for a squenece of colors to be plotted
for city in DFGSum.columns.get_level_values('City').unique():
set_color = color_cycle.next() #Set the color for the city
for year in DFGSum[city].columns.get_level_values('Year').unique():
plot_colors.append(set_color)
#For each unqiue city, all the yearly data belonging to that city will have the same color
DFGSum.plot(kind='bar',color=plot_colors)
# The color pramater of the plot function allows a list of colors sequences to be specified
</code></pre>