У меня есть CSV-файл, который обновляет данные двух акций в реальном времени, когда открывается рынок. У меня есть несколько кодов (пример, найденный из inte rnet), который отображает цену покупки и продажи акций двух акций в двух субплотах. Программа работает нормально и выглядит так:
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,25 с (вместо того, чтобы кадр продолжал меняться вернуться к значению по умолчанию каждый раз, когда сюжет обновляется).
Однако, когда я попытался построить график в реальном времени вместе с графиком в виде прямой линии, т.е. графиком для цены одной акции и графиком для ее объема торговли, я получил некоторые ошибки. Поэтому я изменил 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)
.
Кажется, что бар принципиально отличается от сюжета, и как мне это исправить? Мое единственное требование по-прежнему заключается в том, чтобы я мог перемещаться в любом месте на графиках, пока графики обновляются.