Нарисуйте гистограмму вместе с линейным графиком - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть 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).

Кажется, что бар принципиально отличается от сюжета, и как мне это исправить? Мое единственное требование по-прежнему заключается в том, чтобы я мог перемещаться в любом месте на графиках, пока графики обновляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...