Python& Matplotlib:简化绘图配置(xlabel,标题,图例......)?

时间:2016-07-12 14:46:39

标签: python matplotlib

当我制作情节时,我总是需要设置x,ylabels,标题,图例等。逐个设置它们是单调乏味的,所以我尝试将它们放入单个辅助方法中:

SYSPROGRAMSTMTSTAT

所以它可以像

一样使用
select * from sysprogramstmtstat
where STATEMENT_TEXT like '%MY_UDTF%';

我想知道是否有更优雅的方式来做到这一点? (更有效地定义xlabel,标题,然后逐个设置它们)

另外,我制作的辅助方法看起来非常复杂和冗长。无论如何只是简单吗?

2 个答案:

答案 0 :(得分:1)

同样,我也习惯为plt设置设置辅助函数。我觉得只设置这种功能的基础知识就足够了,因为其余部分总是依赖于情节。

你只会遇到“帮助者”的高度复杂性,因为你试图在其中添加太多选项,实际上使得它更难以控制,而不仅仅是直接为每个情节设置所需的选项。

这是我使用的那个:

def plt_setup(width=8, height=6, borders='lb', fontsize=9):
    font = {
        'family' : 'Roboto',
        'weight' : 'light',
        'size'   : int(fontsize)
    }
    matplotlib.rc('font', **font)

    plt.figure(figsize=(float(width), float(height)))

    ax = plt.subplot(111)

    for b in ['left', 'right', 'top', 'bottom']:
        if b[0] in borders:
            ax.spines[b].set_visible(True)
            ax.spines[b].set_linewidth(.6)
        else:
            ax.spines[b].set_visible(False)

    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

设置绘图基础后,我会为每个绘图单独控制其余部分。如果你必须创建相似的图并且想要在编写绘图代码时保持苗条,那么你可能想要使用其他函数来处理不同的绘图类型。

一个非常艰难的开始(远非完整)可能看起来像这样:

def plt_barchart(df, op=dict()):
    plt_setup()
    # Set options according to values in op-dict
    # (just a few exemplary settings here...)
    if 'title' in op.keys():
        plt.title(op['title'])
    plt.xticks(df['x'].values, df['labels'].values)
    # Get amount of bar groups
    ycols = [k for k in df.keys().values if k not in ['x', 'labels']]
    if 'position' in op.keys() and op['position'] == 'dodge':
        # Calculate x offset and bar width depending on group count
        barwidth = .8 / len(ycols)
    # ...

答案 1 :(得分:0)

您可以使用for循环来实现上述目标。

例如,我们假设我们有3个子图,我们需要有常见的图例,标签xscaleyscale等。

fig2 = plt.figure(figsize=(9,10))

ax1 = fig2.add_subplot(131)
ax1.scatter(data_z,data_zphot1,s=3,marker='.')
ax1.annotate(r'$0.001\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12)

ax2 = fig2.add_subplot(132)
ax2.scatter(data_z,data_zphot2,s=3,marker='.')
ax2.annotate(r'$0.005\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12)

ax3 = fig2.add_subplot(133)
ax3.scatter(data_z,data_zphot3,s=3,marker='.')
ax3.annotate(r'$0.010\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12)

for ax in [ax1,ax2,ax3]:
    ax.set_xscale('log')
    ax.legend(loc='best')
    ax.set_xlim(0.0,3.5)
    ax.set_ylim(0.0,4.5)

因此,在for循环内逐个调用所有axes,可以为所有子图实现通用模板。

如果所有3个子图都需要共同x labely label,则可以通过以下方式完成:

fig2.text(0.5,0.02,'x label here',ha='center',fontsize=22)
fig2.text(0.02,0.5,'y label here',va='center',rotation='vertical',fontsize=22)