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

Esm*_*me_ 6 python matplotlib bar-chart pandas stacked-chart

我想创建一个 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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

示例条形图

Diz*_*ahi 2

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

无论如何,为了完成您想要的任务,我只需重复调用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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述