我已经创建了一个函数,使直方图以我喜欢的方式绘制(带有误差条!)。
def histoPlot(h,fmt='.',lighter_error=0.75,**kwargs):
#fig, ax = plt.subplots(1)
ax = plt.axes()
# Get the current color in the cycle #https://stackoverflow.com/questions/28779559/how-to-set-same-color-for-markers-and-lines-in-a-matplotlib-plot-loop
color = next(ax._get_lines.prop_cycler)['color']
if all(h.uncertainties != None):
# plot the error bar https://matplotlib.org/gallery/statistics/errorbar_features.html?highlight=error%20plot
ax.errorbar(u.midpoints(h.bins), h.counts, yerr=h.uncertainties,color = lighten_color(color,lighter_error),fmt=fmt )
# plot the histogram
ax.step(h.bins,np.append(h.counts,h.counts[-1:]),where='post',color=color,**kwargs)
这对我来说非常完美,我可以用它来制作简单线条的复杂情节
histoPlot(histo1,fmt=',')
我还可以通过在同一个单元格中放置两行来将一个绘图堆叠在另一个上
histoPlot(histo1,fmt=',')`
histoPlot(histo2,fmt=',')
但我收到警告
MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
warnings.warn(message, mplDeprecation, stacklevel=1)
我已经能够发出警告(跟随Matplotlib: Adding an axes using the same arguments as a previous axes),但只是以使我的功能无法堆叠为代价。也就是说,函数的每次调用都会生成一个带有新图的新框架。我怎样才能摆脱这个警告,仍能堆积我的阴谋?
通常的方法是返回轴
def histoPlot(h,fmt='.',lighter_error=0.75, ax=None, **kwargs):
#fig, ax = plt.subplots(1)
if ax is None:
ax = plt.axes()
# ...
return ax
ax = histoPlot(histo1,fmt=',')
histoPlot(histo2,fmt=',', ax=ax)