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

Matplotlib bar chart - overlay bars similar to stacked

我想创建一个 matplotlib 条形图,它具有堆叠图的外观,而不是从多索引 pandas 数据帧中添加。

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

%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 中完成)显示了我正在寻找的行为 -> 我想要右边的图像。

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

(对我来说)这似乎是个坏主意,因为这种表示会导致几个问题。 reader 会明白那些不是质押金条吗?当前面的酒吧比后面的酒吧高时会发生什么?

无论如何,为了完成您想要的,我只需对数据的每个子集重复调用 plot() 并使用相同的轴,以便在彼此之上绘制条形图。 在你的例子中,"Red" 价格总是更高,所以我不得不调整顺序以在后面绘制它们,否则它们会隐藏 "Green" 条。

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)

这种剧情有两个问题。 (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()