如果第一个或最后一个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
这正常吗?在这种情况下,我应该怎么做才能得到正确的图表?(例如,如果allNone
,则为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()