当我制作情节时,我总是需要设置x,ylabels,标题,图例等。逐个设置它们是单调乏味的,所以我尝试将它们放入单个辅助方法中:
SYSPROGRAMSTMTSTAT
所以它可以像
一样使用select * from sysprogramstmtstat
where STATEMENT_TEXT like '%MY_UDTF%';
我想知道是否有更优雅的方式来做到这一点? (更有效地定义xlabel,标题,然后逐个设置它们)
另外,我制作的辅助方法看起来非常复杂和冗长。无论如何只是简单吗?
答案 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个子图,我们需要有常见的图例,标签xscale
或yscale
等。
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 label
和y 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)