Python 在X轴上有两列的多个条形图

Python 在X轴上有两列的多个条形图,python,pandas,matplotlib,bar-chart,Python,Pandas,Matplotlib,Bar Chart,我正在尝试制作一组条形图,每个城市一个条形图,每个条形图在Y轴上显示计数(范围70-210),在X轴上我希望有21个条形图,每个工作日和时段组合一个条形图(7x3=21)。这是数据 import pandas as pd import matplotlib.pyplot as plt data = [ ['CITY','DAY','TIME_BIN', 'COUNT'], ['PHOENIX', "Friday", 1, 70], ['PHOENIX', "Thursd

我正在尝试制作一组条形图,每个城市一个条形图,每个条形图在Y轴上显示计数(范围70-210),在X轴上我希望有21个条形图,每个工作日和时段组合一个条形图(7x3=21)。这是数据

import pandas as pd
import matplotlib.pyplot as plt

data = [
    ['CITY','DAY','TIME_BIN', 'COUNT'],
    ['PHOENIX', "Friday", 1, 70],
    ['PHOENIX', "Thursday", 2, 80],
    ['PHOENIX', "Wednesday", 3, 90],
    ['ATLANTA', "Sunday", 1, 130],
    ['ATLANTA', "Monday", 2, 150],
    ['ATLANTA', "Tuesday", 3, 160],
    ['CHICAGO', "Saturday", 1, 180],
    ['CHICAGO', "Friday", 2, 200],
    ['CHICAGO', "Friday", 3, 210],
]
df = pd.DataFrame(data[1:],columns=data[0])
print(df)

          CITY        DAY  TIME_BIN  COUNT
0  PHOENIX     Friday         1     70
1  PHOENIX   Thursday         2     80
2  PHOENIX  Wednesday         3     90
3  ATLANTA     Sunday         1    130
4  ATLANTA     Monday         2    150
5  ATLANTA    Tuesday         3    160
6  CHICAGO   Saturday         1    180
7  CHICAGO     Friday         2    200
8  CHICAGO     Friday         3    210
我希望输出是以下两种尝试的某种组合。将阵列功能与条形图结合使用

# Successful attempt at making an array of charts but wrong type 
df[['DAY', 'TIME_BIN']].hist(by=df['CITY'])
plt.show()


用附加参数绘制此类分类数据的简单解决方案是使用searborn

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = [
    ['CITY','DAY','TIME_BIN', 'COUNT'],
    ['PHOENIX', "Friday", 1, 70],
    ['PHOENIX', "Thursday", 2, 80],
    ['PHOENIX', "Wednesday", 3, 90],
    ['ATLANTA', "Sunday", 1, 130],
    ['ATLANTA', "Monday", 2, 150],
    ['ATLANTA', "Tuesday", 3, 160],
    ['CHICAGO', "Saturday", 1, 180],
    ['CHICAGO', "Friday", 2, 200],
    ['CHICAGO', "Friday", 3, 210],
]
df = pd.DataFrame(data[1:],columns=data[0])

g = sns.factorplot(x="DAY", y ='COUNT', hue='TIME_BIN', col="CITY", col_wrap=3,
                   data=df,
                   kind="bar", size=3, aspect=.8)
g.set_xticklabels(rotation=30, ha="right")
plt.tight_layout()
plt.show()


使用pandas,您可以在具有多个列的数据帧上使用
subplot=True
参数,这将为每列提供一个子批。为此,首先从“日”和“时间”列创建一个多索引,然后围绕“城市”列旋转


谢谢,这很有效。时间和一周中的几天可能都在x轴上,还是这样做没有意义?直到刚才我才想到hue=的用法;看看这是否更符合你的喜好。嗯,在尝试了这个之后,我意识到我需要的是一个x轴上有时间的时间序列,每个城市都有自己的彩色线,一周中的每一天都有一个图。我应该提出一个新问题吗?是的,除了你的个人资料(这里不相关)之外,这些案例似乎没有任何共同之处。如果需要,问一个新问题。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = [
    ['CITY','DAY','TIME_BIN', 'COUNT'],
    ['PHOENIX', "Friday", 1, 70],
    ['PHOENIX', "Thursday", 2, 80],
    ['PHOENIX', "Wednesday", 3, 90],
    ['ATLANTA', "Sunday", 1, 130],
    ['ATLANTA', "Monday", 2, 150],
    ['ATLANTA', "Tuesday", 3, 160],
    ['CHICAGO', "Saturday", 1, 180],
    ['CHICAGO', "Friday", 2, 200],
    ['CHICAGO', "Friday", 3, 210],
]
df = pd.DataFrame(data[1:],columns=data[0])

g = sns.factorplot(x="DAY", y ='COUNT', hue='TIME_BIN', col="CITY", col_wrap=3,
                   data=df,
                   kind="bar", size=3, aspect=.8)
g.set_xticklabels(rotation=30, ha="right")
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt

data = [
    ['CITY','DAY','TIME_BIN', 'COUNT'],
    ['PHOENIX', "Friday", 1, 70],
    ['PHOENIX', "Thursday", 2, 80],
    ['PHOENIX', "Wednesday", 3, 90],
    ['ATLANTA', "Sunday", 1, 130],
    ['ATLANTA', "Monday", 2, 150],
    ['ATLANTA', "Tuesday", 3, 160],
    ['CHICAGO', "Saturday", 1, 180],
    ['CHICAGO', "Friday", 2, 200],
    ['CHICAGO', "Friday", 3, 210],
]
df = pd.DataFrame(data[1:],columns=data[0])
df.set_index(['DAY','TIME_BIN'], inplace=True)

piv = df.pivot(columns="CITY").plot(kind="bar", subplots=True)
plt.tight_layout()
plt.show()