警告“使用相同的参数添加轴”和自定义绘图功能

时间:2019-03-15 15:48:20

标签: python matplotlib

我制作了一个函数,可以使直方图按照我喜欢的方式绘制(带有误差条!)。

    " WHERE (Datevalue(LNT) < Datevalue(FUMR_date) )"

这对我来说现在很完美,我可以用它在一条简单的直线上绘制出一个复杂的图

" WHERE (Datevalue(LNT) < Datevalue(now()) )"

我还可以通过在同一单元格中放置两条线来将一个图叠加在另一个图上

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=',')

我已经能够发出警告(在{{3}之后),但是这样做的代价是使我的函数无法堆叠。也就是说,函数的每次调用都会创建具有新图的新框架。我该如何摆脱这种警告,仍然能够堆积地块?

2 个答案:

答案 0 :(得分:2)

通常的方法是返回轴

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)

答案 1 :(得分:1)

每次在函数中使用ax = plt.axes()定义一个新的轴对象。如果要在同一图中绘制所有直方图,则必须传递该特定轴对象。以下是解释此问题的示例答案

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(121)

fig, ax = plt.subplots()

def histoPlot(ax):
    ax.hist(np.random.normal(0, 1, 1000), bins=100)

histoPlot(ax)
histoPlot(ax)
histoPlot(ax)
plt.show()

enter image description here