Pandas使用pivot_table实现带有覆盖条和条形组的条形图

时间:2018-02-16 20:21:30

标签: python pandas plot

使用Pandas和Python我试图实现一个条形图。

数据从CSV导入Pandas中的数据框。

有几组条形图根据其中一列中的特定行值进行分组,这些列类别为:A,B,C,D,E。 这些类别由CSV中名为category的列中的值给出。从附图可以看出,A对应浅灰色,B对应最硬的蓝色,依此类推,直到E。

每个行都有两列(COLUMN1,COLUMN2),它们与条形图中的y值(从1到5,这给出条形的高度)相关。所以看一下附图:从第1列开始构造非半透明条,从COLUMN2构建半透明条。

Barplot with groups of bars including overlay bars

修改

以下是导入的CSV /数据框中数据的布局如下:

Category    COLUMN1         COLUMN2     Month    
A          0.2               3          Jan   
B          0.3               5          Jan 
C          0.7               4          Jan
D          0.4               3          Jan
E          0.8               5          Jan
A          0.3               4          Feb
B          0.75             4.5         Feb

结束编辑

我已经设法使用5条非半透明条形图的分组制作图,但我不知道如何将半透明条形图放入相同的图中,如附图所示。有什么建议?我的问题是我需要将COLUMN2中的值添加为半透明条(它们不必是半透明的,但它可能是最容易区分的。)

这是我到目前为止的代码:

import pandas as pd


df=pd.read_csv("filename_for_import.csv", 
               names=["Category", "COLUMN1", "COLUMN2", "Month"], 
encoding="UTF-8")

order = ['Jan', 'Feb', 'Mar', 'Apr']



d = pd.pivot_table(df, index='Month', columns='Category', 
values='COLUMN1').loc[order].plot(kind='bar', grid='True')

编辑2

根据使用的数据了解潜在问题。将COLUMN1中的A值调整为大于第一行的B,以举例说明。

Category    COLUMN1         COLUMN2     Month    
A          4.5                3         Jan   
B          0.3               5          Jan 
C          0.7               4          Jan
D          0.4               3          Jan
E          0.8               5          Jan
A          0.3               4          Feb
B          0.75             4.5         Feb

发现非半透明条放在上面,使得当它们低于非半透明条时,不可能看到半透明条。这似乎改变了Parfait下面提供的代码中的顺序。同样在相同的代码中在col / ax 1和2之间切换似乎没有任何区别。无论如何,看起来好像非透明条总是放在上面。有没有办法改写这个?

1 个答案:

答案 0 :(得分:1)

考虑twiny将较短的 COLUMN1 图叠加在较大的 COLUMN2 枢轴图上。并使用 alpha 来调整不透明度。至于pivot_table,请使用reindex调整月份值。

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

txt = '''Category    COLUMN1         COLUMN2     Month    
A          0.5               3          Jan   
0          0.3               5          Jan 
C          0.7               4          Jan
D          0.4               3          Jan
E          0.8               5          Jan
A          0.3               4          Feb
B          0.75             4.5         Feb'''

df = pd.read_table(StringIO(txt), sep="\s+")

order = ['Jan', 'Feb', 'Mar', 'Apr']

fig, ax = plt.subplots()
ax2 = ax.twiny()

col1 = pd.pivot_table(df,index='Month',columns='Category',values='COLUMN1').reindex(order)
col1.plot(kind='bar', ax=ax)

col2 = pd.pivot_table(df,index='Month',columns='Category',values='COLUMN2').reindex(order)
col2.plot(kind='bar', ax=ax2, alpha=0.5, legend=False)
ax2.xaxis.set_visible(False)

plt.show()  

Plot Output