我有一个多索引DataFrame,看起来像下面的数据。当我绘制数据时,图形如下所示。
如何绘制条形图,条形图的颜色由我所需的类别确定(例如:' City')。因此,无论年份如何,属于同一城市的所有酒吧都具有相同的颜色。例如:在下图中,所有ATL条应为红色,而所有MIA条应为蓝色。
City ATL MIA \
Year 2010 2011 2012 2010 2011
Taste
Bitter 3159.861983 3149.806667 2042.348937 3124.586470 3119.541240
Sour 1078.897032 3204.689424 3065.818991 2084.322056 2108.568495
Spicy 5280.847114 3134.597728 1015.311288 2036.494136 1001.532560
Sweet 1056.169267 1015.368646 4217.145165 3134.734027 4144.826118
City
Year 2012
Taste
Bitter 1070.925695
Sour 3178.131540
Spicy 3164.382635
Sweet 3173.919338
以下是我的代码:
import sys
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import random
matplotlib.style.use('ggplot')
def main():
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)})
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'
DF = pd.concat([df1,df2,df3,df4,df5,df6])
DFG = DF.groupby(['Taste', 'Year', 'City'])
DFGSum = DFG.sum().unstack(['Year','City']).sum(axis=1,level=['City','Year'])
print DFGSum
'''
In my plot, I want the color of the bars to be determined by the "City".
For example: All "ATL" bar colors will be the same regardless of the year.
'''
DFGSum.plot(kind='bar')
plt.show()
if __name__ == '__main__':
main()
答案 0 :(得分:3)
你需要指定一些额外的args才能让它看起来不错,但是这样的东西可能会起作用
if (rdr[3].ToString() != "" || rdr[3] != null) {
int something = Convert.ToInt32(rdr[3]);
}
虽然在这里你不知道哪个酒吧对应哪一年......
您还可以制作一种略有不同的图表,该图表会在刻度标签中保留年份信息。这可以推广到任意数量的城市,并保持默认的颜色样式
import itertools # for color cycling
# specify the colors you want for each city
color_cycle = itertools.cycle( plt.rcParams['axes.color_cycle'] )
colors = { cty:color_cycle.next() for cty in DF.City.unique() }
#spcify the relative position of each bar
n = len(list(DFGSum))
positions = linspace(-n/2., n/2., n)
# plot each column individually
for i,col in enumerate(list(DFGSum)):
c = colors[col[0]]
pos = positions[i]
DFGSum[col].plot(kind='bar', color=c,
position=pos, width=0.05)
plt.legend()
plt.show()
答案 1 :(得分:3)
我找到了解决自己问题的方法。我对最初回答我问题的@ dermen给予了部分赞誉。我的回答是受他的方法的启发。
虽然@ dermen的解决方案是正确的,但我觉得我需要一种方法,我不必手动调整条的宽度或担心位置。
以下解决方案可以适应任意数量的城市,以及属于该城市的年度数据。重要的是要知道在下面的解决方案中,绘制的DataFrame是一个多级DataFrame。解决方案可能会在DataFrame排序的情况下中断,因为绘图以特定顺序发生。
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