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