2015-03-31 39 views
-1

我正在使用條形圖進行我的探索性數據分析。在整個分析過程中,我生成了大約18個條形圖,代碼類似,所以我不想每次都寫相同的代碼,圖表。我已經使用了條形圖代碼如何在python中爲barchart寫一個函數?

y = textranges_freq['smstext'] 
xlabels = textranges_freq['buckets'] 
bar_width = 0.50 
x = np.arange(len(y)) 
fig, ax = plt.subplots() 
ax.bar(x, y, width=bar_width) 
ax.set_xticks(x+(bar_width/2.0)) 
ax.set_xticklabels(xlabels) 
ax.set_title('Avg text Frequency by range') 
ax.set_xlabel('buckets') 
ax.set_ylabel('Avg text messages') 
plt.show() 

我已經使用了相同的代碼在我的分析約18倍,因爲我需要 修改y,xlabels,標題,ax.set_title,ax.set_xlabel, ax.set_ylabel。
所以我怎麼寫這個功能進一步使用。
在上面的代碼textranges_freq是我的數據框和smstext,桶是我的變量。
請幫助我。我是python的新手。

回答

0

只是包裝在一個函數整個事情:

y = textranges_freq['smstext'] 
xlabels = textranges_freq['buckets'] 
def makebar(y, xlabels, xlabel, ylabel, title): 
    bar_width = 0.50 
    x = np.arange(len(y)) 
    fig, ax = plt.subplots() 
    ax.bar(x, y, width=bar_width) 
    ax.set_xticks(x+(bar_width/2.0)) 
    ax.set_xticklabels(xlabels) 
    ax.set_title(title) 
    ax.set_xlabel(xlabel) 
    ax.set_ylabel(ylabel) 
    plt.show() 

然而,一種更簡單的方法是陰謀從DataFrame直接發送:

ax = textranges_freq.plot(x='buckets',y='smstext',kind='bar',title='Avg text Frequency by range', width=0.5, legend=False) 
ax.set_xlabel('buckets') 
ax.set_ylabel('Avg text messages') 
plt.show() 

這不不僅僅是直接調用函數更多的工作,但如果你真的想你可以把它包在一個函數,也:

def df_bar(df, xcol, ycol, xlabel=None, ylabel=None, title=None): 
    if xlabel is None: 
     xlabel = xcol 
    if ylabel is None: 
     ylabel = xcol  
    ax = textranges_freq.plot(x=xcol,y=ycol,kind='bar',title=title, width=0.5, legend=False) 
    ax.set_xlabel(xlabel) 
    ax.set_ylabel(ylabel) 
    plt.show() 

這還具有以下優點:如果x或y標籤與列名稱相同(如示例中xlabel的情況),您可以跳過相應的標籤,而是使用列名稱。您也可以將標題留空。

0

我會將你的數據結構化爲列表。

例如:

yn = [[1,2,3],[2,3,4], [3,4,5],[4,5,6], ...] 
x = [[1,2,3],[2,3,4], [3,4,5],[4,5,6], ...] 
labels = ['label1', 'label2', 'label3', ...] 

然後:

fig = plot.figure(figsize=(11.69, 8.27), dpi=100) 

for i,y in enumerate(yn): 
    #new subplot 
    ax=fig.add_subplot(18,1,i+1) 
    #plot 
    ax.plot(x[i], y, 'bo-') 
    #y labels 
    ax.set_ylabel(labels[i]) 
    # grid 
    ax.grid(True) 
plot.show() 
相關問題