如何为每个Z值绘制具有多个X值的3D表面?

时间:2019-09-26 13:39:19

标签: python-3.x matplotlib

我有一个csv文件,其中包含以下格式的数据: Data form(持续到AskSize5)

我需要绘制一个3D曲面,其中包含时间,投标价格(Bid1,Bid2,Bid3 ...直到Bid5)及其各自的体积(BidSize1,BidSize2 ... BidSize5),但是对于每个时间值,我需要绘制所有各自的Bid1,... Bid5值及其每个体积。 (对于每个时间值Z,绘制5个X值和5个Y值)。 我试图玩3D绘图,这就是我得到的地方:

import csv
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import axes3d # To be able to use projection 3d
from datetime import datetime
import numpy as np

#Opening CSV File and fetching the rows
with open('FUTURES ORDER BOOK.csv',newline='') as csvfile:
orderBook = csv.reader(csvfile,delimiter=',')
header = next(orderBook)
data = []
for col in orderBook:         
    time1 = datetime.strptime(col[1],'%H:%M:%S.%f').time()
    bid1 = float(col[2])
    bidSize1 = int(col[3])
    ask1 = float(col[4])
    askSize1 = float(col[5])
    bid2 = float(col[6])
    bidSize2 = int(col[7])
    ask2 = float(col[8])
    askSize2 = int(col[9])
    bid3 = float(col[10])
    bidSize3 = int(col[11])
    ask3 = float(col[12])
    askSize3 = int(col[13])
    bid4 = float(col[14])
    bidSize4 = int(col[15])
    ask4 = float(col[16])
    askSize4 = int(col[17])
    bid5 = float(col[18])
    bidSize5 = int(col[19])
    ask5 = float(col[20])
    askSize5 = int(col[21])
    data.append([time1,bid1,bidSize1,ask1,askSize1,bid2,bidSize2,
                ask2,askSize2,bid3,bidSize3,ask3,askSize3,bid4,bidSize4,ask4,askSize4,bid5,bidSize5,ask5,askSize5])


timeAxis = []
bidDepth = []
askDepth = []
bidVDepth = []
askVDepth = []

bid1P = []
bid1V = []
bid2P = []
bid2V = []
bid3P = []
bid3V = []
bid4P = []
bid4V = []
bid5P = []
bid5V = []

ask1P = []
ask1V = []
ask2P = []
ask2V = []
ask3P = []
ask3V = []
ask4P = []
ask4V = []
ask5P = []
ask5V = []

#Fetching the required data from csv
for row in data:
    timeAxis.append(row[:][0])
    bid1P.append(row[:][1])
    bid1V.append(row[:][2])
    bid2P.append(row[:][5])
    bid2V.append(row[:][6])
    bid3P.append(row[:][9])
    bid3V.append(row[:][10])
    bid4P.append(row[:][13])
    bid4V.append(row[:][14])
    bid5P.append(row[:][17])
    bid5V.append(row[:][18])

    bidDepth.append(row[1])
    bidDepth.append(row[5])
    bidDepth.append(row[9])
    bidDepth.append(row[13])
    bidDepth.append(row[17])

    bidVDepth.append(row[2])
    bidVDepth.append(row[6])
    bidVDepth.append(row[10])
    bidVDepth.append(row[14])
    bidVDepth.append(row[18])

    askDepth.append(row[3])
    askDepth.append(row[7])
    askDepth.append(row[11])
    askDepth.append(row[15])
    askDepth.append(row[19])

    askVDepth.append(row[4])
    askVDepth.append(row[8])
    askVDepth.append(row[12])
    askVDepth.append(row[16])
    askVDepth.append(row[20])

    ask1P.append(row[:][3])
    ask1V.append(row[:][4])
    ask2P.append(row[:][7])
    ask2V.append(row[:][8])
    ask3P.append(row[:][11])
    ask3V.append(row[:][12])
    ask4P.append(row[:][15])
    ask4V.append(row[:][16])
    ask5P.append(row[:][19])
    ask5V.append(row[:][20])

inMinute = []
for value in timeAxis:
    inMinute.append(str(value.second) + "." + str(value.microsecond))

floatInMinute = []
for value in inMinute:
    floatInMinute.append(float(value))


print(len(floatInMinute))
print(len(bidDepth))
print(len(bidVDepth))

figBid = plt.figure(figsize = (8,8))
figAsk = plt.figure(figsize = (8,8))

ax1 = figBid.add_subplot(111,projection = '3d')
ax2 = figAsk.add_subplot(111,projection = '3d')


ax1.plot(bidDepth,floatInMinute,bidVDepth,cmap=cm.coolwarm,antialiased = False)
ax2.plot(askDepth,floatInMinute,askVDepth,cmap=cm.coolwarm,antialiased = False)



ax1.set_xlabel("Time")
ax1.set_ylabel("Bid ")
ax1.set_zlabel("Volume")


ax2.set_xlabel("Time")
ax2.set_ylabel("Ask")
ax2.set_zlabel("Volume")

发生以下错误:'ValueError:x和y必须具有相同的第一维,但形状为(135,)和(27,)',这意味着我的时间数组包含27个值,但是投标价格和数量有135个值。如何绘制这样的图?任何使该工作有效的图形都可以,不需要将其作为表面。

0 个答案:

没有答案