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



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

A. 函数 y1(t),其中 y1 是浮点数,t 是日期时间,

B. 函数 y1(t)、y2(t),其中 y2 为浮点数,y2 绘制在 twinx 轴上,或

C. 函数 y1(y2)

(y1, y2 浮点数,而不是日期时间)

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

问题是,当绘制 B 选择,然后绘制 C 时,xaxis 会保留日期的间隔并添加新的 y2 间隔。这导致x轴间隔与y2的区间相距甚远。当我尝试在主轴上只绘制 twinx y2(t) 而没有 y1(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)

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

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

我找到并适合我的一种解决方案是删除 ax1 和 ax2 并在创建 ax2 并在其上绘制日期时间后,当我想绘制 y1(y2) 时创建一个新的子图(新 ax1)。

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)

绘画之前ax1.autoscale()ax2.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)])

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

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

我不太熟悉 matplotlib,但一定有更好的方法来更新你的图表。

希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新