我想创建一个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中完成)显示了我正在寻找的行为->我想要右侧的图像。
先计算所有值,然后使用堆叠选项,这可能吗?
答案 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)
答案 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()