带有日期的Twinx影响未来图表的x轴间隔

时间:2015-06-18 08:50:58

标签: python datetime matplotlib axes

我正在使用MatplotlibWidget创建一个GUI应用程序。根据用户在MatplotlibWidget中的选择,图形可以是:

一个。函数y1(t),其中y1是float,t是datetime,

B中。函数y1(t),y2(t)其中y2是浮点数,y2是在双轴上绘制的,或者

℃。函数y1(y2)(y1,y2浮点数,不是日期时间)

每次用户更改选择时,轴都会被清除,新图将显示在MatplotlibWidget中。

问题在于绘制B选择然后绘制C时,x轴保留了日期的间隔并添加了新的y2间隔。这导致远离y2间隔的巨大x轴间隔。当我尝试仅在主轴上绘制没有y1(t)的双胞胎y2(t)时,也会发生这种情况。

我还试图在twinx中绘制一个空数据集用于C选择,xdata与原始xaxis相同,它适用于此处提供的简单代码,但它不适用于我的原始代码..

一个想法是删除/删除twinx轴。我已经尝试了delaxes,但它仍然没有改变。

有没有想法为什么会这样,我怎么能解决这个问题呢?

谢谢!

以下是代码的更简化版本:

from datetime import datetime
import matplotlib.pyplot as plt

y1 = range(0, 10)
y2 =  range(-10, -20, -1)
t = [datetime(2015, 10, i) for i in range(1, 11)]

# Create the plot
plt.figure()
ax1 = plt.subplot(111)

# A. Plot y1(t)
ax1.plot(t, y1, 'b')
plt.xlabel('t')
plt.ylabel('y1')
plt.draw()
print 'Xaxis interval y1(t) ax1: ', ax1.get_xlim()
# plt.show()

# C. Plot y1(y2)
ax1.clear()
ax1.plot(y2, y1, 'r')
plt.gcf().autofmt_xdate()
plt.xlabel('y2')
plt.ylabel('y1')
plt.draw()
print 'Xaxis interval y1(y2) ax1:', ax1.get_xlim(), '(correct)'
# plt.show()

# B. Plot y1(t) and y2(t)
ax1.clear()
ax2 = ax1.twinx()
ax2.plot(t, y2, 'g')
ax1.plot(t, y1, 'b')
plt.xlabel('t')
plt.ylabel('y1')
ax2.set_label('y2')
plt.draw()
print 'Xaxis interval y2(t) ax1:', ax1.get_xlim()
print 'Xaxis interval y2(t) ax2: ', ax2.get_xlim()
# plt.show()


# # Plot only y2(t) in twinx
# ax1.clear()
# ax2 = ax1.twinx()
# ax2.plot(t, y2, 'g')
# plt.xlabel('t')
# ax2.set_label('y2')
# plt.draw()
# print 'Xaxis interval y2(t): ax1',ax1.get_xlim()
# print 'Xaxis interval y2(t): ax2',ax2.get_xlim()
# # plt.show()

# C. Plot y1(y2)
ax1.clear()
ax2.clear()
ax1.plot(y2, y1, 'r')
plt.xlabel('y2')
plt.ylabel('y1')
plt.draw()
print 'Xaxis interval y1(y2), ax1: ',ax1.get_xlim(), '(wrong)'
print 'Xaxis interval y1(y2) ax2: ',ax2.get_xlim(), '(wrong)'
plt.show()

结果:

  

X轴区间y1(t)ax1:(735872.0,735881.0)

     

X轴间隔y1(y2)ax1:( - 19.0,-10.0)(正确)

     

X轴区间y2(t)ax1:(735872.0,735881.0)

     

X轴区间y2(t)ax2:(735872.0,735881.0)

     

X轴间隔y1(y2),ax1:( - 100000.0,800000.0)(错误)

     

X轴间隔y1(y2)ax2:( - 100000.0,800000.0)(错误)

2 个答案:

答案 0 :(得分:1)

我发现并为我工作的一个解决方案是删除ax1和ax2并创建一个新的子图(new ax1),当我想在创建ax2并在其上绘制日期时间后绘制y1(y2)。

from datetime import datetime
import matplotlib.pyplot as plt

y1 = range(0, 10)
y2 =  range(-10, -20, -1)
t = [datetime(2015, 10, i) for i in range(1, 11)]

# Create the plot
plt.figure()
ax1 = plt.subplot(111)

# B. Plot y1(t) and y2(t)
ax1.clear()
ax2 = ax1.twinx()
ax2.plot(t, y2, 'g')
ax1.plot(t, y1, 'b')
plt.xlabel('t')
plt.ylabel('y1')
ax2.set_label('y2')
plt.draw()
print 'Xaxis interval y2(t) ax1:', ax1.get_xlim()
print 'Xaxis interval y2(t) ax2: ', ax2.get_xlim()
# plt.show()

# C. Plot y1(y2)
plt.delaxes(ax1)
plt.delaxes(ax2)
ax1 = plt.subplot(111)
ax1.plot(y2, y1, 'r')
# ax2.plot(y2, [None for i in range(len(y2))])
plt.xlabel('y2')
plt.ylabel('y1')
plt.draw()
print 'Xaxis interval y1(y2), ax1: ',ax1.get_xlim()
plt.show()

X轴区间y2(t)ax1:(735872.0,735881.0)

X轴区间y2(t)ax2:(735872.0,735881.0)

X轴间隔y1(y2),ax1:( - 19.0,-10.0)

答案 1 :(得分:0)

绘制前ax1.autoscale()ax2.autoscale()怎么样?

请记住,这会设置" autoscale"轴的属性,所以如果你在刷新数据时没有销毁它们,它应该可以正常工作。

你也可以这样做:

plt.cla() #clears axis
ax1.plot(y2,y1,'r')
ax2.plot(y2,y1,'b')
plt.axes([min(y2),max(y2), min(y1), max(y1)])

(这就像我假设你想要的那样 他开始了)

我不知道多轴对象会发生什么......

我对matplotlib并不熟悉,但必须有更好的方法来更新图表。

希望有所帮助!