如何在 python 中为条形图编写函数?

How to write a function for barchart in python?

我正在为我的探索性数据使用条形图 analysis.I 在整个分析中生成了大约 18 个条形图,code.So 我不想编写相同的代码每个条形图的所有时间。我用于条形图的代码是

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,title,ax.set_title,ax.set_xlabel,ax.set_ylabel.
那么我该如何编写这个函数以供进一步使用。
在上面的代码中textranges_freq是我的dataframe和smstext,buckets是我的变量。
请帮我解决这个问题。我是 python.

的新手

我会将您的数据组织成列表。

例如:

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()

只需将整个内容包装在一个函数中即可:

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),您可以跳过相应的标签,它将使用该列取而代之的是名字。您也可以将标题留空。