Python,tkinter,在同一个子图中绘制3个堆叠的分组直方图

时间:2017-05-24 15:34:51

标签: python matplotlib tkinter histogram stacked

我是python中的新手,我做了一个tkinter界面,询问问题,然后在另一个窗口中绘制图形。

我正在使用熊猫库处理大型csv文件。

我遇到的问题是,在我的图形窗口,我尝试在同一个子图上绘制3个堆叠的直方图。

让我更具体一点,我有3个值,警报值(VA,VI和VR),年值和位置值(名为PK(类型:浮点))。

我需要为每个位置绘制3个堆叠的直方图(按年),并在画布的子图中绘制每个警报值。

我尝试使用matplotlib绘制按位置排序的三个警报值,但我无法弄清楚如何在图表上显示年份。所以我尝试了另一种方法,但它没有完全奏效。

我尝试做一些df.groupby.plot,如果我只绘制一个堆叠的直方图,但是如果我想显示其中的三个,则它可以工作。我成功地绘制了三个不同的堆积直方图,但它只显示了三个值的位置,它们彼此不相邻但相互重叠。那不是我想要的。

有时我没有VI或VR,这就是为什么我试一试/除了它以免它停止我的剧本。

你能帮我解决这个问题吗?

这是我要绘制的df的例子:

g3m['pk']=[1,1,1,2,2,2,4,4,5,5,5,5,5,5,6,6,10,10,10,12,12,12,12,12,12,12,12]
g3m['annee']=[2010,2011,2012,2010,2012,2013,2011,2014,2010,2011,2012,2012,2012,2016,2016,2017,2010,2010,2014,2010,2010,2010,2010,2012,2013,2014,2014]
g3m['class_seuil']=['VA','VA','VA','VA','VA','VA','VA','VA','VA','VA','VA','VI','VR','VI','VI','VA','VI','VI','VR','VA','VA','VI','VI','VA','VI','VR','VA']
g3m['type_mesure']=['MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC','MAC']

这是一个Panda DataFrame 现在这是我在子图中绘图的代码:

这是我的数字的声明:

f = Figure(figsize=(15,8), dpi=100)
f.subplots_adjust(top=0.97,hspace=0.41,left=0.05,bottom=0.08,right=0.91)
a = f.add_subplot(311)
c = f.add_subplot(312)
b = f.add_subplot(313)

以下是我的情节代码:

try:
    g3mVa=pa.DataFrame()
    g3mVa['pk']=g3m[g3m['class_seuil']=='VA']['pk_decimal_km_m']
    g3mVa['annee']=g3m[g3m['class_seuil']=='VA']['annee']
    g3mVa['type_mesure']=g3m[g3m['class_seuil']=='VA']['type_mesure']

    g3mVa.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,colormap='Greens',y='type_mesure',grid=True,ax=c,rot='horizontal')
    c.hold(True)
except:
    pass
try:

    g3mVi=pa.DataFrame()
    g3mVi['pk']=g3m[g3m['class_seuil']=='VI']['pk_decimal_km']
    g3mVi['annee']=g3m[g3m['class_seuil']=='VI']['annee']    
    g3mVi['type_mesure']=g3m[g3m['class_seuil']=='VI']['type_mesure']
    g3mVi.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,colormap='Oranges',y='type_mesure',grid=True,ax=c,rot='horizontal')
    c.hold(True)    
except:
    pass
try:
    g3mVr=pa.DataFrame()
    g3mVr['pk']=g3m[g3m['class_seuil']=='VR']['pk_decimal_km_p']
    g3mVr['annee']=g3m[g3m['class_seuil']=='VR']['annee']    
    g3mVr['type_mesure']=g3m[g3m['class_seuil']=='VR']['type_mesure']
    g3mVr.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,y='type_mesure',colormap='Reds',grid=True,ax=c,rot='horizontal')
    c.hold(True)  
except:
    pass

你能帮助我吗?

是否可以按照我想要的方式绘制它?

1 个答案:

答案 0 :(得分:1)

很抱歉,我在代码中出错,g3m['pk_decimal_km_m']g3m['pk_decimal_km']g3m['pk_decimal_km_p']g3m['pk']举报。

此错误是由于我所做的所有尝试。

这是我的代码更正。

try:
    g3mVa=pa.DataFrame()
    g3mVa['pk']=g3m[g3m['class_seuil']=='VA']['pk']
    g3mVa['annee']=g3m[g3m['class_seuil']=='VA']['annee']
    g3mVa['type_mesure']=g3m[g3m['class_seuil']=='VA']['type_mesure']

    g3mVa.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,colormap='Greens',y='type_mesure',grid=True,ax=c,rot='horizontal')
    c.hold(True)
except:
    pass
try:

    g3mVi=pa.DataFrame()
    g3mVi['pk']=g3m[g3m['class_seuil']=='VI']['pk']
    g3mVi['annee']=g3m[g3m['class_seuil']=='VI']['annee']    
    g3mVi['type_mesure']=g3m[g3m['class_seuil']=='VI']['type_mesure']
    g3mVi.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,colormap='Oranges',y='type_mesure',grid=True,ax=c,rot='horizontal')
    c.hold(True)    
except:
    pass
try:
    g3mVr=pa.DataFrame()
    g3mVr['pk']=g3m[g3m['class_seuil']=='VR']['pk']
    g3mVr['annee']=g3m[g3m['class_seuil']=='VR']['annee']    
    g3mVr['type_mesure']=g3m[g3m['class_seuil']=='VR']['type_mesure']
    g3mVr.groupby(['pk','annee']).count().unstack().plot(kind='bar',stacked=True,y='type_mesure',colormap='Reds',grid=True,ax=c,rot='horizontal')
    c.hold(True)  
except:
    pass