【问题标题】:Plot a side by side bar charts with sharing only Y-axis绘制仅共享 Y 轴的并排条形图
【发布时间】:2021-11-22 20:13:17
【问题描述】:

如何从具有相同 Y 轴的多个数据框中绘制并排条形图?

from matplotlib import pyplot as plt
import pandas as pd

fruits = {"Apple": 10, "Banana": 9, "Mango": 5, "Orange": 1}
beverages = {"Coca-cola": 15, "Pepsi": 12, "Seven-up": 9, "Root-bear": 3}
foods = {'hamburger': 10, 'pizza': 7, 'pasta': 5, 'sushi': 2}

fruits_df = pd.DataFrame(fruits.items(), columns = ['stuffs', 'freq'])
beverages_df = pd.DataFrame(beverages.items(), columns = ['stuffs', 'freq'])
foods_df = pd.DataFrame(foods.items(), columns = ['stuffs', 'freq'])

# initialize a figure
fig=plt.figure(figsize=(18, 6))
plt.subplots_adjust(hspace = 2)

ax1 = fig.add_subplot(221)
fruits_df.head(8).plot(x='stuffs', y='freq', kind='bar', ax=ax1, legend=False).set_title('fruits')
plt.xticks(rotation=45, ha='right')

ax2 = fig.add_subplot(222)
beverages_df.head(8).plot(x='stuffs', y='freq', kind='bar', ax=ax2, legend=False, color="orange").set_title('beverage')
plt.xticks(rotation=45, ha='right')

ax2 = fig.add_subplot(223)
foods_df.head(8).plot(x='stuffs', y='freq', kind='bar', ax=ax2, legend=False, color="blue").set_title('foods')
plt.xticks(rotation=45, ha='right')

我想要的输出如下。我打算在上面添加三个或更多数据框,例如零食、服装等...请帮助

【问题讨论】:

    标签: python pandas dataframe matplotlib seaborn


    【解决方案1】:

    您可以通过以下方式将所有数据框连接在一起:

    fruits_df['type'] = 'fruit'
    beverages_df['type'] = 'beverages'
    foods_df['type'] = 'foods'
    
    df = pd.concat([fruits_df, beverages_df, foods_df], ignore_index = True)
    

    然后你可以使用seaborn.barplot并传递参数hue = 'type'

    fig, ax = plt.subplots(figsize = (18, 6))
    
    sns.barplot(ax = ax, data = df, x = 'stuffs', y = 'freq', hue = 'type', dodge = False)
    
    plt.show()
    

    完整代码

    from matplotlib import pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    
    fruits = {"Apple": 10, "Banana": 9, "Mango": 5, "Orange": 1}
    beverages = {"Coca-cola": 15, "Pepsi": 12, "Seven-up": 9, "Root-bear": 3}
    foods = {'hamburger': 10, 'pizza': 7, 'pasta': 5, 'sushi': 2}
    
    fruits_df = pd.DataFrame(fruits.items(), columns = ['stuffs', 'freq'])
    beverages_df = pd.DataFrame(beverages.items(), columns = ['stuffs', 'freq'])
    foods_df = pd.DataFrame(foods.items(), columns = ['stuffs', 'freq'])
    
    fruits_df['type'] = 'fruit'
    beverages_df['type'] = 'beverages'
    foods_df['type'] = 'foods'
    
    df = pd.concat([fruits_df, beverages_df, foods_df], ignore_index = True)
    
    
    fig, ax = plt.subplots(figsize = (18, 6))
    
    sns.barplot(ax = ax, data = df, x = 'stuffs', y = 'freq', hue = 'type', dodge = False)
    
    plt.show()
    

    【讨论】:

      【解决方案2】:

      使用 plt.subplots(..., sharey=True) 可能会成功。

      from matplotlib import pyplot as plt
      import pandas as pd
      
      fruits = {"Apple": 10, "Banana": 9, "Mango": 5, "Orange": 1}
      beverages = {"Coca-cola": 15, "Pepsi": 12, "Seven-up": 9, "Root-bear": 3}
      foods = {'hamburger': 10, 'pizza': 7, 'pasta': 5, 'sushi': 2}
      
      fruits_df = pd.DataFrame(fruits.items(), columns = ['stuffs', 'freq'])
      beverages_df = pd.DataFrame(beverages.items(), columns = ['stuffs', 'freq'])
      foods_df = pd.DataFrame(foods.items(), columns = ['stuffs', 'freq'])
      
      # initialize a figure
      fig, axes = plt.subplots(1, 3, figsize=(18, 6), sharey=True)
      ax1, ax2, ax3 = axes
      fruits_df.plot(x='stuffs', y='freq', kind='bar', ax=ax1, legend=False).set_title('fruits')
      beverages_df.plot(x='stuffs', y='freq', kind='bar', ax=ax2, legend=False, color="orange").set_title('beverage')
      foods_df.plot(x='stuffs', y='freq', kind='bar', ax=ax3, legend=False, color="blue").set_title('foods')
      
      for ax in axes:
          ax.set_xticklabels(ax.get_xticklabels(), rotation = 45)
          for side in ('right', 'top', 'left'):
              if (ax == ax1) and (side == 'left'):
                  continue
              else:
                  sp = ax.spines[side]
                  sp.set_visible(False)
      
      

      【讨论】:

        猜你喜欢
        • 2016-03-24
        • 2021-05-12
        • 2018-02-08
        • 2015-02-25
        • 2021-03-06
        • 2019-02-18
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        相关资源
        最近更新 更多