我有一个csv文件,可在市场开盘时实时更新两只股票的数据。我有一些代码(从互联网上找到的示例),在两个子图中绘制了两只股票的买入和卖出价。该程序运行正常,看起来像:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(ncols=1, nrows=2)
ax2 = plt.subplot(gs[1])
plt.plot([], [])
plt.plot([], [])
ax1 = plt.subplot(gs[0], sharex=ax2)
plt.plot([], [])
plt.plot([], [])
def animate(i):
data = pd.read_csv(r'C:\Users\...\Desktop\test\stock_data.csv')
x = data.index
y1 = data.bid_p_x
y2 = data.ask_p_x
y3 = data.bid_p_y
y4 = data.ask_p_y
line1, line2 = ax1.lines
line1.set_data(x, y1)
line2.set_data(x, y2)
line3, line4 = ax2.lines
line3.set_data(x, y3)
line4.set_data(x, y4)
ani = FuncAnimation(plt.gcf(), animate, interval=250)
ax1.grid(True)
ax2.grid(True)
plt.tight_layout()
plt.show()
之所以选择此代码,是因为当绘图每0.25s更新一次时,我可以在图形上的任意位置自由放大(而不是每次绘图更新时帧都会不断更改回默认值)。
但是,当我尝试绘制实时条形图和实时折线图时,也就是绘制一张股票价格的折线图和其交易量的折线图时,出现了一些错误。因此,我将plt.plot([], [])
下的plt.bar([], [])
更改为ax2 = plt.subplot(gs[1])
:
...
gs = gridspec.GridSpec(ncols=1, nrows=2)
ax2 = plt.subplot(gs[1])
plt.bar([], [])
plt.bar([], [])
ax1 = plt.subplot(gs[0], sharex=ax2)
plt.plot([], [])
plt.plot([], [])
def animate(i):
data = pd.read_csv(r'C:\Users\...\Desktop\test\stock_data.csv')
x = data.index
y1 = data.price_x
y2 = data.last_volume_x
line1, line2 = ax1.lines
line1.set_data(x, y1)
line3, line4 = ax2.lines
line3.set_data(x, y2)
ani = FuncAnimation(plt.gcf(), animate, interval=250)
ax1.grid(True)
ax2.grid(True)
plt.tight_layout()
plt.show()
...
我收到此错误:line3, line4 = ax2.lines
,ValueError: not enough values to unpack (expected 2, got 0)
。
我还尝试在定义line1
和line2
之后立即定义ax1
和ax2
:
gs = gridspec.GridSpec(ncols=1, nrows=2)
ax2 = plt.subplot(gs[1])
line2, = plt.bar([], [])
ax1 = plt.subplot(gs[0], sharex=ax2)
line1, = plt.plot([], [])
plt.plot([], [])
def animate(i):
data = pd.read_csv(r'C:\Users\...\Desktop\test\stock_data.csv')
x = data.index
y1 = data.price_x
y2 = data.last_volume_x
line1.set_data(x, y1)
line2.set_data(x, y2)
ani = FuncAnimation(plt.gcf(), animate, interval=250)
ax1.grid(True)
ax2.grid(True)
plt.tight_layout()
plt.show()
我遇到了相同的错误:line2, = plt.bar([], [])
,ValueError: not enough values to unpack (expected 1, got 0)
。
看来柱形图与情节图根本不同,该如何解决?我唯一的要求仍然是我可以在绘图更新的同时导航到绘图上的任何地方。