通常当我在matplotlib中绘图时,我得到这样的图形:

您无法看到该功能,因为它会在绘图边缘上运行.
有没有办法在这些情况下自动添加一些边距,所以它们看起来像这样:

我一直在研究如何在x轴上对时间进行绘图,并对它进行了相当多的排序,有一个奇怪的怪癖让我想知道我是否遇到过一个bug或者(更可能的是)我在做什么我真的不明白.
简单地说,下面是我的程序的简化版本.如果我将它放在一个.py文件中并从解释器(ipython)执行它,我会得到一个x轴只有年份的数字,"2012",重复了很多次,就像这样.
但是,如果我注释掉手动设置xticks的行(40),即'plt.xticks(tk)'然后在执行脚本后立即在解释器中运行该确切的命令,它工作得很好,我的数字看起来像这样.
类似地,如果我只是将该行移动到脚本中的savefig命令之后也可以工作,也就是说将它放在文件的最末端.当然,在这两种情况下,只有屏幕上绘制的图形才会有所需的轴,而不是保存的文件.为什么我不能提前设置我的x轴?
感谢任何见解,提前感谢!
import matplotlib.pyplot as plt
import datetime
# define arrays for x, y and errors
x=[16.7,16.8,17.1,17.4]
y=[15,17,14,16]
e=[0.8,1.2,1.1,0.9]
xtn=[]
# convert x to datetime format
for t in x:
hours=int(t)
mins=int((t-int(t))*60)
secs=int(((t-hours)*60-mins)*60)
dt=datetime.datetime(2012,01,01,hours,mins,secs)
xtn.append(date2num(dt))
# set up plot
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
# plot
ax.errorbar(xtn,y,yerr=e,fmt='+',elinewidth=2,capsize=0,color='k',ecolor='k')
# set x axis range
ax.xaxis_date()
t0=date2num(datetime.datetime(2012,01,01,16,35)) # x axis startpoint
t1=date2num(datetime.datetime(2012,01,01,17,35)) # x axis endpoint
plt.xlim(t0,t1)
# manually set xtick values
tk=[]
tk.append(date2num(datetime.datetime(2012,01,01,16,40)))
tk.append(date2num(datetime.datetime(2012,01,01,16,50)))
tk.append(date2num(datetime.datetime(2012,01,01,17,00)))
tk.append(date2num(datetime.datetime(2012,01,01,17,10)))
tk.append(date2num(datetime.datetime(2012,01,01,17,20)))
tk.append(date2num(datetime.datetime(2012,01,01,17,30))) …Run Code Online (Sandbox Code Playgroud) 我现在正在制作许多情节,有些看起来很棒,而其他需要一些调整.从下面我怎样才能让难以看到的情节线更容易看到而无需手动绘制它们?我一次绘制50-100个这些,然后将它们添加到pdf报告中.我想在线下添加空格,例如将ylim min limit设置为-0.1,但是会自动执行.
这个很难看出情节线:

这个很容易看到情节线:

这是我的绘图代码:
def plot(chan_data):
'''Uses matplotlib to plot a channel
'''
f, ax = plt.subplots(1, figsize=(8, 2.5))
x = dffinal['time'].keys()
ax.plot(x, dffinal[chan_data].values, linewidth=0.4, color='blue')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y - %H:%M'))
ax.xaxis.set_major_locator(mdates.AutoDateLocator(interval_multiples=True))
lgd1 = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
f.autofmt_xdate()
ax.set_ylabel(dffinal[chan_data].name)
ax.grid('on')
#I've tried these with no luck
#ax.autoscale(enable=True, axis='y', tight=False)
#ax.set_ymargin(0.5)
#ax.set_autoscaley_on(True)
fname = ".\\plots\\" + chan_data + ".png"
print "Creating: " + fname
plt.savefig(fname, dpi=100, bbox_extra_artist=(lgd1,), bbox_inches='tight')
plt.close()
return fname
Run Code Online (Sandbox Code Playgroud) 我正在使用以下命令在 matplotlib/seaborn 中绘制子图:
plt.figure()
s1 = plt.subplot(2, 1, 1)
# plot 1
# call seaborn here
s2 = plt.subplot(2, 1, 2)
# plot 2
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
我遇到了标记被轴隐藏的常见问题(当绘图靠近图形边缘时添加边距)。当我尝试调整边距时,它不起作用:
s1 = plt.subplot(2, 1, 1)
s1.margins(0.05)
Run Code Online (Sandbox Code Playgroud)
它没有给出错误,但也没有设置边距。
这是一个完整的例子:
gammas = sns.load_dataset("gammas")
s = plt.subplot(1, 1, 1)
# this does not change the x margins
s.get_axes().margins(x=0.05, y=0.01)
ax = sns.tsplot(time="timepoint", value="BOLD signal",
unit="subject", condition="ROI",
err_style="ci_bars",
interpolate=False,
data=gammas)
plt.show()
Run Code Online (Sandbox Code Playgroud)
在上面,我试图使 x 边距更大,但 的x参数margins()似乎没有效果。如何才能做到这一点?