Matplotlib条形图-类似于堆叠的重叠条形

时间:2019-01-04 09:26:49

标签: python pandas matplotlib bar-chart stacked-chart

我想创建一个matplotlib条形图,该条形图具有堆叠图的外观,而不会从多索引熊猫数据框中添加。

下面的代码给出了基本行为

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import io

data = io.StringIO('''Fruit,Color,Price
Apple,Red,1.5
Apple,Green,1.0
Pear,Red,2.5
Pear,Green,2.3
Lime,Green,0.5
Lime, Red, 3.0
''')
df_unindexed = pd.read_csv(data)
df_unindexed
df = df_unindexed.set_index(['Fruit', 'Color'])
df.unstack().plot(kind='bar')

绘图命令df.unstack().plot(kind='bar')显示彼此相邻分组的所有苹果价格。如果您选择选项df.unstack().plot(kind='bar',stacked=True)-它会将红色和绿色的价格加在一起并叠加。

我想要的是介于两者之间的绘图-它将每个组显示为一个单独的条形,但是覆盖了值,以便您可以全部看到它们。下图(在powerpoint中完成)显示了我正在寻找的行为->我想要右侧的图像。

先计算所有值,然后使用堆叠选项,这可能吗?

example bar plot

2 个答案:

答案 0 :(得分:1)

在我看来,这似乎是个坏主意,因为这种表示方式会导致多个问题。读者会理解那些不是抵押的吗?当前杠比后杠高时会发生什么?

无论如何,要完成您想要的工作,我只需在数据的每个子集上并使用相同的轴重复调用plot(),以使这些条形图相互重叠。 在您的示例中,“红色”价格始终较高,因此我必须调整顺序以将其绘制在背面,否则它们将隐藏“绿色”条。

fig,ax = plt.subplots()

my_groups = ['Red','Green']
df_group = df_unindexed.groupby("Color")

for color in my_groups:
    temp_df = df_group.get_group(color)
    temp_df.plot(kind='bar', ax=ax, x='Fruit', y='Price', color=color, label=color)

enter image description here

答案 1 :(得分:-1)

这种情节有两个问题。 (1)如果背景栏小于前景栏怎么办?它只会被隐藏而不可见。 (2)此类图表无法与堆叠条形图区分开。读者在解释它时会遇到严重的问题。

话虽如此,您可以分别绘制两列。

import matplotlib.pyplot as plt
import pandas as pd
import io

data = io.StringIO('''Fruit,Color,Price
Apple,Red,1.5
Apple,Green,1.0
Pear,Red,2.5
Pear,Green,2.3
Lime,Green,0.5
Lime,Red,3.0''')

df_unindexed = pd.read_csv(data)
df = df_unindexed.set_index(['Fruit', 'Color']).unstack()
df.columns = df.columns.droplevel()

plt.bar(df.index, df["Red"].values, label="Red")
plt.bar(df.index, df["Green"].values, label="Green")
plt.legend()
plt.show()

enter image description here