如果第一个或最后一个y值为NaN/None,则matplotlib会弄乱X轴。这正常吗?

如果第一个或最后一个y值为NaN/None,则matplotlib会弄乱X轴。这正常吗?,matplotlib,Matplotlib,在subplot.plot([1,2,3],[8,9,10])之后,subplot.axis()返回大致从1到3的x轴 但是在子绘图([1,2,3],[None,None,None])之后,x从0变为1 在子图([1,2,3],[8,9,None])之后,它从1变为2 这正常吗?在这种情况下,我应该怎么做才能得到正确的图表?(例如,如果allNone,则为1到3的空图表) IIUC,这是正常的,因为plt将忽略None数据。要更改限制,可以将限制设置为xaxis: def create_plot

subplot.plot([1,2,3],[8,9,10])
之后,
subplot.axis()
返回大致从1到3的x轴

但是在
子绘图([1,2,3],[None,None,None])
之后,x从0变为1

子图([1,2,3],[8,9,None])
之后,它从1变为2

这正常吗?在这种情况下,我应该怎么做才能得到正确的图表?(例如,如果all
None
,则为1到3的空图表)


IIUC,这是正常的,因为
plt
将忽略
None
数据。要更改限制,可以将限制设置为
xaxis

def create_plot(ydata):
    xvals = [1,2,3]

    fig = plt.figure()
    subplot = fig.add_subplot(1, 1, 1)
    subplot.scatter(xvals, ydata)

    # set the limit
    subplot.set_xlim(min(xvals), max(xvals))

    x1, x2, y1, y2 = subplot.axis()
    print(f"X axis goes from {x1} to {x2} when ydata={ydata}")
是的,这很正常

如果
ax.plot([1,2,3],[None,None,None])
没有要打印的数据,因此轴不会自动缩放并保持默认的
[0,1]
视图限制

如果
ax.plot([1,2,3],[8,9,None])
,则只显示
(1,8)
(2,9)
。因此,x轴范围为1到2

如果要获得相同的x轴限制(带或不带数据),可以更新数据限制

ax.update_datalim(np.c_[xdata,[0]*len(xdata)], updatey=False)
ax.autoscale()
完整示例:

import numpy as np
import matplotlib.pyplot as plt

def create_plot(ydata):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    xdata = [1, 2, 3]
    ax.scatter(xdata, ydata)
    ax.update_datalim(np.c_[xdata,[0]*len(xdata)], updatey=False)
    ax.autoscale()
    x1, x2, y1, y2 = ax.axis()
    print(f"X axis goes from {x1} to {x2} when ydata={ydata}")

create_plot([8, 9, 10])
create_plot([None, None, None])
create_plot([8, 9, None])

plt.show()

我选择这个作为公认的答案,因为它更清楚地解释了这个问题。然而@QuangHoang的答案有一个更简单的解决方案(它使用
set\uxlim()
),这就是我使用的。非常感谢两位!
import numpy as np
import matplotlib.pyplot as plt

def create_plot(ydata):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    xdata = [1, 2, 3]
    ax.scatter(xdata, ydata)
    ax.update_datalim(np.c_[xdata,[0]*len(xdata)], updatey=False)
    ax.autoscale()
    x1, x2, y1, y2 = ax.axis()
    print(f"X axis goes from {x1} to {x2} when ydata={ydata}")

create_plot([8, 9, 10])
create_plot([None, None, None])
create_plot([8, 9, None])

plt.show()