我正在使用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)(错误)
答案 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并不熟悉,但必须有更好的方法来更新图表。
希望有所帮助!