【问题标题】:Pandas multiple bar charts with 2 columns on X-axisPandas X 轴上有 2 列的多个条形图
【发布时间】:2018-07-28 12:34:53
【问题描述】:

我正在尝试制作一系列条形图,每个城市一个图表,每个图表显示 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()

# Bar chart with proper counts but x-axis did not combine properly
ax = df.plot(x=['DAY', 'TIME_BIN'],
                                                       y='COUNT',
                                                       kind='bar',
                                                       color=["g","b"])
plt.show()

【问题讨论】:

    标签: python pandas matplotlib bar-chart


    【解决方案1】:

    使用附加参数绘制此类分类数据的简单解决方案是使用 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,您可以在具有多列的数据框上使用 subplots=True 参数,这将为每列提供一个子图。为此,首先从“DAY”和“Time_bin”列创建一个MultiIndex,然后围绕“CITY”列进行旋转。

    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()
    

    【讨论】:

    • 谢谢你的作品。 time_bin 和星期几是否可能都在 x 轴上,或者这样做没有意义?直到现在我才想到 hue= 的用法。
    • 我添加了另一个选项;看看这是否更符合您的喜好。
    • 呃,在尝试了这个之后,我意识到我需要的是一个时间序列,其中 TIME_BIN 在 x 轴上,每个城市都有自己的彩色线和一周中的每一天的图。我应该提出一个新问题吗?
    • 是的,除了您的个人数据(此处无关紧要)之外,这些案例似乎没有任何共同之处。如果需要,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多