使用Pandas和Python我试图实现一个条形图。
数据从CSV导入Pandas中的数据框。
有几组条形图根据其中一列中的特定行值进行分组,这些列类别为:A,B,C,D,E。 这些类别由CSV中名为category的列中的值给出。从附图可以看出,A对应浅灰色,B对应最硬的蓝色,依此类推,直到E。
每个行都有两列(COLUMN1,COLUMN2),它们与条形图中的y值(从1到5,这给出条形的高度)相关。所以看一下附图:从第1列开始构造非半透明条,从COLUMN2构建半透明条。
修改
以下是导入的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之间切换似乎没有任何区别。无论如何,看起来好像非透明条总是放在上面。有没有办法改写这个?
答案 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()