【问题标题】:Matplotlib bar chart - overlay bars similar to stackedMatplotlib 条形图 - 类似于堆叠的叠加条
【发布时间】:2019-05-30 20:37:46
【问题描述】:

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

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

【问题讨论】:

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


【解决方案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)

【讨论】:

  • 我知道有很多数据集这不是一个好主意,但它恰好非常适合我的数据。我的数据在每个组内都是严格单调增加的(并且在组之间也会发生)。数据中有一些重要的模式更容易看到,因为图表上的条形越少。感谢您的解决方案 - 我会确保有一个非常清晰的标题,以避免与堆叠条混淆(无论如何这对这些数据没有意义)。
  • 您能否向我解释一下如何在每个条形图的顶部添加确切的价格,因为我也有一个类似场景的情节?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2021-10-22
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多